一,前言
补充上一篇文章“TMS320F28377X芯片can通信心得笔记”,之前一直找不到清晰又压缩的方式把图片缩小
二,补充流程如图片和部分代码
带颜色 和带**号部分为中断配置
1.CAN配置部分代码
在这里插入代码片
HWREGH(ui32Base + CAN_O_CTL) = CAN_CTL_INIT;
HWREGH(ui32Base + CAN_O_CTL) = CAN_CTL_SWR;
while(HWREGH(ui32Base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY)
{
}
HWREGH(ui32Base + CAN_O_IF1CMD + 2) = (CAN_IF1CMD_DIR | CAN_IF1CMD_ARB | CAN_IF1CMD_CONTROL) >> 16;
HWREGH(ui32Base + CAN_O_IF1ARB) = 0;
HWREGH(ui32Base + CAN_O_IF1ARB + 2) = 0;
HWREGH(ui32Base + CAN_O_IF1MCTL) = 0;
HWREGH(ui32Base + CAN_O_IF1MCTL + 2) = 0;
HWREGH(ui32Base + CAN_O_IF2CMD + 2) = (CAN_IF2CMD_DIR | CAN_IF2CMD_ARB | CAN_IF2CMD_CONTROL) >> 16;
HWREGH(ui32Base + CAN_O_IF1ARB) = 0;
HWREGH(ui32Base + CAN_O_IF1ARB + 2) = 0;
HWREGH(ui32Base + CAN_O_IF1MCTL) = 0;
HWREGH(ui32Base + CAN_O_IF1MCTL + 2) = 0;
#if(RX_IE)
HWREGH(ui32Base + CAN_O_IF1MCTL) =HWREGH(ui32Base + CAN_O_IF1MCTL) | CAN_IF1MCTL_RXIE;
#elif(TX_IE)
HWREGH(ui32Base + CAN_O_IF1MCTL) =HWREGH(ui32Base + CAN_O_IF1MCTL) | CAN_IF1MCTL_TXIE;
#endif
for(iMsg = 1; iMsg <= 32; iMsg+=2)
{
while(HWREGH(ui32Base + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY)
{
}
HWREGH(ui32Base + CAN_O_IF1CMD) = iMsg & 0xff;
while(HWREGH(ui32Base + CAN_O_IF2CMD) & CAN_IF2CMD_BUSY)
{
}
HWREGH(ui32Base + CAN_O_IF2CMD) = (iMsg + 1) & 0xff;
}
EALLOW;
switch(ui32Base)
{
case CANA_BASE:
ClkCfgRegs.CLKSRCCTL2.bit.CANABCLKSEL = 0;
break;
case CANB_BASE:
ClkCfgRegs.CLKSRCCTL2.bit.CANBBCLKSEL = 0;
break;
default:
break;
}
EDIS;
CANBitRateSet(CANB_BASE, 200000000, 1000000);
HWREGH(ui32Base + CAN_O_CTL) = HWREGH(ui32Base + CAN_O_CTL) | (CAN_CTL_ABO | CAN_CTL_INIT | CAN_CTL_CCE);
HWREG_BP(ui32Base + CAN_O_CTL) = ((HWREG_BP(ui32Base + CAN_O_CTL) | (CAN_CTL_INIT | CAN_CTL_CCE)) &
~(CAN_CTL_INIT | CAN_CTL_CCE));
HWREG_BP(ui32Base + CAN_O_CTL) =(HWREG_BP(ui32Base + CAN_O_CTL) | (CAN_CTL_IE0 | CAN_CTL_EIE)) &
~(CAN_CTL_IE0 | CAN_CTL_EIE);
#define CAN_CTL_INIT 0x1U
#define CAN_CTL_IE0 0x2U
#define CAN_CTL_SIE 0x4U
#define CAN_CTL_EIE 0x8U
#define CAN_CTL_DAR 0x20U
#define CAN_CTL_CCE 0x40U
#define CAN_CTL_TEST 0x80U
#define CAN_CTL_IDS 0x100U
#define CAN_CTL_ABO 0x200U
#define CAN_CTL_PMD_S 10U
#define CAN_CTL_PMD_M 0x3C00U
#define CAN_CTL_SWR 0x8000U
#define CAN_CTL_INITDBG 0x10000U
#define CAN_CTL_IE1 0x20000U
2.CAN中断配置代码
DINT;
InitPieCtrl();
IER=0x0000;
IFR=0x0000;
InitPieVectTable();
while(HWREGH(CANB_BASE + CAN_O_IF1CMD) & CAN_IF1CMD_BUSY)
{
}
HWREGH(CANB_BASE + CAN_O_CTL) |= (CAN_CTL_INIT | CAN_CTL_CCE);
HWREG_BP(CANB_BASE + CAN_O_CTL) | = CAN_CTL_IE0 ;
CanbRegs.CAN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1;
HWREG_BP(CANB_BASE + CAN_O_GLB_INT_EN ) = CAN_GLB_INT_EN_GLBINT0_EN;
EALLOW;
PieVectTable.CANB0_INT = &IntHandler;
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx7 = 1;
IER |= 0x0100;
EINT;
3.CAN邮箱建立
CAN_Setup_Msg_Obj(&CanbRegs, 17, EXT_ID, TEST_CAN_CONNECT_RX_ID_1, Len_8, MSG_OBJ_RECEIVE);
CAN_Setup_Msg_Obj(&CanbRegs, 18, EXT_ID, TEST_CAN_CONNECT_RX_ID_2, Len_8, MSG_OBJ_RECEIVE);
仅仅做参考,Ti 提供有相应的函数可以拿来用
4.CAN中断注意部分
Uint16 Status;
Status = CanbRegs.CAN_INT.bit.INT0ID;
CanbRegs.CAN_GLB_INT_CLR.bit.INT0_FLG_CLR = 1;
if(Status == 0x8000)
{
Status = CanbRegs.CAN_ES.all;
}
PieCtrlRegs.PIEACK.all = PIEACK_GROUP9;
以上仅是我个人心得,可能不是很适合新人,你还是得翻阅下Ti 提供的技术文件can模块的和 中断相关的(去官网上下)《TMS320F2837xD Dual-Core Microcontrollers Technical Reference Manual》 F2837xD和F2837xS的CAN模块是一样的模式结构, 你若是用的F2837xS你也还是要去下该芯片的技术文件。谢谢
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)