This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRV8301-69M-KIT:DRV8301-69M-KIT 上的 CAN 总线初始化错误

Guru**** 2595770 points
Other Parts Discussed in Thread: LAUNCHXL-F28069M, DRV8301-69M-KIT

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/668782/drv8301-69m-kit-can-bus-initialize-error-on-drv8301-69m-kit

器件型号:DRV8301-69M-KIT
主题中讨论的其他器件: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
//文件结束


问候语。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    在我朋友的帮助下解决了这个问题,这里是其他有类似问题的朋友的解决办法。

    我的问题根本不是关于设置、而是关于链接器文件存储器的内容、我没有很好地处理这些内容。

    在 F28069F_ram_Ink .cmd 上、我是如何解决这个问题的

    MEMORY //我的代码的第75行  

    第0页:

     begin   :origin = 0x000000,length = 0x000002  /* begin 用于"boot to SARAM"引导加载程序模式 */

     RAMM0   :origin = 0x000050、length = 0x0003B0

     RAML0_L8  :origin = 0x008000,length = 0x00B800 //片上 RAM 块 RAML0-L8。 从0x13800到0x14000为 InstaSPIN *保留

     复位   :origin = 0x3FFFC0,length = 0x000002

     FPUTABLES :origin = 0x3FD590,length = 0x0006A0 //引导 ROM 中的 FPU 表*/

     IQTABLES  :origin = 0x3FDC30,length = 0x000B50  //引导 ROM 中的 IQMath 表*

     IQTABLES2 :origin = 0x3FE780,length = 0x00008C  //引导 ROM 中的 IQMath 表*

     IQTABLES3 :origin = 0x3FE80C,length = 0x0000AA /*引导 ROM 中的 IQMath 表*/

     BootROM  :origin = 0x3FF3B0,length = 0x000C10

    第1页:

     BOOT_RSVD :origin = 0x000002,length = 0x00004E  // M0的一部分,引导 ROM 将使用此栈*/

     RAMM1   :origin = 0x000400、length = 0x000400  //片上 RAM 块 M1 *

     USB_RAM  :origin = 0x040000、length = 0x000800  // USB RAM *

     ECANA   :origin = 0x006000,length = 0x000040  /* eCAN-A 控制和状态寄存器*/

     ECANA_LAM :origin = 0x006040,length = 0x000040  // eCAN-A local acceptance masks */

     ECANA_MOTS :origin = 0x006080,length = 0x000040  // eCAN-A 消息对象时间戳*/

     ECANA_MOTO :origin = 0x0060C0,length = 0x000040  // eCAN-A 对象超时寄存器*/

     ECANA_MBOX :origin = 0x006100,length = 0x000100  // eCAN-A Milbox */


    部分

    /*"引导至 SARAM"模式的设置:
    codestart 段(可在 DSP28_CodeStartBranch.asm 中找到)
    将执行重定向到用户代码的开始。 *
    codestart:> begin,page = 0
    ramfuncs:>RAMM0,
    load_start (_RamfuncsLoadStart)、
    load_end (_RamfuncsLoadEnd)、
    run_start (_RamfuncsRunStart)、
    load_size (_RamfuncsLoadSize)、
    PAGE = 0
    .text:> RAML0_L8,page = 0
    .cinit:> RAMM0,page = 0
    .pinit:> RAMM0,page = 0
    switch:>RAMM0,page = 0
    .reset:> reset,page = 0,type = DSECT //未使用,*/

    .stack:>RAMM1,PAGE = 1.
    .ebss:> RAML0_L8,PAGE = 0
    econst:>RAML0_L8,page = 0
    .esysmem:>RAML0_L8,page = 0

    graph_data:> RAML0_L8,page = 0

    IQMath:> RAML0_L8,page = 0
    IQmathTables :>IQTABLES,PAGE = 0,TYPE = NOLOAD

    /*分配 FPU 数学区域:*/
    FPUmathTables:> FPUTABLES,PAGE = 0,TYPE = NOLOAD

    ECanaRegsFile:> ECANA,PAGE = 1.                   //第137行
    ECanaLAMRegsFile:> ECANA_LAM,PAGE = 1.
    ECanaMboxesFile:> ECANA_MBOX,PAGE = 1.
    ECANaMOTSRegsFile:> ECANA_MOTS,PAGE = 1
    ECanaMOTORegsFile:> ECANA_MOTO,PAGE = 1.


    /* DMARAML4_6:> RAML4_6,PAGE = 1 /*

    /*

    *

    Cla1Prog:> RAML0_L8,page = 0
    unsecure_data:> RAML0_L8,page = 0

    刚刚在我共享的部分中添加了这些突出显示的行、仅此而已。  

    大家好。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您能够解决这个问题。 感谢您关闭该帖子。