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.

[参考译文] TMS320F28335:eCAN 检查已发送邮箱的发送确认标志 CANTA

Guru**** 2530350 points
Other Parts Discussed in Thread: CONTROLSUITE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/604575/tms320f28335-ecan-checking-transmit-acknowledge-flag-canta-of-mailbox-transmitted

器件型号:TMS320F28335
Thread 中讨论的其他器件:controlSUITE

我正在编写一个 CAN 协议、我想知道我是否必须检查传输的邮箱中的 CANTA 位。 我检查了320f2833x 的 eCAN 参考指南、有几个点可以传输邮箱:

 

要启动传输:

1.将消息数据写入邮箱数据字段。

a:由于 DBO (MC.10)在配置部分设置为零、MSGCTRL (1)设置为2、因此数据存储在 CANMDL (1)的2个 MSB 字节中。

b.写入 CANMDL (1)= xxxx0000h

2、在发送请求寄存器(CANTRS.1=1)中设置相应的标志、开始发送报文。 CAN 模块现在处理 CAN 消息的完整传输。

3、等待相应邮箱的发送确认标志被置位(TA.1=1)。 成功传输后、此标志由 CAN 模块置位。

传输成功或中止(TRS.1=0)后、模块将 TRS 标志复位为0。

5、下一次发送(来自同一邮箱)必须清除发送确认。

a.设置 TA.1=1

b:等待读 TA.1为0

6.要在同一邮箱中传输另一条消息,必须更新邮箱 RAM 数据。 设置 TRS.1标志将启动下一个传输。 写入邮箱

RAM 可以是半字(16位)或全字(32位)、但模块始终从偶数边界返回32位。 CPU 必须接受全部32位或部分位。

 

我在没有等待 CANTA 的情况下编写了代码、它工作正常。 当我等待 CANTA 与 while 循环时、当出现 CAN 错误且传输不成功时、CANTA 从未设置为1。 我必须写入额外的超时以确保正确的代码执行。 我读过 CANTRS 标志、即当传输成功或中止时它为0、我写了一些有效的代码:

 

extern struct eCAN-regs ECanShadow;
uint16 SendMboxNum (uint16 MboxNum、uint32 id、uint32 MDL、uint32 MDH、 uint32 ctrl、uint16 dlc)
{
uint32移位 Res = 0U;
uint16 ret = 0U;
uint16超时= 2000U;

ShiftRes =(0x00000001U)<< MboxNum;

如果((ECANaRegs.CANTRS.ALL & ShiftRes)== 0U){
ECANShady.Canta.all = 0U;
ECANShady.Canta.all |= ShiftRes;/*清除 TA 位*/
ECANARegs.Canta.all = ECANShady.Canta.all;

ECANShady.CANME.ALL = ECANaRegs.CANME.ALL;
ECANShadure.CANME.all &&~ShiftRes;//禁用邮箱*/
ECANaRegs.CANME.ALL = ECANShady.CANME.ALL;

ECanaMboxs.MsgBox[MbboxNum].MSGID.all = id;
ECanaMboxs.MsgBox [MboxNum].MDL.all = MDL;
ECanaMboxs.MsgBox [MboxNum].mdh.all = mdh;
ECanaMboxs.MsgBox [MboxNum].MSGCTRL.ALL = Ctrl;

ECANaMboxs.MsgBox[MboxNum].MSGCTRL.bit.DLC = DLC;
ECANaMboxs.MsgBox [MboxNum].MSGCTRL.bit.RTR = 0U; /*RTR = 0 */

ECANShady.CANME.ALL = ECANaRegs.CANME.ALL;
ECANShady.CANME.ALL |= ShiftRes;//启用邮箱*/
ECanaRegs.CANME.ALL = ECANShadure.CANME.ALL;

DO{
ECANShadure.CANTAA.ALL = ECANaRegs.CANTA.ALL;
if (--timeout>0U){break;}
while (ECANShading.CANTAA.ALL 和 ShiftRes);
ECANRegs.CANTRS.all = 0U;
ECANShadow* CANTRS.CANTRS.CANTRS.W= 0CANTRS.CANTRS.CANTRS.W= 0CANTRS*

RET=1U;
}
返回 ret;
}

该程序等待 CANTA、但它正在等待清除位以使传输不成功。 实际上、我不必检查 CANTA、因为它始终在"执行 while "循环执行之前清除。

是否有必要满足邮箱传输的第3点、或者我是否缺少了什么?

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

    CANTA 位的设置(单独)表示数据传输成功。 这也是发送给应用的下一个帧可以被发送的信号。 如果您没有检查 TA 位、如何验证/确定前一帧已成功传输、并且下一帧可以启动传输? 在现实的 CAN 网络中、由于总线争用(具有较高优先级的报文赢得仲裁的其他节点)或总线上的错误、发送帧所需的时间是不确定的。 因此、您需要使用 CANTA 位(通过轮询它或使用中断)。

     

    TA 位不会被自动清零。 必须通过向其写入1来将其清除。

     

    如果您轮询 TA 位以使其置位、但需要实现某种形式的超时、则可以通过利用 MOTO 寄存器来使用超时中断。

     

    如果我没有正确理解您的疑虑、请告诉我。

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

    是的、我必须检查 CANTA 位以指示成功转换。 我正在编写一个像 CANopen 这样的协议、我想编写 CAN 转换函数。 我需要发送事件、但需要缓冲、并且需要保持事件发送的顺序。 在发送事件时、我必须检查 CANTA 以确定事件是否正确发送。 但在该协议中、我有一个测量的循环数据、不需要始终成功发送。 更重要的是、应该发送实际数据而不是旧数据、我不需要检查循环数据中的 CANTA 位。

    当我写入 transmition 函数时、我会阅读 controlSUITE 中的 eCAN 数据表和示例。 有"3点。 等待、直到相应邮箱的发送确认标志被置位(TA.1=1)"、并且它建议使 while 循环与 controlSUITE 中的示例类似:

    操作
    {
    ECanaShady.Canta.all = ECanaRegs.Canta.all;
    } while (ECanaShading.Canta.bit.TA25 =0);//等待 TA5位被置位。
    

    但是、如果 CAN 线路断开、仲裁或者 CAN 模块在 while 环路中设置 Transmition CANAA 位程序堆栈的中止。 如果中断了传输、它会在 无限 while 循环中堆叠、这是不可接受的。 要指示传输结束、应检查 CANTRS 位、在该位清零后、检查 CANTA 以指示帧已发送。 我认为、在数据表和示例中、您不应等到 CANTA 位置1、这一点并不清楚。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    controlSUITE 示例显示了检测传输完成情况的一种方法。 这是一个简单的示例、无需担心代码卡在无限循环中。 该示例的目的是让某人能够快速检查传输功能。 曾经可以使用模块中内置的超时功能、也可以使用软件计时器来确保代码不会卡在无限循环中。 我同意您的看法、检查 TRS 位是一个更好的选择、因为它也会记录中止的消息。 但是、请注意、实际应用很少使用轮询、并且通常使用中断。