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);
}