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.

[参考译文] TM4C129XNCZAD:CAN 总线回送模式问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/686146/tm4c129xnczad-can-bus-loopback-mode-issue

器件型号:TM4C129XNCZAD
Thread 中讨论的其他器件:EK-TM4C1294XL

大家好、

我正在尝试创建一个用于 CAN 总线 回路 测试的程序。 但是、我下面的计划似乎不起作用。 请提供建议。

int main (空)

//启用 CAN 和 GPIO 端口 A 的时钟
//等待 CAN 模块和 GPIO 端口 A 外设就绪
*((uint32_t *)(SYSCTL_RCGCCAN))|=(0x01 << 0);
*((uint32_t *)(SYSCTL_RCGCGPIO))|=(0x00001 << 0);
while (!(*(uint32_t *)(SYSCTL_PRCAN)&(0x01 << 0)));
while (!(*(uint32_t *)(SYSCTL_PRGPIO)&(0x00001 << 0)));

//将 GPIO 备用功能配置为 UART
*(((uint32_t *)(GPIO_PORta_AHB + GPIO_AFSEL))|=(0x03 << 0);
*(((uint32_t *)(GPIO_PORta_AHB + GPIO_DEN))|=(0x03 << 0);
*((uint32_t *)(GPIO_Porta_AHB + GPIO_O_PCTL))|=(0x07 << 4 | 0x07 << 0);

//初始化和配置 CAN 模块位时序
*((uint32_t *)(CAN0 + CAN_O_CTL))|=(0x1 << 0);
*((uint32_t *)(CAN0 + CAN_O_CTL))|=(0x1 << 6);
*((uint32_t *)(CAN0 + CAN_O_BIT))=(0x2 << 12 | 0x3 << 8 |
0x2 << 6 | 0x2 << 0);
*((uint32_t *)(CAN0 + CAN_O_CTL))&=~(0x1 << 0);
*(((uint32_t *)(CAN0 + CAN_O_CTL))和=~(0x1 << 6);

//将 CAN 模块配置为环回模式
*((uint32_t *)(CAN0 + CAN_O_CTL))|=(0x1 << 7);
*((uint32_t *)(CAN0 + CAN_O_TST))|=(0x1 << 4);

*((uint32_t *)(CAN0 + CAN_O_CTL))|=(0x1 << 1);

//配置接收消息对象
*(((uint32_t *)(CAN0 + CAN_O_IF1CMSK))=(0x0 << 7 | 0x1 << 4 | 0x1 << 1 | 0x1 << 0);
*(((uint32_t *)(CAN0 + CAN_O_IF1MSK1))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1MSK2))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1ARB1))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1ARB2))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1MCTL))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1ARB2))=(0x1 << 15 | 0x5 << 2);
*(((uint32_t *)(CAN0 + CAN_O_IF1MCTL))=(0x1 << 7 | 0x8 << 0);
*(((uint32_t *)(CAN0 + CAN_O_IF1CRQ))= 1;
while (*(uint32_t *)(CAN_O_IF1CRQ)& 0x8000);

//配置发送消息对象
*(((uint32_t *)(CAN0 + CAN_O_IF1CMSK))=(0x1 << 7 | 0x1 << 4 | 0x1 << 1 | 0x1 << 0);
*(((uint32_t *)(CAN0 + CAN_O_IF1MSK1))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1MSK2))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1ARB1))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1ARB2))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1MCTL))= 0;
*(((uint32_t *)(CAN0 + CAN_O_IF1ARB2))=(0x1 << 15 | 0x1 << 13 | 0x5 << 2);
*((uint32_t *)(CAN0 + CAN_O_IF1MCTL)=(0x1 << 8 | 0x1 << 7 | 0x8 << 0);
*(((uint32_t *)(CAN0 + CAN_O_IF1DA1))= 0x1111;
*(((uint32_t *)(CAN0 + CAN_O_IF1DA2))= 0x2222;
*(((uint32_t *)(CAN0 + CAN_O_IF1DB1))= 0x3333;
*((uint32_t *)(CAN0 + CAN_O_IF1DB2)= 0x4444;
*(((uint32_t *)(CAN0 + CAN_O_IF1CRQ))= 2;
while (*(uint32_t *)(CAN_O_IF1CRQ)& 0x8000);

//启动发送请求
*((uint32_t *)(CAN0 + CAN_O_IF1MCTL))|=(0x1 << 8);

*((uint32_t *)(CAN0 + CAN_O_IF2CMSK)=(0x0 << 7 | 0x1 << 6 | 0x1 << 5 | 0x1 << 4 | 0x1 << 1 | 0x1 << 0);
*(((uint32_t *)(CAN0 + CAN_O_IF2CRQ))= 1;
while (*(uint32_t *)(CAN_O_IF2CRQ)& 0x8000);

while (1);

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

    首先、请允许我注意、您的英语是 "非常棒!"   这证明了您的熟练程度以及西方最"语言限制"的技能如何令人尴尬...

    针对您的问题-供应商代表(和外部人员、如我)始终倾向于使用 API (其中包括许多 CAN 编程示例)。   您采用了"TRM"型编码(直接寄存器操作)、这种编码确实可以工作、但开发起来要困难得多、需要更长的时间、并且没有供应商 的"Record of Success"(成功记录)、"well tested、成熟可靠、广泛且大量的示例"API。

    调试您的代码所需的"时间和精力"大大增加-通常会阻止供应商代理(我认为应该这样做)和谦逊的外部人员-从"潜水-到救援!"   即使是我们想要的时候,尤其是当我们想要的时候!

    我还想建议、我认为任何这样的"环回"都不像真正的 CAN 交易那样有用、这涉及(至少两个) CAN 设备和两个 CAN 收发器!   (请使用3V3)

    您将在"tware\examples\peripheral\CAN "下找到合适的示例 。   我的小公司发现"simple.RX 和 simple.TX"是您的 CAN 测试和进一步开发的理想选择。

    再一次——简单的好帖子……  祝您愉快。   (有些、轻微的第二语言能力...)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    根据设计、CAN 模块将不会"接收"其传输的消息、除非您启用测试回路模式。 您必须先将 CANCTL 寄存器中的 TEST 位置位、然后将 CANTST 寄存器中的 LBACK 位置位。

    我尚未详细查看您的代码实施情况。 正如 CB1所指出的、我们强烈建议使用 TivaWare API、而不是使用直接寄存器写入来编写您自己的例程。 使用已知的工作功能可以大大提高您的工作效率和帮助您的人员的工作效率。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、bob、

    我的代码中设置了测试位和回路位。

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

    您是否可以使用 EK-TM4C1294XL 评估板? 我已附加一个执行 CAN 回送的 CCS7项目。 它专为 EK-TM4C1294XL 而设计、它使用 UART0将消息打印到终端、并配置 CAN1 (PB0和 PB1)进行环回。 您可以"导入"这个项目到 CCS 中、并查看如何使用 TivaWare 函数来设置、读取和写入 CAN 模块。

    /cfs-file/__key/communityserver-discussions-components-files/908/CanLoopback.zip

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

    尊敬的 Bob:

    在浏览您的示例代码后、我设法使其正常工作! 谢谢!