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.
大家好、
我正在尝试创建一个用于 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 测试和进一步开发的理想选择。
再一次——简单的好帖子…… 祝您愉快。 (有些、轻微的第二语言能力...)
您好、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:
在浏览您的示例代码后、我设法使其正常工作! 谢谢!