汽车电子技术william hill官网
直播中

赵狄

9年用户 43经验值
私信 关注
[问答]

请教一下飞思卡尔单片机MC9S12XET256芯片中MSCAN模块设置问题

在利用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);

}

  • 企业微信截图_15145092827775.png

回帖(3)

安勇攀

2017-11-6 10:37:23
这个比较简单,标准CAN ID是11位的,0x13E转换成二进制是0001 0011 1101,转换成二进制以后就很明显了。因为CanID寄存器是8位的
举报

魏海峰

2017-12-29 16:14:17
我在飞思卡尔官网上下载了是s12的数据手册
查看了寄存器,保存ID的寄存器有两个,都是8位的寄存器
而标准ID只有11位,高八位放在第一个寄存器,
剩下的三位保存在第二个寄存器的高三位,剩下的位保存RTE,IDE,剩下的都是预留位
CAN1TXIDR0 = (unsigned char)(msg.id>>3);这里右移三位且强制转换位UCHAR 相当于把ID
高8位保存到CAN1TXIDR0变量里
CAN1TXIDR1 = (unsigned char)(msg.id<<5);至于这个为啥左移5位就不是很清楚了,
楼主搞明白了分享一下啊
举报

大坏蛋黄帅帅56

2018-4-2 16:31:12
引用: 念经似的 发表于 2017-12-29 16:14
我在飞思卡尔官网上下载了是s12的数据手册
查看了寄存器,保存ID的寄存器有两个,都是8位的寄存器
而标准ID只有11位,高八位放在第一个寄存器,

其实你已经把所以然给说出来了,第二次左移是将ID中原本的低三位变为要存入寄存器中的高三位,再存入R1寄存器中
举报

更多回帖

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