尊敬的 TI 团队!
我将尝试描述我在原型设计方面的问题、我们正准备大规模生产。
首先、让我快速描述一下我们想要实现的目标。 我们的 CAN 协议的设计方式与此类似、在我们的电网中、有一个主器件始终在询问、节点始终在答复。 主机通常每8ms 要求一次参数。 如果主机成功接收到应答、则参数将递增。 Thant 表示整个协议循环(N*8ms),然后在最后一个参数之后启动拥有者。 如果主器件未获得有关特定参数的正确答案、它将在64ms 后20次询问、然后它将抛出错误。 应答来自节点一旦收到新数据就会创建。
我们使用的软件是用于数据池的标准代码:
if (TCAN_Int_Cnt!= 0)
{
TCAN_INT_cnt -;
TCAN4x5x_Device_ReadInterrupts (&dev_ir);//读取器件中断寄存器
TCAN4x5x_MCAN_ReadInterrupts (&mCAN_IR);//读取中断寄存器
if (DEV_ir.SPIERR)//如果 SPIERR 标志被置位
TCAN4x5x_Device_ClearSPIERR();//清除 SPIERR 标志
IF (mCAN_ir.RF0N)//如果 RX FIFO 0中有一条新消息
{
//TCAN4x5x_MCAN_RX_Header MsgHeader ={0};//初始化为0、否则会产生垃圾
uint8_t numBytes = 0;//因为 ReadNextFIFO 函数将返回读取的数据字节数量
//rx_data ={0};//用于存储接收到的数据
TCAN4x5x_MCAN_ClearInterrupts (&mCAN_IR);//清除设置的任何中断位。
numBytes = TCAN4x5x_MCAN_ReadNextFIFO (RXFIFO0、&RXMsgHeader、Rx_DATA);//这将读取 RX FIFO 0中的下一个元素
// numBytes 将具有其传输的字节数。 也可以解码 MsgHeader.DLC 中的 DLC 值
//数据现在位于 RX_DATA[]中,消息特定信息位于 MsgHeader 结构中。
tCAN_msg_ID ();
}
}
iside 函数"tCAN_msg_ID();"是代码的这一部分
否则 if (0x6A9)
{
CAN_msg_buff = 0;
CAN_msg_buff = rx_data[0];
switch (CAN_msg_buff)
{
情况0x10:
TOCAN_msg_ID_ACK (STAT_OK、0x255、0x10、0x00、0x00、0x00、0x00、0x00);
中断;
情况 0x22:
TOCAN_msg_ID_ACK (STAT_OK、0x255、0x22、0x00、0x00、0x00、0x00、0x00);
中断;
默认值:
tCAN_msg_ID_ACK (STAT_OK、0x255、CAN_msg_buff、0x00、0x00、0x00、0x00);
中断;
…
…
}
void tCAN_msg_ID_ack (uint8_t CAN_Status、uint16_t msg_ID、uint16_t PAR_ID、uint8_t DATA_0、uint8_t DATA_1、uint8_t DATA_2、uint8_t DATA_3)
{
TCAN4x5x_MCAN_TX_Header TXMsgHeader ={0};
TXMsgHeader.ID = msg_ID;
TX_DATA[0]= CAN_Status;
TX_DATA[1]= PAR_ID 和0x00FF;
TX_DATA[2]= PAR_ID>>8;
TX_DATA[3]= DATA_0;
TX_DATA[4]= DATA_1;
TX_DATA[5]= DATA_2;
TX_DATA[6]= DATA_3;
TX_DATA[7]= 0x00;
TXMsgHeader.RTR = 0;//远程传输请求标志
TXMsgHeader.Xtd = 0;//扩展标识符标志
TXMsgHeader.ESI = 0;//错误状态指示标志
TXMsgHeader.DLC = MCAN_DLC_8B;
TXMsgHeader.BRS = 1;//位速率开关使用标志
TXMsgHeader.FDF = 1;//CAN FD 格式标志
TXMsgHeader.Reserved = 0;//Reserved //1.
TXMsgHeader.EFC = 0;//Event FIFO 控制标志、用于存储 TX 事件或不存储 TX 事件
TXMsgHeader.mm = 0;//如果@c EFC 被设定为1//1、则使用消息标记
TCAN4x5x_MCAN_WriteTXBuffer (0、&TXMsgHeader、TX_DATA);
TCAN4x5x_MCAN_TransmitBufferContents (0);
}
中的系统示例。

0x6A9是一个主器件、要求参数 DB0 = 0x10
0X255是对参数 DB0 = 0x01 (状态正常)、DB1 = 0x10的节点应答
现在、让我们来看看问题。
很难重现问题、但我设法使用外部峰值 CAN 软件狗来解决。
以下是峰值转换器的设置: 
软件狗在我的系统中充当主设备。 我在06A9之前和之后每1ms 发送一次消息0x6A9循环、并发送一次消息0x583以创建流量。 我希望对 ID 0x255的参数0x40进行应答。
大部分时间的答案是正确的、但现在和之后都有错误的答案。 当然、我已经在 TCA4550中为消息0x583设置了筛选器、但我在上面进行了较新的重放、我的软件只是在侦听此消息。

您能解释一下这种行为吗?
此致。
Sebastian


