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