问题:配置CAN后,发送过一帧CAN数据后,检测CANTX引脚持续不断发送该数据间隔时间240us左右
仿真器查看:ECanaRegs.CANES.bit.Tm=1
ECanaRegs.CANTEC.all =128
,请问可能什么配置原因造成的?
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.
问题:配置CAN后,发送过一帧CAN数据后,检测CANTX引脚持续不断发送该数据间隔时间240us左右
仿真器查看:ECanaRegs.CANES.bit.Tm=1
ECanaRegs.CANTEC.all =128
,请问可能什么配置原因造成的?
void CO_SetupCAN(void) //初始化
{
struct ECAN_REGS ECanaShadow;
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.all = 0; //不使能邮箱
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
/* Setup CAN bus */
EALLOW; // EALLOW enables access to protected bits
/* Configure eCAN RX and TX pins for eCAN transmissions using eCAN regs*/
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANTIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
/* Configure eCAN for HECC mode - (reqd to access mailboxes 16 thru 31) */
// HECC mode also enables time-stamping feature
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.SCB = 1; //
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
/* Initialize all bits of 'Master Control Field' to zero */
ECanaMboxes.MBOX0.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX1.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX2.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX3.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX4.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX5.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX6.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX7.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX8.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX9.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX10.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX11.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX12.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX13.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX14.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX15.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX16.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX17.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX18.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX19.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX20.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX21.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX22.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX23.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX24.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX25.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX26.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX27.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX28.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX29.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX30.MSGCTRL.all = 0x00000000;
ECanaMboxes.MBOX31.MSGCTRL.all = 0x00000000;
// TAn, RMPn, GIFn bits are all zero upon reset and are cleared again
// as a matter of precaution.
ECanaRegs.CANTA.all = 0xFFFFFFFF; /* Clear all TAn bits 清除所有邮箱的发送成功标志*/
ECanaRegs.CANRMP.all = 0xFFFFFFFF; /* Clear all RMPn bits 清除所有邮箱的接收成功标志*/
ECanaRegs.CANGIF0.all = 0xFFFFFFFF; /* Clear all interrupt flag bits 清除所有中断标志*/
ECanaRegs.CANGIF1.all = 0xFFFFFFFF; /* Clear all interrupt flag bits 清除所有中断标志*/
/* Configure bit timing parameters for ECana*/
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1 ; // Set CCR = 1 waiting CCE bit to be set
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
while(ECanaRegs.CANES.bit.CCE != 1 ) {} // Wait for CCE bit to be set..
ECanaShadow.CANBTC.all = 0;
ECanaShadow.CANBTC.bit.BRPREG = CO_BitRateData[Rompara_A08->CANBaud].BRP;
ECanaShadow.CANBTC.bit.TSEG1REG = CO_BitRateData[Rompara_A08->CANBaud].TSeg1;
ECanaShadow.CANBTC.bit.TSEG2REG = CO_BitRateData[Rompara_A08->CANBaud].TSeg2;
if(((Rompara_A08->CANBaud)&0x000F) >= 2)
{
ECanaShadow.CANBTC.bit.SAM = 0;///////
ECanaShadow.CANBTC.bit.SJWREG = 3;
}
else
{
ECanaShadow.CANBTC.bit.SAM = 1;///////
ECanaShadow.CANBTC.bit.SJWREG = 3;
}
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANGAM.all = ECanaRegs.CANGAM.all;
ECanaShadow.CANGAM.bit.AMI = 1; //标准帧和扩展帧,扩展帧29bit全部存放在MSGID作为标识
ECanaRegs.CANGAM.all = ECanaShadow.CANGAM.all;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0 ; // Set CCR = 0
ECanaShadow.CANMC.bit.ABO = 1 ; // bus open
ECanaShadow.CANMC.bit.DBO = 1 ; // CAN先发送低字节,在发送高字节
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
while(ECanaRegs.CANES.bit.CCE == !0 ) {} // Wait for CCE bit to be cleared..
/* Disable all Mailboxes */
// ECanaRegs.CANME.all = 0; // Required before writing the MSGIDs
EDIS;
//init rx mail 接收邮箱配置16~31为接收邮箱
EALLOW;
/***********************************************************************/
/* NMT: mailbox 16; */
/* SYNC: mailbox 17; */
/* RPDO0: mailbox 18; */
/* RPDO1: mailbox 19; */
/* RPDO2: mailbox 20; */
/* RPDO3: mailbox 21; */
/* SDO: mailbox 22; */
/* LIFE: mailbox 23; */
/***********************************************************************/
ECanaShadow.CANMD.all = ECanaRegs.CANMD.all;
ECanaShadow.CANMD.all |= 0xFFFF0000; // MBOX16~31 is recieve_box
ECanaRegs.CANMD.all = ECanaShadow.CANMD.all;
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.all = 0x00000000; // MBOX16~31 is disabled
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
//接收字节数据判断
if(Rompara_A08->CANRx1ADDR4!=0)
{
CO_RXCAN[16].NoOfBytes=8;
}
else if(Rompara_A08->CANRx1ADDR3!=0)
{
CO_RXCAN[16].NoOfBytes=6;
}
else if(Rompara_A08->CANRx1ADDR2!=0)
{
CO_RXCAN[16].NoOfBytes=4;
}
else if(Rompara_A08->CANRx1ADDR1!=0)
{
CO_RXCAN[16].NoOfBytes=2;
}
else
{
CO_RXCAN[16].NoOfBytes=0;
}
if(Rompara_A08->CANRx2ADDR4!=0)
{
CO_RXCAN[17].NoOfBytes=8;
}
else if(Rompara_A08->CANRx2ADDR3!=0)
{
CO_RXCAN[17].NoOfBytes=6;
}
else if(Rompara_A08->CANRx2ADDR2!=0)
{
CO_RXCAN[17].NoOfBytes=4;
}
else if(Rompara_A08->CANRx2ADDR1!=0)
{
CO_RXCAN[17].NoOfBytes=2;
}
else
{
CO_RXCAN[17].NoOfBytes=0;
}
//接收字节数据判断
if(Rompara_A08->CANRx3ADDR4!=0)
{
CO_RXCAN[18].NoOfBytes=8;
}
else if(Rompara_A08->CANRx3ADDR3!=0)
{
CO_RXCAN[18].NoOfBytes=6;
}
else if(Rompara_A08->CANRx3ADDR2!=0)
{
CO_RXCAN[18].NoOfBytes=4;
}
else if(Rompara_A08->CANRx3ADDR1!=0)
{
CO_RXCAN[18].NoOfBytes=2;
}
else
{
CO_RXCAN[18].NoOfBytes=0;
}
//接收字节数据判断
if(Rompara_A08->CANRx4ADDR4!=0)
{
CO_RXCAN[19].NoOfBytes=8;
}
else if(Rompara_A08->CANRx4ADDR3!=0)
{
CO_RXCAN[19].NoOfBytes=6;
}
else if(Rompara_A08->CANRx4ADDR2!=0)
{
CO_RXCAN[19].NoOfBytes=4;
}
else if(Rompara_A08->CANRx4ADDR1!=0)
{
CO_RXCAN[19].NoOfBytes=2;
}
else
{
CO_RXCAN[19].NoOfBytes=0;
}
//发送配置
if(Rompara_A08->CANTx1ADDR4!=0)
{
CO_TXCAN[0].NoOfBytes=8;
}
else if(Rompara_A08->CANTx1ADDR3!=0)
{
CO_TXCAN[0].NoOfBytes=6;
}
else if(Rompara_A08->CANTx1ADDR2!=0)
{
CO_TXCAN[0].NoOfBytes=4;
}
else if(Rompara_A08->CANTx1ADDR1!=0)
{
CO_TXCAN[0].NoOfBytes=2;
}
else
{
CO_TXCAN[0].NoOfBytes=0;
}
if(Rompara_A08->CANTx2ADDR4!=0)
{
CO_TXCAN[1].NoOfBytes=8;
}
else if(Rompara_A08->CANTx2ADDR3!=0)
{
CO_TXCAN[1].NoOfBytes=6;
}
else if(Rompara_A08->CANTx2ADDR2!=0)
{
CO_TXCAN[1].NoOfBytes=4;
}
else if(Rompara_A08->CANTx2ADDR1!=0)
{
CO_TXCAN[1].NoOfBytes=2;
}
else
{
CO_TXCAN[1].NoOfBytes=0;
}
if(Rompara_A08->CANTx3ADDR4!=0)
{
CO_TXCAN[2].NoOfBytes=8;
}
else if(Rompara_A08->CANTx3ADDR3!=0)
{
CO_TXCAN[2].NoOfBytes=6;
}
else if(Rompara_A08->CANTx3ADDR2!=0)
{
CO_TXCAN[2].NoOfBytes=4;
}
else if(Rompara_A08->CANTx3ADDR1!=0)
{
CO_TXCAN[2].NoOfBytes=2;
}
else
{
CO_TXCAN[2].NoOfBytes=0;
}
if(Rompara_A08->CANTx4ADDR4!=0)
{
CO_TXCAN[3].NoOfBytes=8;
}
else if(Rompara_A08->CANTx4ADDR3!=0)
{
CO_TXCAN[3].NoOfBytes=6;
}
else if(Rompara_A08->CANTx4ADDR2!=0)
{
CO_TXCAN[3].NoOfBytes=4;
}
else if(Rompara_A08->CANTx4ADDR1!=0)
{
CO_TXCAN[3].NoOfBytes=2;
}
else
{
CO_TXCAN[3].NoOfBytes=0;
}
ECanaRegs.CANME.all = 0; // Required before writing the MSGIDs
if(Rompara_A08->CANRx1IdL!=0 ||Rompara_A08->CANRx1IdH!=0)
{
ECanaMboxes.MBOX16.MSGID.bit.IDE = 1; // 0标准帧 1:扩展帧
ECanaMboxes.MBOX16.MSGID.bit.AME = 1;
ECanaMboxes.MBOX16.MSGID.bit.AAM = 0;
ECanaMboxes.MBOX16.MSGID.bit.EXTMSGID_L =Rompara_A08->CANRx1IdL; //bit0~bit15; A08.06~A08.07
ECanaMboxes.MBOX16.MSGID.bit.EXTMSGID_H =(Rompara_A08->CANRx1IdH & 0x0003); //bit16~bit17;
ECanaMboxes.MBOX16.MSGID.bit.STDMSGID =((Rompara_A08->CANRx1IdH>>2) & 0x3F);//bit18 ~bit28;
}
if(Rompara_A08->CANRx2IdL!=0 ||Rompara_A08->CANRx2IdH!=0)
{
ECanaMboxes.MBOX17.MSGID.bit.IDE = 1; // 0标准帧 1:扩展帧
ECanaMboxes.MBOX17.MSGID.bit.AME = 1;
ECanaMboxes.MBOX17.MSGID.bit.AAM = 0;
ECanaMboxes.MBOX17.MSGID.bit.EXTMSGID_L =Rompara_A08->CANRx2IdL; //bit0~bit15; A08.12~A08.13
ECanaMboxes.MBOX17.MSGID.bit.EXTMSGID_H =(Rompara_A08->CANRx2IdH & 0x0003); //bit16~bit17;
ECanaMboxes.MBOX17.MSGID.bit.STDMSGID =((Rompara_A08->CANRx2IdH>>2) & 0x3F);//bit18 ~bit28;
}
if(Rompara_A08->CANRx3IdL!=0 ||Rompara_A08->CANRx3IdH!=0)
{
ECanaMboxes.MBOX18.MSGID.bit.IDE = 1; // 0标准帧 1:扩展帧
ECanaMboxes.MBOX18.MSGID.bit.AME = 1;
ECanaMboxes.MBOX18.MSGID.bit.AAM = 0;
ECanaMboxes.MBOX18.MSGID.bit.EXTMSGID_L =Rompara_A08->CANRx3IdL; //bit0~bit15; A08.18~A08.19
ECanaMboxes.MBOX18.MSGID.bit.EXTMSGID_H =(Rompara_A08->CANRx3IdH & 0x0003); //bit16~bit17;
ECanaMboxes.MBOX18.MSGID.bit.STDMSGID =((Rompara_A08->CANRx3IdH>>2) & 0x3F);//bit18 ~bit28;
}
if(Rompara_A08->CANRx4IdL!=0 ||Rompara_A08->CANRx4IdH!=0)
{
ECanaMboxes.MBOX19.MSGID.bit.IDE = 1; // 0标准帧 1:扩展帧
ECanaMboxes.MBOX19.MSGID.bit.AME = 1;
ECanaMboxes.MBOX19.MSGID.bit.AAM = 0;
ECanaMboxes.MBOX19.MSGID.bit.EXTMSGID_L =Rompara_A08->CANRx4IdL; //bit0~bit15; A08.24~A08.25
ECanaMboxes.MBOX19.MSGID.bit.EXTMSGID_H =(Rompara_A08->CANRx4IdH & 0x0003); //bit16~bit17;
ECanaMboxes.MBOX19.MSGID.bit.STDMSGID =((Rompara_A08->CANRx4IdH>>2) & 0x3F);//bit18 ~bit28;
}
//发送邮箱配置
if(Rompara_A08->CANTx1IdL!=0 ||Rompara_A08->CANTx1IdH!=0)
{
ECanaMboxes.MBOX0.MSGCTRL.bit.DLC =CO_TXCAN[0].NoOfBytes;
ECanaMboxes.MBOX0.MSGID.bit.EXTMSGID_L=Rompara_A08->CANTx1IdL; //bit0~bit15 A08.30~A08.31
ECanaMboxes.MBOX0.MSGID.bit.EXTMSGID_H =(Rompara_A08->CANTx1IdH & 0x0003); //bit16~bit17
ECanaMboxes.MBOX0.MSGID.bit.STDMSGID =((Rompara_A08->CANTx1IdH>>2) & 0x3F);//bit18 ~bit28
}
if(Rompara_A08->CANTx2IdL!=0 ||Rompara_A08->CANTx2IdH!=0)
{
ECanaMboxes.MBOX1.MSGCTRL.bit.DLC =CO_TXCAN[1].NoOfBytes;
ECanaMboxes.MBOX1.MSGID.bit.EXTMSGID_L=Rompara_A08->CANTx2IdL; //bit0~bit15 A08.36~A08.37
ECanaMboxes.MBOX1.MSGID.bit.EXTMSGID_H =(Rompara_A08->CANTx2IdH & 0x0003); //bit16~bit17
ECanaMboxes.MBOX1.MSGID.bit.STDMSGID =((Rompara_A08->CANTx2IdH>>2) & 0x3F);//bit18 ~bit28
}
if(Rompara_A08->CANTx3IdL!=0 ||Rompara_A08->CANTx3IdH!=0)
{
ECanaMboxes.MBOX2.MSGCTRL.bit.DLC =CO_TXCAN[2].NoOfBytes;
ECanaMboxes.MBOX2.MSGID.bit.EXTMSGID_L=Rompara_A08->CANTx3IdL; //bit0~bit15 A08.42~A08.43
ECanaMboxes.MBOX2.MSGID.bit.EXTMSGID_H =(Rompara_A08->CANTx3IdH & 0x0003); //bit16~bit17
ECanaMboxes.MBOX2.MSGID.bit.STDMSGID =((Rompara_A08->CANTx3IdH>>2) & 0x3F);//bit18 ~bit28
}
if(Rompara_A08->CANTx4IdL!=0 ||Rompara_A08->CANTx4IdH!=0)
{
ECanaMboxes.MBOX3.MSGCTRL.bit.DLC =CO_TXCAN[3].NoOfBytes;
ECanaMboxes.MBOX3.MSGID.bit.EXTMSGID_L=Rompara_A08->CANTx4IdL; //bit0~bit15 A08.48~A08.49
ECanaMboxes.MBOX3.MSGID.bit.EXTMSGID_H =(Rompara_A08->CANTx4IdH & 0x0003); //bit16~bit17
ECanaMboxes.MBOX3.MSGID.bit.STDMSGID =((Rompara_A08->CANTx4IdH>>2) & 0x3F);//bit18 ~bit28
}
ECanaShadow.CANME.all = ECanaRegs.CANME.all;
ECanaShadow.CANME.all = 0xFFFFFFFF; //
ECanaRegs.CANME.all = ECanaShadow.CANME.all;
// Configure CAN interrupts 在中断线1上产生邮箱邢
ECanaShadow.CANMIL.all = 0xFFFFFFFF ; // Interrupts asserted on eCAN1INT
ECanaRegs.CANMIL.all = ECanaShadow.CANMIL.all;
ECanaRegs.CANOPC.all=0;//0xFFFFFFFF; 2008-9-23
//邮箱中断屏蔽位
ECanaShadow.CANMIM.all = 0;//发送中断不打开
ECanaShadow.CANMIM.bit.MIM19 = 1; // RPDO1
ECanaShadow.CANMIM.bit.MIM18 = 1; // RPDO0
ECanaShadow.CANMIM.bit.MIM17 = 1; // RX
ECanaShadow.CANMIM.bit.MIM16 = 1; // RX
ECanaRegs.CANMIM.all = ECanaShadow.CANMIM.all;
//全局中断屏蔽寄存器
ECanaShadow.CANGIM.all=0;
ECanaShadow.CANGIM.bit.I0EN = 0; // Enable eCAN1INT
ECanaShadow.CANGIM.bit.I1EN = 1; // Disable eCAN0INT
ECanaShadow.CANGIM.bit.GIL = 1; //所有全局中断都映射到INT1中断线上
ECanaRegs.CANGIM.all = ECanaShadow.CANGIM.all;
EDIS;
//set filters
}
Uint16 CAN_BufTx(Uint16 MBXnbr, Uint8 *pData, Uint8 Size) //启动发送
{
volatile struct MBOX *Mailbox;
Mailbox = &ECanaMboxes.MBOX0 + MBXnbr;
if(Size<=8 && MBXnbr<=9)
{
if(Size==1)
{
Mailbox->MDL.byte.BYTE0 = pData[0];
}
else if(Size==2)
{
Mailbox->MDL.byte.BYTE1 = pData[1];
Mailbox->MDL.byte.BYTE2 = pData[2];
}
else if(Size==3)
{
Mailbox->MDL.byte.BYTE1 = pData[1];
Mailbox->MDL.byte.BYTE2 = pData[2];
Mailbox->MDL.byte.BYTE3 = pData[3];
}
else if(Size==4)
{
Mailbox->MDL.byte.BYTE1 = pData[1];
Mailbox->MDL.byte.BYTE2 = pData[2];
Mailbox->MDL.byte.BYTE3 = pData[3];
Mailbox->MDH.byte.BYTE4 = pData[4];
}
else if(Size==5)
{
Mailbox->MDL.byte.BYTE1 = pData[1];
Mailbox->MDL.byte.BYTE2 = pData[2];
Mailbox->MDL.byte.BYTE3 = pData[3];
Mailbox->MDH.byte.BYTE4 = pData[4];
Mailbox->MDH.byte.BYTE5 = pData[5];
}
else if(Size==6)
{
Mailbox->MDL.byte.BYTE1 = pData[1];
Mailbox->MDL.byte.BYTE2 = pData[2];
Mailbox->MDL.byte.BYTE3 = pData[3];
Mailbox->MDH.byte.BYTE4 = pData[4];
Mailbox->MDH.byte.BYTE5 = pData[5];
Mailbox->MDH.byte.BYTE6 = pData[6];
}
else if(Size==7)
{
Mailbox->MDL.byte.BYTE1 = pData[1];
Mailbox->MDL.byte.BYTE2 = pData[2];
Mailbox->MDL.byte.BYTE3 = pData[3];
Mailbox->MDH.byte.BYTE4 = pData[4];
Mailbox->MDH.byte.BYTE5 = pData[5];
Mailbox->MDH.byte.BYTE6 = pData[6];
Mailbox->MDH.byte.BYTE7 = pData[7];
}
EALLOW;
ECanaRegs.CANTRS.all = ((Uint32)0x00000001)<<MBXnbr; //启动发送
while((ECanaRegs.CANTA.all>>MBXnbr)&0x01==0x00)
{
;
}
ECanaRegs.CANTA.all=(Uint32)(0x01<<MBXnbr);
EDIS;
return 1;
}
else
{
return 0;
}
}
代码如上,问题是我发送一帧数据后,芯片TX引脚发送,可以检测到Tx引脚间隔400us重复发送该数据,TRS0一直为1
//========================================================================== // // 文件名称: F2812_CANTX.c // // 功能描述: DSP28 CAN 传输测试 // CPU Timer0 ISR周期 50 ms // 看门狗使能,在主循环中处理 // CAN 消息 : 发送一个字节的数据 // CAN通信速率: 100KBPS // 扩展标识符 : 0x1000 0000 // 使用的邮箱 :Mailbox #5 #1 // //========================================================================== #include "DSP281x_Device.h" #include "DSP281x_Examples.h" // DSP281x Examples Include File // 函数原型声明 void Gpio_select(void); void InitCan(); int RXcounter = 0; int TXcounter = 0; char CAN0RXDATA[8]; struct ECAN_REGS ECanaShadow; interrupt void CAN0INTA_ISR(void); void Mboxesinit(void); void TX_send(void); interrupt void cpu_timer0_isr(void); void main(void) { InitSysCtrl(); // Step 2. Initalize GPIO: // This example function is found in the DSP281x_Gpio.c file and // illustrates how to set the GPIO to it's default state. // InitGpio(); // Skipped for this example // Step 3. Clear all interrupts and initialize PIE vector table: // Disable CPU interrupts DINT; // Initialize PIE control registers to their default state. // The default state is all PIE interrupts disabled and flags // are cleared. // This function is found in the DSP281x_PieCtrl.c file. // InitPieCtrl(); // Skipped for this example // Disable CPU interrupts and clear all CPU interrupt flags: IER = 0x0000; IFR = 0x0000; Gpio_select(); // 配置GPIO复用功能寄存器 InitPieCtrl(); // 调用外设中断扩展初始化单元 PIE-unit ( 代码 : DSP281x_PieCtrl.c) InitPieVectTable(); // 初始化 PIE vector向量表 ( 代码 : DSP281x_PieVect.c ) EALLOW; // This is needed to write to EALLOW protected registers PieVectTable.TINT0 = &cpu_timer0_isr; EDIS; // This is needed to disable write to EALLOW protected registers // Step 4. Initialize all the Device Peripherals: // This function is found in DSP281x_InitPeripherals.c // InitPeripherals(); // Not required for this example InitCpuTimers(); // For this example, only initialize the Cpu Timers // Configure CPU-Timer 0 to interrupt every second: // 100MHz CPU Freq, 1 second Period (in uSeconds) ConfigCpuTimer(&CpuTimer0, 100, 1000000); StartCpuTimer0(); IER |= M_INT1; // Enable TINT0 in the PIE: Group 1 interrupt 7 PieCtrlRegs.PIEIER1.bit.INTx7 = 1; PieCtrlRegs.PIEIER9.bit.INTx5=1; IER|=M_INT9; EINT; ERTM; InitCan(); // 初始化CAN模块 Mboxesinit(); while(1) { ; } } void TX_send(void) { ECanaMboxes.MBOX5.MDL.all = 0x55555555; ECanaMboxes.MBOX5.MDH.all = 0x55555555; ECanaShadow.CANTRS.all = 0; ECanaShadow.CANTRS.bit.TRS5 = 1; // 设置 TRS for mailbox under test ECanaRegs.CANTRS.all = ECanaShadow.CANTRS.all; while(ECanaRegs.CANTA.bit.TA5 == 0 ) {} // 等待 TA5 bit 置位.. TXcounter++; ECanaShadow.CANTA.all = 0; ECanaShadow.CANTA.bit.TA5 = 1; // 清除 TA5 ECanaRegs.CANTA.all = ECanaShadow.CANTA.all; } void Mboxesinit(void) { /* 写消息标识符 MSGID */ ECanaMboxes.MBOX5.MSGID.all = 0x10000000; ECanaMboxes.MBOX5.MSGID.bit.IDE = 1; // 扩展标识符 /* 配置 Mailbox 5 作为发送邮箱 */ ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; ECanaShadow.CANMD.bit.MD5 = 0; ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; /* 使能邮箱 */ ECanaShadow.CANME.all = ECanaRegs.CANME.all; ECanaShadow.CANME.bit.ME5 = 1; ECanaRegs.CANME.all = ECanaShadow.CANME.all; ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 1; /********************** 4/11/2018 **********************/ /* 写消息标识符 MSGID 区 */ ECanaMboxes.MBOX1.MSGID.all = 0x10000000; // 扩展标识符 ECanaMboxes.MBOX1.MSGID.bit.IDE = 1; /* 配置邮箱1作为接收器邮箱 */ ECanaShadow.CANMD.all = ECanaRegs.CANMD.all; ECanaShadow.CANMD.bit.MD1 = 1; ECanaRegs.CANMD.all = ECanaShadow.CANMD.all; /* 使能邮箱mailbox 1 */ ECanaShadow.CANME.all = ECanaRegs.CANME.all; ECanaShadow.CANME.bit.ME1 = 1; ECanaRegs.CANME.all = ECanaShadow.CANME.all; ECanaMboxes.MBOX1.MSGCTRL.bit.DLC = 8; ECanaMboxes.MBOX1.MSGCTRL.bit.RTR = 0; /* 在消息控制寄存器中写 DLC 区 */ ECanaMboxes.MBOX5.MSGCTRL.bit.DLC = 8; /***************使能中断******************/ EALLOW; ECanaRegs.CANMIM.bit.MIM1=1; ECanaRegs.CANMIL.bit.MIL1=0; ECanaRegs.CANGIF0.all=0xFFFFFFFF; ECanaRegs.CANGIM.bit.I0EN=1; PieVectTable.ECAN0INTA= &CAN0INTA_ISR; EDIS; } void Gpio_select(void) { EALLOW; GpioMuxRegs.GPAMUX.all = 0x0; // 所有GPIO引脚配置为I/O GpioMuxRegs.GPBMUX.all = 0x0; GpioMuxRegs.GPDMUX.all = 0x0; GpioMuxRegs.GPFMUX.all = 0x0; GpioMuxRegs.GPFMUX.bit.CANTXA_GPIOF6 = 1; //CAN引脚配置 GpioMuxRegs.GPFMUX.bit.CANRXA_GPIOF7 = 1; GpioMuxRegs.GPEMUX.all = 0x0; GpioMuxRegs.GPGMUX.all = 0x0; GpioMuxRegs.GPADIR.all = 0x0; // GPIO PORT 配置为输入 GpioMuxRegs.GPBDIR.all = 0x0; // GPIO Port B15-B8 配置为输入 , B7-B0 配置为输出 GpioMuxRegs.GPDDIR.all = 0x0; // GPIO PORT 配置为输入 GpioMuxRegs.GPEDIR.all = 0x0; // GPIO PORT 配置为输入 GpioMuxRegs.GPFDIR.all = 0x0; // GPIO PORT 配置为输入 GpioMuxRegs.GPGDIR.all = 0x0; // GPIO PORT 配置为输入 GpioMuxRegs.GPAQUAL.all = 0x0; // 设置所有 GPIO 输入的量化值等于0 GpioMuxRegs.GPBQUAL.all = 0x0; GpioMuxRegs.GPDQUAL.all = 0x0; GpioMuxRegs.GPEQUAL.all = 0x0; EDIS; } void InitCan(void) { EALLOW; /* 通过eCAN寄存器配置RX和TX引脚作为发送接收*/ ECanaRegs.CANTIOC.bit.TXFUNC = 1; ECanaRegs.CANRIOC.bit.RXFUNC = 1; /* 配置 eCAN 工作在 HECC模式 - (请求访问邮箱16 到 31) */ // HECC模式还是能时间标签功能 ECanaRegs.CANMC.bit.SCB = 1; // ECanaRegs.CANMC.bit.STM= 1; /* 配置位的时间参数 */ ECanaRegs.CANMC.bit.CCR = 1 ; // 设置 CCR = 1 while(ECanaRegs.CANES.bit.CCE != 1 ) {} //等待 CCE bit置位.. ECanaRegs.CANBTC.bit.BRPREG = 19; ECanaRegs.CANBTC.bit.TSEG2REG = 2; ECanaRegs.CANBTC.bit.TSEG1REG = 10; ECanaRegs.CANMC.bit.CCR = 0 ; // 设置 CCR = 0 while(ECanaRegs.CANES.bit.CCE == !0 ) {} // 等待 CCE bit清0.. /* Disable all Mailboxes */ ECanaRegs.CANME.all = 0; // 写 MSGIDs之前发出请求 EDIS; } interrupt void CAN0INTA_ISR(void) { RXcounter++; while(ECanaShadow.CANRMP.bit.RMP1 != 1 ); // 等待 RMP1置位.. // GpioDataRegs.GPBDAT.all = ECanaMboxes.MBOX1.MDL.byte.BYTE0; ECanaShadow.CANRMP.bit.RMP1 = 1; ECanaRegs.CANRMP.all = ECanaShadow.CANRMP.all; CAN0RXDATA[0]= ECanaMboxes.MBOX1.MDL.byte.BYTE0; CAN0RXDATA[1]= ECanaMboxes.MBOX1.MDL.byte.BYTE1; CAN0RXDATA[2]= ECanaMboxes.MBOX1.MDL.byte.BYTE2; CAN0RXDATA[3]= ECanaMboxes.MBOX1.MDL.byte.BYTE3; CAN0RXDATA[4]= ECanaMboxes.MBOX1.MDH.byte.BYTE4; CAN0RXDATA[5]= ECanaMboxes.MBOX1.MDH.byte.BYTE5; CAN0RXDATA[6]= ECanaMboxes.MBOX1.MDH.byte.BYTE6; CAN0RXDATA[7]= ECanaMboxes.MBOX1.MDH.byte.BYTE7; PieCtrlRegs.PIEACK.bit.ACK9=1; EINT; } interrupt void cpu_timer0_isr(void) { CpuTimer0.InterruptCount++; TX_send(); // Acknowledge this interrupt to receive more interrupts from group 1 PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; } 这个是我之前自己写的一个,您可以参考一下,如果发现错误也欢迎指出。以后您贴程序尽量贴成这种格式看起来方便一些。