NXP MCU 技术william hill官网
直播中

kintogan

12年用户 15经验值
擅长:模拟技术
私信 关注
[问答]

MC9S12XET256 CAN通信不正常

MC9S12XET256 CAN程序
void INIT_CAN0(void)
{
if(CAN0CTL0_INITRQ==0) // 查询是否进入初始化状态
CAN0CTL0_INITRQ =1; // 进入初始化状态

while (CAN0CTL1_INITAK==0); //等待进入初始化状态

CAN0BTR0_SJW = 0; //设置同步
CAN0BTR0_BRP = 7; //设置波特率
CAN0BTR1 = 0x1c; //设置时段1和时段2的Tq个数 ,总线频率为250kb/s

// 关闭滤波器
CAN0IDMR0 = 0xFF;
CAN0IDMR1 = 0xFF;
CAN0IDMR2 = 0xFF;
CAN0IDMR3 = 0xFF;
CAN0IDMR4 = 0xFF;
CAN0IDMR5 = 0xFF;
CAN0IDMR6 = 0xFF;
CAN0IDMR7 = 0xFF;

CAN0CTL1 = 0xC0; //使能MSCAN模块,设置为一般运行模式、使用总线时钟源

CAN0CTL0 = 0x00; //返回一般模式运行

while(CAN0CTL1_INITAK); //等待回到一般运行模式

while(CAN0CTL0_SYNCH==0); //等待总线时钟同步

CAN0RIER_RXFIE = 0; //禁止接收中断
}

//
/
CAN0发送 /
/
/
Bool MSCAN0SendMsg(struct can_msg msg)
{
unsigned char send_buf, sp;

// 检查数据长度
if(msg.len > 8)
return(FALSE);

// 检查总线时钟
if(CAN0CTL0_SYNCH==0)
return(FALSE);

send_buf = 0;
do
{
// 寻找空闲的缓冲器
CAN0TBSEL=CAN0TFLG;
send_buf=CAN0TBSEL;
}

while(!send_buf);

// 写入标识符
CAN0TXIDR0 = (unsigned char)(msg.id>>3);
CAN0TXIDR1 = (unsigned char)(msg.id<<5);

if(msg.RTR)
// RTR = 阴性
CAN0TXIDR1 |= 0x10;

// 写入数据
for(sp = 0; sp < msg.len; sp++)
*((&CAN0TXDSR0)+sp) = msg.data[sp];

// 写入数据长度
CAN0TXDLR = msg.len;

// 写入优先级
CAN0TXTBPR = msg.prty;

// 清 TXx 标志 (缓冲器准备发送)
CAN0TFLG = send_buf;

return(TRUE);

}
在发程序中,// 检查总线时钟
if(CAN0CTL0_SYNCH==0)
return(FALSE); 出错,返回0,请高手指点

回帖(2)

阿信509

2023-11-22 11:58:25
先用网上的例程,通讯正常后再修改成自己想要的
举报

wufan931111

2023-11-29 11:31:07
0xFF;CAN0IDMR7 = 0xFF;CAN0IDAR0 = 0x00;CAN0IDAR1 = 0x00;CAN0IDAR2 = 0x00;CAN0IDAR3 = 0x00;CAN0IDAR4 = 0x00;CAN0IDAR5 = 0x00;CAN0IDAR6 = 0x00;CAN0IDAR7 = 0x00;CAN0IDAR8 = 0x00;CAN0IDMR0 = 0x00;CAN0IDMR1 = 0x00;CAN0IDMR2 = 0x00;CAN0IDMR3 = 0x00;CAN0IDMR4 = 0x00;CAN0IDMR5 = 0x00;CAN0IDMR6 = 0x00;CAN0IDMR7 = 0x00;CAN0CTL1_CANE=1;CAN0CTL0_INITRQ=0;  // 退出初始化状态while (CAN0CTL1_INITAK==1);  // 等待退出初始化状态}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分