This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TCAN4550:TCAN4550缓冲 FIFO 数据错误

Guru**** 2008950 points
Other Parts Discussed in Thread: TCAN4550
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1024684/tcan4550-tcan4550-buffer-fifo-wrong-data-problem

器件型号:TCAN4550

尊敬的 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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Sebastian、

    感谢您对设置的详细描述。  

    在返回 ID 0x255和预期参数0x40的测试中、一些消息似乎包含0x03。 我在连接代码中的变量时遇到问题、但该字节是否应镜像命令帧的第一个字节(在本例中为 ID 0x583帧的0x03)? 如果这个虚拟帧中的数据发生了变化、额外发送的帧中的数据也会发生变化吗?

    如果是、这可能是因为虚拟帧与过滤帧一起被接受到 RX FIFO 中。 TCAN4550的默认行为是接受所有数据包进入 Rx FIFO 0、除非数据包与滤波器匹配、否则将执行滤波器中描述的操作。 在这种情况下、您将需要捕获滤波器中的虚拟帧以抑制它们。  

    我不知道为什么这些虚拟帧只显示了一部分时间、因为看起来发送的虚拟帧比测试帧多。 我怀疑这可能是因为其中一些帧在管理其他事件时到达、因此中断引脚不会重新置位以触发服务例程。 但是、1ms 应该是足够的间距。  在等待下一个中断触发之前、您能否确保 RXFIFO 没有其他可用消息(mCAN_IR.RF0N 未设置)? 如果在虚拟帧之间使用更大的延迟、是否会显示更多的错误响应帧?

    此致、
    Eric Schott

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    感谢您的快速回复。

    让我进一步扩展代码:正如您在有效载荷的第一个数据字节上看到的那样,我们正在使用我们自己的参数(0x10、0x22、0x23、...) )。
    如果此参数超出范围、例如0x45、软件将使用 DataByte 0中的"STAT_ERRADDRESS"和参数编号 DataByte 1进行响应。

    否则 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);
      中断;

      情况 0x23:
      TOCAN_msg_ID_ACK (STAT_OK、0x255、0x22、0x00、0x00、0x00、0x00、0x00);
      中断;

      情况 0x24:
      TOCAN_msg_ID_ACK (STAT_OK、0x255、0x22、0x00、0x00、0x00、0x00、0x00);
      中断;

      情况 0x25:
      TOCAN_msg_ID_ACK (STAT_OK、0x255、0x22、0x00、0x00、0x00、0x00、0x00);
      中断;

      情况 0x26:
      TOCAN_msg_ID_ACK (STAT_OK、0x255、0x22、0x00、0x00、0x00、0x00、0x00);
      中断;

      情况 0x32:
      TOCAN_msg_ID_ACK (STAT_OK、0x255、0x22、0x00、0x00、0x00、0x00、0x00);
      中断;

      默认值:
      tCAN_msg_ID_ACK (STAT_ERRADDRESS、0x255、CAN_msg_buff、0x00、0x00、0x00、0x00);
      中断;

    下面是演示。

    现在让我们重新创建问题。 我还会将"My Parameter" DB0从0x03更改为0x04、这对于我的软件而言是未知的、您将了解会发生什么。 如果我将循环时间增加到10ms、 则误差更小。 如果我减小、则存在 mor 错误数据包。

    新设置。  FIFO0同时接受消息583和6A9。

    和结果:

    在我的软件中、我用 CAN ID 0x255来响应参数0x04。 这意味着缓冲器内部存在一些问题。 它看起来像一些索引问题或其他问题。

    我还可以清楚地看到、在调试中、我接收到的 ID 是0x6a9、但数据有效载荷是来自0x583。

    此致。

    SEBA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、SEBA、

    我正在查看此信息、并将在明天返回给您。 感谢您的耐心等待。  

    此致、
    Eric Schott

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Eric:

    有新消息吗?

    此致。

    SEBA

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Seba、

    非常感谢您的耐心等待。 我们最近有一些高优先级任务弹出、所以 Eric 无法解决。 我们将在下周一之前向您回复。

    此致、

    Eric Hackett