主题中讨论的其他器件:TCAN4550
工具与软件:
大家好!
我正在使用 TCAN4550开发一个板、用于通过 CAN FD 进行扩展。
我的应用包括一个在多个 CAN 端口之间重新传输 CAN 帧的器件、如一个路由器。 到目前为止、我正在 TCAN4550的 CAN 模块与 uC 的集成 DCAN 模块(TMS570LS1227ZWT)之间测试 retransmisison。
我的日常工作包括:
-> CAN 寄存器3 ISR 处理程序:
-阅读新消息
-将相关信息(DLC,扩展 ID 标志,有效负载)复制到临时缓冲区
-在 TCAN 模块上重新传输消息
我在有效负载数据全部设为0时发现了一个问题、特别是我看到 TCAN 多次随机发送消息而不是一次(我检查后发现 CAN3上没有收到虚假消息或 CAN 3 ISR 中的条目)。 这就导致 TCAN 模块多次发出消息、并在抛出 PEA 错误并为总线关闭设置标志的过程中随机停止。
如果至少一位有效载荷数据不同于0、则该问题不存在。
下面我报告了我的 MRAM 配置以及 ISR 处理程序例程。
如何发送数据全为零的帧而不会出现问题? 我可以知道链接到有效载荷、因为如果我强制静态有效载荷不同于0、或者只是发送有效载荷不同于0的消息、则问题不再发生。
写入例程是 TMS570的 TCAN4550演示节点1中的一个例程
SPI 设置为18MHz、TCAN4550的晶体为40MHz、UC 频率设置为180MHz。
我已在总线负载的50%以上进行了重新传输测试、没有任何问题、因此它似乎与任何物理层问题无关。
CAN 3 IRS 处理程序:
if (node == canREG3)
{
Received_frames[CAN_PORT_3]++;
if (Forward_To > 0)
{
//获取 ID
if (CAN_Ports[CAN_MODULE_3].IDExtended)
{
CAN_REG3[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_RX[CAN_PORT_3]].FRAME_id Receive_Buffer = canGetID (canREG3、MessageBox)>>0U;
Receive_Buffer = 1;
}
设计
{
CAN_REG3[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_RX[CAN_PORT_3]].FRAME_id Receive_Buffer = canGetID (canREG3、MessageBox)>>18u;
Receive_Buffer = 0;
}
//获取数据
can_REG3[can_port_3][can_transmit_queue_index_rx[can_port_3].dlc Receive_Buffer =(uint8_t) canGetPacketData (canREG3、MessageBox、can_REG3][can_port_3][can_transmit_queue_index_rx[can_port_3].data Receive_Buffer);
//这是跟踪消息是否不能同时发送的必要条件、因此仍然设置相应的标志
标头。 DLC = CAN_DLC[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_RX[CAN_PORT_3]].dlc;//将 Receive_Buffer 设置为等于或小于数据有效载荷(如果您的 DLC 是8个字节、则可以将64字节的数据数组传递到 WriteTXFIFO 函数中、但只会读取前8个字节)
标头。 ID = CAN_ID[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_rx[CAN_PORT_3].FRAME_id;//设置 Receive_Buffer。 1号电路板使用0x128、2号电路板使用0x158
标头。 XTD = Receive_Buffer;
TCAN45xStatus[9]= MCAN_WriteTXFIFO (CAN4_MSB_TX_INDEX、&HEADER、CAN_FIFO[CAN_PORT_3][CAN_TRANSMIT_QUEED_INDEX_RX[CAN_PORT_3]].data Receive_Buffer);
IF (TCAN45xStatus[9]>0)
{
AHB_WRITE_B_FL_32 (M_CAN_TXBAR、TCAN45xStatus[9]);//现在我们可以发送先前排队但未发送的 TX FIFO 元素1数据。
DataTxCount++;
}
if (++CAN_TRANSMIT_QUEURE_INDEX_RX[CAN_PORT_3]>=RX_BUFFER_LEN)
{
can_transmit_queue_index_rx[can_port_3]= 0;
}
if (++CAN4_MSB_TX_INDE>20)
{
CAN4_MSB_TX_INDEX = 0;
}
//调试
TCAN45xStatus[0]= AHB_READ_B_FL_32 (SPI_STATUS);
TCAN45xStatus[1]= AHB_READ_B_FL_32 (DEV_IR);
TCAN45xStatus[2]= AHB_READ_B_FL_32 (0x0824);
MCAN_ReadInterruptRegister (&MCAN_IR);//读取中断寄存器
}
MRAM 配置
#define TCAN_NominalBitRatePrescaler 1.
#define TCAN_NominalTimeSeg1andProp 32.
#define TCAN_NominalTimeSeg2 8.
#define TCAN_NominalSyncJumpWidth 8.
#define TCAN_DataBitRatePrescaler 1
#define TCAN_DataTimeSeg1andProp 32.
#define TCAN_DataTimeSeg2 8.
#define TCAN_DataSyncJumpWidth 8.
/* TCAN MRAM 配置*/
#define MRAM_SIDNumElements 1 //标准 ID 元素数量
#define MRAM_XIDNumElements 1 //扩展 ID 号
#define MRAM_Rx0NumElements 64 //RX0数量
#define MRAM_Rx0ElementSize MRAM_8_FIFO//RX0 Byte_Data 数据有效载荷大小(使用 defines)
#define MRAM_Rx1NumElements 0 //RX1元素数量
#define MRAM_Rx1ElementSize MRAM_8_FIFO//RX1 Byte_Data 数据有效载荷大小(使用 defines)
#define MRAM_RxBufNumElements 0 //RX buffer 数量
#define MRAM_RxBufElementSize MRAM_8_R2C/RX Byte_Data 缓冲区数据有效载荷大小(使用 define)
#define MRAM_TxEventFIFONumElement 0 //TX 事件 FIFO 元素数量
#define MRAM_TxBufferNumElements 21 /TX buffer 数量
#define MRAM_TxBufferElementSize MRAM_8_TX/TX Byte_Data 缓冲区数据有效载荷大小(使用 define)
如果有人能给我一个提示,这将是非常感谢,谢谢!