mc9s12xep100芯片调试CAN通讯,我现在是把CAN的发送函数写好了,怎么从中断发送出去?

2019-07-15 17:09发布

本人是新手一枚,最近适用mc9s12xep100芯片调试CAN通讯,恳求大牛指点呀!!!我现在是把CAN的发送函数写好了,但是不知道怎么从中断发送出去
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
lhf2013803
1楼-- · 2019-07-15 22:14
main函数里初始化CAN配置,使能中断,死循环里赋值发送数据,调用发送函数,即可发出。
/*************************************************************/
/*                        初始化CAN0                         */
/*************************************************************/
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);

}
void main(void) {
  DisableInterrupts;
  INIT_PLL();
  INIT_CAN0();
  EnableInterrupts;

//填写报文内容
  msg_send.id = ID;
  for(k=0;k<data_len_TX;k++)
  {
     msg_send.data[k] = senddata[k];
  }
  msg_send.len = data_len_TX;
  msg_send.RTR = FALSE;
  msg_send.prty = 0;

  for(;;)
  {
      delay1ms(500);
      if(!MSCAN0SendMsg(msg_send)) //发送过程出现错误
          for(;;);

  }
}


一周热门 更多>