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点、或者我是否缺少了什么?