完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
在利用MC9S12XET256芯片进行CAN通讯设置中,CAN发送中设置ID的操作语句看不懂想请教大家,
设置语句如下: // 写入标识符 CAN1TXIDR0 = (unsigned char)(msg.id>>3); CAN1TXIDR1 = (unsigned char)(msg.id<<5); 不懂为什么在设置时需要右移3位赋给IDR0,然后左移5位赋给IDR1,就实现了发送消息时ID的写入,请懂的介绍一下,谢谢!比如ID = 0x13E。 完整发送代码如下: Bool MSCAN0SendMsg(struct can_msg msg) { unsigned char send_buf, sp; // 检查数据长度 if(msg.len > 8) return(FALSE); // 检查总线时钟 if(CAN1CTL0_SYNCH==0) return(FALSE); send_buf = 0; do { // 寻找空闲的缓冲器 CAN1TBSEL=CAN1TFLG; send_buf=CAN1TBSEL; } while(!send_buf); // 写入标识符 CAN1TXIDR0 = (unsigned char)(msg.id>>3); CAN1TXIDR1 = (unsigned char)(msg.id<<5); if(msg.RTR) // RTR = 阴性 CAN1TXIDR1 |= 0x10; // 写入数据 for(sp = 0; sp < msg.len; sp++) *((&CAN1TXDSR0)+sp) = msg.data[sp]; // 写入数据长度 CAN1TXDLR = msg.len; // 写入优先级 CAN1TXTBPR = msg.prty; // 清 TXx 标志 (缓冲器准备发送) CAN1TFLG = send_buf; return(TRUE); }
|
|
相关推荐
3个回答
|
|
这个比较简单,标准CAN ID是11位的,0x13E转换成二进制是0001 0011 1101,转换成二进制以后就很明显了。因为CanID寄存器是8位的
|
|
|
|
我在飞思卡尔官网上下载了是s12的数据手册
查看了寄存器,保存ID的寄存器有两个,都是8位的寄存器 而标准ID只有11位,高八位放在第一个寄存器, 剩下的三位保存在第二个寄存器的高三位,剩下的位保存RTE,IDE,剩下的都是预留位 CAN1TXIDR0 = (unsigned char)(msg.id>>3);这里右移三位且强制转换位UCHAR 相当于把ID 高8位保存到CAN1TXIDR0变量里 CAN1TXIDR1 = (unsigned char)(msg.id<<5);至于这个为啥左移5位就不是很清楚了, 楼主搞明白了分享一下啊 |
|
|
|
其实你已经把所以然给说出来了,第二次左移是将ID中原本的低三位变为要存入寄存器中的高三位,再存入R1寄存器中 |
|
|
|
只有小组成员才能发言,加入小组>>
1885 浏览 0 评论
5121 浏览 2 评论
8334 浏览 1 评论
3329 浏览 1 评论
7299 浏览 0 评论
新能源车维修技术交流,维修技术思维导图指南(12-09持继更新,分享原文件)
4325浏览 3评论
2135浏览 3评论
1003浏览 1评论
《新能源车维修技术自学,链接汇总AI智能分类》超4000案例
5790浏览 1评论
1757浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 09:46 , Processed in 1.236731 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号