当两个 CAN 器件的波特率相同时、我有一个电路是很好的。 我现在已经将终端设备设置为在启动时具有不同的波特率、以便有目的地导致 CAN TX 消息超时。 我觉得在我的"设置"超时中缺少一些东西、因为代码只在其他时间运行。
我的意思是、当 F2808为20Kbps 且终端器件为1Mbps 时、F2808第一次可以发送超时、然后移动到一个函数、将波特率更新为1Mbps、然后按照预期处理其余的 CAN 消息。 然后我停止执行、然后重新启动相同的代码、F2808以20Kbps 开始、CAN 消息超时、切换到1Mbps、但下一条消息失败、但我无法跟踪原因。 然后、我重新启动代码、执行相同的波特率过程、但这次它按预期工作。 每次其他 CPU 复位都按预期工作、但每次其他复位都失败。
当发出下一个 CPU 复位时、故障状态期间的某些标志似乎被复位、但我似乎找不到它。
哪些关键标志可确保在 CAN TX 超时期间清除、如何将其复位?
或者、在尝试更改波特率(或在出现 A 时发送另一条消息)之前、我应该中止 Tx 消息吗?
PMDresult CAN_SendCmdMsg(struct CAN_CONFIG* cancfg, Uint16 bytecount, Uint16* bytes) { PMDresult result = PMD_NOERROR; cancfg->TX_MBOX->MSGCTRL.bit.DLC = bytecount; // add bytes to mailbox StuffMailbox(cancfg, bytecount, &bytes[0]); /* Clear the "Time Stamp Counter" */ EALLOW; ECanaRegs.CANTSC = 0; EDIS; ECanRegsShadow.CANTRS.all = 0; ECanRegsShadow.CANTRS.all = cancfg->TX_BIT; // Set TRS for mailbox under test ECanaRegs.CANTRS.all = ECanRegsShadow.CANTRS.all; // // Wait for TAn bits to be set // TODO Set timeouts on all do..while // ECanRegsShadow.CANTA.all = ECanaRegs.CANTA.all; do { ECanRegsShadow.CANTOS.all = ECanaRegs.CANTOS.all; ECanRegsShadow.CANTA.all = ECanaRegs.CANTA.all; } while((ECanRegsShadow.CANTA.all & cancfg->TX_BIT) == 0 && // Wait for TAx = 1 (Successful CAN transmit) (ECanRegsShadow.CANTOS.all & cancfg->TX_BIT) == 0); // TOS = 1 when timeout occurred /* Service a timeout? */ if((ECanRegsShadow.CANTOS.all & cancfg->TX_BIT) == cancfg->TX_BIT) { // timeout occurred so clear the bit and move on ECanRegsShadow.CANTOC.all = ECanaRegs.CANTOC.all; ECanRegsShadow.CANTOC.all = cancfg->TX_BIT; ECanaRegs.CANTOC.all = ECanRegsShadow.CANTOC.all; // CANTOC should be clear now result = PMD_ERR_Timeout; } ECanRegsShadow.CANTA.all = 0; ECanRegsShadow.CANTA.all = cancfg->TX_BIT; // Clear tx bit ECanaRegs.CANTA.all = ECanRegsShadow.CANTA.all; return result; }
/* * This bit globally enables all interrupts for the ECAN0INT line if the corresponding masks are set. */ ECanRegsShadow.CANGIM.all = ECanRegsShadow.CANGIM.all; ECanRegsShadow.CANGIM.bit.I0EN = 1; // Enable eCAN0INT ECanRegsShadow.CANGIM.bit.I1EN = 0; // Disable eCAN1INT ECanRegsShadow.CANGIM.bit.MTOM = 1; // Enable mailbox timeouts ecanregs->CANGIM.all = ECanRegsShadow.CANGIM.all; /* * Setup transmit and receive timeouts * Limit-value of the time-stamp counter (TSC) 100 clocks / uSec * TSC is incremented by bit clock so it is independent of bit per second */ ECanaMOTORegs.MOTO[INIT_TX_CANMBOX] = 0x400; ECanaMOTORegs.MOTO[INIT_RX_CANMBOX] = 0x400; ECanaMOTORegs.MOTO[AZ_TX_CANMBOX] = 0x400; ECanaMOTORegs.MOTO[AZ_RX_CANMBOX] = 0x400; /* Enable time-out function for the mailboxes */ ECanaRegs.CANTOC.all = MAILBOX0BIT | MAILBOX5BIT | MAILBOX16BIT | MAILBOX21BIT; /* Clear the "Time Stamp Counter" */ ECanaRegs.CANTSC = 0;