現(xiàn)做變頻電源用此IC
用到CAN總線與遠(yuǎn)程PC通信
一般情況下通信沒問題已在用.
在異常下:有可能是消息沖突,超載等沒處理好使CAN模塊停止了
在一段時(shí)間里有停止通信現(xiàn)象,重上電復(fù)位就好.
就像路由器有時(shí)不能上網(wǎng),重上電就好一樣.
請(qǐng)高人指點(diǎn)一下!非常感謝!
原CAN初始代碼與發(fā)送接收代碼如下:
void InitCAN(void)
{
Uint32 x1;
EALLOW;
ECanaShadow.CANTIOC.all = ECanaRegs.CANTIOC.all;
ECanaShadow.CANTIOC.bit.TXFUNC = 1;
ECanaRegs.CANTIOC.all = ECanaShadow.CANRIOC.all;
ECanaShadow.CANRIOC.all = ECanaRegs.CANRIOC.all;
ECanaShadow.CANRIOC.bit.RXFUNC = 1;
ECanaRegs.CANRIOC.all = ECanaShadow.CANRIOC.all;
EDIS;
ECanaRegs.CANME.all = 0;
//客流的轉(zhuǎn)換模塊的發(fā)送ID 0x02 接收0x20
/*發(fā)送郵箱的ID號(hào)*/
x1=DeviceNumber;
x1=x1*0x40000;
ECanaMboxes.MBOX0.MSGID.all = x1;//+0x40000;//發(fā)送
/*接收郵箱的ID號(hào)*/
ECanaMboxes.MBOX6.MSGID.all =x1;
ECanaMboxes.MBOX7.MSGID.all =x1;
ECanaMboxes.MBOX8.MSGID.all =x1; //接收
ECanaMboxes.MBOX9.MSGID.all =0x03480000;//接收
/*0 is TX,8 is RX*/
ECanaRegs.CANMD.all = 0x000003c0;
/*郵箱使能8-1*/
ECanaRegs.CANME.all = 0x000003c1;
ECanaMboxes.MBOX0.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX6.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX7.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX8.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX9.MSGCTRL.bit.DLC = 8;
ECanaMboxes.MBOX0.MSGCTRL.bit.TPL=1;
ECanaMboxes.MBOX6.MSGCTRL.bit.TPL=0;
ECanaMboxes.MBOX7.MSGCTRL.bit.TPL=0;
ECanaMboxes.MBOX8.MSGCTRL.bit.TPL=0;
ECanaMboxes.MBOX9.MSGCTRL.bit.TPL=0;
/*沒有遠(yuǎn)方應(yīng)答幀被請(qǐng)求*/
ECanaMboxes.MBOX0.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX6.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX7.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX8.MSGCTRL.bit.RTR = 0;
ECanaMboxes.MBOX9.MSGCTRL.bit.RTR = 0;
EALLOW;
/*郵箱使能*/
ECanaRegs.CANMIM.all = 0xFFFFFFFF;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 1;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
}while(ECanaShadow.CANES.bit.CCE != 1);
EALLOW;
/*(BRPREG+1)=100 波特率50K*/
ECanaShadow.CANBTC.bit.BRPREG = 99;
ECanaShadow.CANBTC.bit.TSEG2REG = 5;
ECanaShadow.CANBTC.bit.TSEG1REG = 12;
ECanaRegs.CANBTC.all = ECanaShadow.CANBTC.all;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.CCR = 0;
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
do
{
ECanaShadow.CANES.all = ECanaRegs.CANES.all;
}while(ECanaShadow.CANES.bit.CCE != 0);
EALLOW;
ECanaShadow.CANMC.all = ECanaRegs.CANMC.all;
ECanaShadow.CANMC.bit.SUSP= 1;//
ECanaShadow.CANMC.bit.STM = 0;//自測(cè)試模式=1
ECanaShadow.CANMC.bit.SCB = 0;//ecan模式=1
ECanaRegs.CANMC.all = ECanaShadow.CANMC.all;
EDIS;
EALLOW;
ECanaRegs.CANMIM.all = 0x000003c1;//Enable Box0(TXD) Box8(RXD)
ECanaRegs.CANMIL.all = 0x00000001;//Box0->CANINT1;Box->CANINT0;
ECanaRegs.CANRMP.all = 0x00000000;
ECanaRegs.CANGIF0.all= 0xffffffff; //Crear All INT Status Flag
ECanaRegs.CANGIF1.all= 0xffffffff;
ECanaRegs.CANGIM.all = 0x30003;//Close All NMI
//ECanaRegs.CANTOC.all =0x00000301;//Enable Timer Over
EDIS;
EALLOW;
PieVectTable.ECAN0INTA=&cpu_ECANRXD_isr;
PieVectTable.ECAN1INTA=&cpu_ECANTXD_isr;
EDIS;
PieCtrlRegs.PIEIER9.bit.INTx6 = 1;
PieCtrlRegs.PIEIER9.bit.INTx5 = 1;
}
interrupt void cpu_ECANRXD_isr(void) // eCAN-A
{
if((ECanaRegs.CANRMP.bit.RMP6==1)||(ECanaRegs.CANRMP.bit.RMP7==1)||
(ECanaRegs.CANRMP.bit.RMP8==1)||(ECanaRegs.CANRMP.bit.RMP9==1)
)
{
這里是接受數(shù)據(jù)處理代碼;
}
PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}
interrupt void cpu_ECANTXD_isr(void) // eCAN-A
{
if(ECanaRegs.CANTA.all == 0x00000001)
{
ECanaRegs.CANTA.all = 0x00000001;
} //清除中斷標(biāo)志
PieCtrlRegs.PIEACK.bit.ACK9 = 1;
}
TMS320F2812有關(guān)CAN通信問題
全部回復(fù)(0)
正序查看
倒序查看
現(xiàn)在還沒有回復(fù)呢,說說你的想法