当两个 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;

