主题中讨论的其他器件:LAUNCHXL-F28069M、
大家好、我已经获得了 LAUNCHXL-f28069M launchpad 和 DRV8301-69M-KIT、并且我 已经成功初始化并在多个 LaunchPad 上使用了 CAN 总线、但似乎我无法将相同的代码用于 DRV8301-69M 套件。
我已经阅读了表单上的所有相关帖子、但无法解决我的问题、 我面临的问题是 CANES.CCE 位未在初始化 CAN 函数中设置、
我在 launchpad 上进行了调试、并看到当 代码启用 CAN 时钟在线路上时、canes.CCE 位会将自身设置为1
SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=1;// eCAN-A
完成此设置后、Launchpad 激活 CAN GPIO 引脚并初始化 CAN、
这是我在 DRV8301-69M 套件上尝试的代码。
在 函数 HAL_setParams (halHandle、&gUserParams)的行中;
//-
ı 通过以下方式设置 CANCLOCK:
HAL_setupPeripheralClks (句柄);-->
asm (" EALLOW");
clk_enableEcanaClock (obj->clkHandle);
asm (" EDIS");
//--
之后是 HAL_setupGpios (handle);函数 I 通过设置 GPIO;
ENABLE_PROTECTED 寄存器_WRITE_MODE;
GPIO_setPullup (obj->gpioHandle、GPIO_Number_30、GPIO_Pullup_Enable);
GPIO_setPullup (obj->gpioHandle、GPIO_Number_31、GPIO_Pullup_Enable);
GPIO_setQualification (obj->gpioHandle、GPIO_Number_30、GPIO_Qual_异 步);
GPIO_setMode (obj->gpioHandle、GPIO_Number_30、GPIO_30_Mode_CANRXA);
GPIO_setMode (obj->gpioHandle、GPIO_Number_31、GPIO_31_Mode_CANTXA);
disable_protected_register_write_mode;
//-
这里是我尝试在这里初始化 CAN 总线的主代码
秘书长的报告
//包括
//系统包括
#include
//模块
#include "sw/modules/math/src/32b/math.h"
#include "sw/modules/Memcopy/src/Memcopy.h"
//驱动程序
//平台
#include "main.h"
//
//定义
#define LED_BLINK FREQ_Hz 5
#define ECANA
//*********
//全局
变量#pragma DATA_SECTION (ECANaRegs、"ECANaRegsFile");
volatile struct ECAN_regs ECANaRegs;
#pragma DATA_SECTION (ECANaMboxes、"ECANaMboxesFile");
volatile struct ECAN_MBOXES egaMboxes;
ut = 32_Dcnt;ut = t_dlet = 32; //用于对 ISR 速率进行分频的计数器,用于直观地使 LED
uint_least32_t gLEDcnt1 = 0; //用于对 ISR 速率进行分频以直观地使 LED 闪烁
的计数器//
Globals
//
#ifdef csm_enable
#pragma DATA_SECTION (halHandle、"rom_accessed_data");
#endif
HAL_handle halHandle; //逆变器硬件抽象层
#ifdef csm_enable
#pragma DATA_SECTION (gUserParams、"rom_accessed_data");
#endif
USER_Params gUserParams; //包含 user.h 设置
HAL_PwmData_t gPwmData ={0、0、0}; //包含全局 Q 格式 HAL_AdcData_t
gAdcData ={0、0、0、0、0、0、0}的 PWM 占空比; //包含全局 Q 格式的电流和电压 ADC 读数
volatile motor_Vars_t gMotorVars = motor_Vars_init;
volatile uint32_t temperature = 0;
#ifdef flash
//用于在闪存中运行后台,以及在 RAM
中运行 ISR extern uint16_t * ramfuncseconeconEnd、* ramfuncs_start
、* ramfuncs_tr_uncsm_start、*exuintn_truncsm_switch * ext、*exuintn_trunift_start、*exuintn_uncsm_switch
*switch_ram_load;
#endif
#endif
#ifdef DRV8301_SPI
//观察窗口接口连接到8301 SPI
DRV_SPI_8301_Vars_t gDrv8301Vars;
#endif
//秘书长
//函数
void main (void)
{
struct eCAN-regs ECanaShadow;
//仅在从闪存运行时使用
//请注意变量闪存由项目
#ifdef 闪存定义
//将时间关键代码和闪存设置代码复制到 RAM
// RamfuncsLoadStart、RamfuncsLoadEnd 和 RamfuncsRunStart
//符号由链接器创建。 请参阅链接器文件。
Memcopy ((uint16_t *)&RamfuncsLoadStart、(uint16_t *)&RamfuncsLoadEnd、(uint16_t *)&RamfuncsRunStart);
#ifdef csm_enable
//copy .econst 至 unsecure RAM
if (* econst_end -* econst_start)
{
Memcopy ((uint16_t *)&econst_start、(uint16_t *)&econst_end、(uint16_t *)&econst_ram_load);
}
//copy .switch ot unsecure RAM
if (* switch_end -* switch_start)
{
Memcopy ((uint16_t *)&switch_start、(uint16_t *)&switch_end、(uint16_t *)&switch_ram_load);
}
#endif
#endif
//初始化硬件抽象层
halHandle = HAL_init (&hal、sizeof (hal));
//检查用户参数
USER_CHECKForErrors (&gUserParams)中的错误;
//将用户参数错误存储在全局变量
gMotorVars.UserCode = USER_getCode (&gUserErrorForErrors)中;//
如果不允许执行
MotorErrorCode (&gUserErrorCode)/User ErrorCode!
{
for (;;)
{
gMotorVars.Flag_enableSys = false;
}
}
//初始化用户参数
user_setParams (&gUserParams);
//设置硬件抽象层参数
HAL_setParams (halHandle、&gUserParams); //在此行程序中、设置的 CAN 时钟优先于设置 CAN GPIO
#ifdef ECANA
EALLOW; // EALLOW 启用对受保护位的访问
ECanaShady.CANTIOC.ALL = ECanaRegs.CANTIOC.ALL;
ECanaShady.CANTIOC.bit.TXFUNC = 1;
ECANaRegs.CANTIOC.ALL = ECANaShady.CANTIOC.ALL;
ECanaShady.CANRIOC.ALL = ECanaRegs.CANRIOC.ALL;
ECanaShady.CANRIOC.bit.RXFUNC = 1;
ECANaRegs.CANRIOC.ALL = ECANaShady.CANRIOC.ALL;
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShading.CANMC.bit.SCB = 1;
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
ECANaMboxs.MBOX0.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX1.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX16.MSGCTRL.ALL = 0x00000000;
ECANaMboxs.MBOX17.MSGCTRL.ALL = 0x00000000;
ECANARegs.CANTA.ALL = 0xFFFFFFFF;//清除所有 Tan 位
ECANaRegs.CANRMP.ALL = 0xFFFFFFFF;//清除所有 RMPn 位
ECANaRegs.CANGIF0.ALL = 0xFFFFFFFF;//清除所有中断标志位
ECANaRegs.CANGIF1.ALL = 0xFFFFFFFF;
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShading.CANMC.bit.CCR = 1; //设置 CCR = 1
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
操作
{ //此处代码不移动,CANES.CCE 未设置
ECanaShady.canes.all = ECanaRegs.canes.all;
} while (ECanaShading.canes.bit.CCE!= 1);//等待 CCE 位被置位
ECanaShady.CANBTC.ALL = 0;
//以下块用于80MHz SYSCLKOUT。
//(40MHz CAN 模块时钟位速率= 1Mbps)
ECanaShady.CANBTC.bit.BRPREG = 1;
ECANaShady.CANBTC.bit.TSEG2REG = 4;
ECANaShady.CANBTC.bit.TSEG1REG = 13;
ECANaRegs.CANBTC.ALL = ECANaShady.CANBTC.ALL;
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECanaShading.CANMC.bit.CCR = 0; //设置 CCR = 0
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
操作
{
ECanaShady.canes.all = ECanaRegs.canes.all;
} while (ECanaShading.canes.bit.CCE!= 0);//等待 CCE 位被清除
ECANaRegs.CANME.ALL = 0; //在写入 MSGID 之前需要
EDIS;
ECANaMboxs.MBOX0.MSGID.ALL = 0x9555AAA1;
ECANaMboxs.MBOX1.MSGID.ALL = 0x9555AAA2;
ECANaMboxs.MBOX16.MSGID.ALL = 0x9555AAA0;
ECANaMboxs.MBOX17.MSGID.ALL = 0x9555AAA3;
ECANaMboxs.MBOX0.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX1.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX16.MSGCTRL.bit.DLC = 8;
ECANaMboxs.MBOX17.MSGCTRL.bit.DLC = 8;
ECANaRegs.CANMD.ALL = 0xFFFFFF0000;
ECANaRegs.CANME.ALL = 0xFFFFFFFF;
EALLOW;
ECANaRegs.CANMIM.ALL = 0xFFFFFFFF;
ECanaShady.CANMC.ALL = ECanaRegs.CANMC.ALL;
ECANaShady.CANMC.bit.STM = 0;//将 CAN 配置为自检模式
ECanaRegs.CANMC.ALL = ECanaShadure.CANMC.ALL;
EDIS;
#endif
//设置故障
HAL_setupFaults (halHandle);
//初始化中断矢量表
HAL_initIntVectorTable (halHandle);
//启用 ADC 中断
HAL_enableAdcInts (halHandle);
//启用全局中断 HAL_enableIntVHands
(halHandle);
//启用
全局中断 HAL_enableV8301 (
halt);//禁用 veDRV301 (half Vdle)
;//启用 v8301 (halt) veSpinvolt (halt veDRV8301)
#endif
#ifdef DRV8305_SPI
//打开 DRV8305 (如果存在
) HAL_enableDrv (halHandle);
//初始化 DRV8305接口
HAL_setupDrvSpi (halHandle、&gDrv830Spi5Vars);
#endif
test++;
// for ever,
for loop Count=0;{=0
LoopCount++;
}
中断无效 mainISR (void)
{
// int j=0;
int k=0;
if (gLEDcnt++>(uint_least32_t)(USER_ISR_FREQ_Hz / LED_BLINK FREQ_Hz)
{
HAL_TOGLELed (halHandle、(GPIO_Number_e) HAL_GPIO_LED2);
gLEDcnt++;
}
HAL_acqAdcInt (halHandle、ADC_IntNumber_1);
HAL_readAdcData (halHandle、&gAdcData);
HAL_writePwmData (halHandle、&gPwmData);*/
return;
}// mainISR ()结束函数
//@}// defgroup
//文件结束
问候语。