查看: 2501|回复: 0

MC9S08DZ60芯片与CAN分析仪不能通信

[复制链接]

该用户从未签到

1

主题

5

帖子

0

新手上路

Rank: 1

积分
21
最后登录
2016-1-6
发表于 2016-1-6 12:33:52 | 显示全部楼层 |阅读模式
MC9S08DZ60芯片与CAN分析仪不能通信
下面是我的CAN配置程序 波特率设置500K,请帮忙解答一下 谢谢!
//#define TIME_SEGM1  4   /* Time Segment 1 = 5 */
//#define TIME_SEGM2  1   /* Time Segment 2 = 2 */
                        /* TSEG1 + TSEG2 + SYNCH_SEG = 8 time quantas */   
                        
/* Prescaler = CANCLK/(Baud rate * time quantas) = 8MHz/(500kHz * 8) = 2 */                                               
//#define CAN_PRESC   1   /* Baud rate prescaler = 1 */
//#define CAN_SYNJW   1   /* Sinchronization jump width = 2 clock cycles */
void MSCANInit(void)
{
  char sj,p;
  char t_seg1, t_seg2;
  if (CANCTL0_INITRQ==0)      // 查询是否进入初始化状态   
                 
    CANCTL0_INITRQ =1;       // 进入初始化状态
  
  while (CANCTL1_INITAK==0)  //等待进入初始化状态
   __RESET_WATCHDOG();
      
  sj = (CAN_SYNJW)<<6;
  p = (CAN_PRESC);
  
  // 设置 SJW 、Tq、 位时间长度等
  CANBTR0 = (sj|p); //设置同步及波特率
  
  t_seg1 = (TIME_SEGM1);
  t_seg2 = (TIME_SEGM2)<<4;
  
  // 设置 Time Segment 1 and 2
  CANBTR1 = (t_seg1 | t_seg2);  //时段1和时段2 的tp个数
    CANIDAC = 0x00;  //two 32-bit acceptance filters
//below is the set of acceptance filter  and its mask register,recieve all message (添加)
  CANIDAR0 = 0xff;//0xff;
  CANIDAR1 = 0xff;//0xff;
  CANIDAR2 = 0xff;
  CANIDAR3 = 0xff;
  CANIDAR4 = 0xff;//0xff;
  CANIDAR5 = 0xff;//0xf7;
  CANIDAR6 = 0xff;
  CANIDAR7 = 0xff;//添加
  // 关闭滤波器                                 
  CANIDMR0 = 0xFF;
  CANIDMR1 = 0xFF;
  CANIDMR2 = 0xFF;
  CANIDMR3 = 0xFF;
  CANIDMR4 = 0xFF;
  CANIDMR5 = 0xFF;
  CANIDMR6 = 0xFF;
  CANIDMR7 = 0xFF;     //
  
  // 使能MSCAN模块 设置为一般运行模式、使用内部时钟源
  CANCTL1 = 0x80;

   
  // 返回一般模式运行
  CANCTL0 = 0x00;
  
  // 等待回到一般运行模式
  while(CANCTL1_INITAK) __RESET_WATCHDOG();
     
  // 等待总线时钟同步
  while(CANCTL0_SYNCH==0) __RESET_WATCHDOG();
   
}
/////////////////////////////////////////////////////////////////////////////////////////
// MSCANSendMsg
// --------------------------------------------------------------------------------------
// MSCAN Send Message Routine
/////////////////////////////////////////////////////////////////////////////////////////
Bool MSCANSendMsg(struct can_msg msg)
{
  unsigned char n_tx_buf, i;
  
  // 检查数据长度
  if(msg.len > MAX_LEN)
    return(FALSE);
  // 检查总线时钟
  if(CANCTL0_SYNCH==0)
    return(FALSE);
  n_tx_buf = 0;
    // 寻找空闲的缓冲器
/* do
  {
  
    CANTBSEL=CANTFLG;
   
    n_tx_buf=CANTBSEL;
  }
  
  while(!n_tx_buf);  */
  if(CANTFLG_TXE)
   {
    CANTBSEL_TX=CANTFLG_TXE;
    n_tx_buf=1;
  }
  
  // 写入标识符
  CANTIDR0 = (unsigned char)(msg.id>>3);
  CANTIDR1 = (unsigned char)(msg.id<<5);
  
  if(msg.RTR)
    // RTR = 阴性
    CANTIDR1 |= 0x10;
   
  // 写入数据
  for(i = 0; i < msg.len; i++)
    *((&CANTDSR0)+i) = msg.data;
   
  // 写入数据长度
  CANTDLR = msg.len;
  
  // 写入优先级
  CANTTBPR = msg.prty;
  
  // 清 TXx 标志 (缓冲器准备发送)
  //CANTFLG = n_tx_buf;
  CANTFLG_TXE= CANTBSEL_TX; //
  CANTIER_TXEIE=CANTBSEL_TX;//添加调试
  return(TRUE);
  
}
/////////////////////////////////////////////////////////////////////////////////////////
// MSCANGetMsg
// --------------------------------------------------------------------------------------
// MSCAN Get Message Routine
/////////////////////////////////////////////////////////////////////////////////////////
Bool MSCANGetMsg(struct can_msg *msg)
{
  
  unsigned char i;
  // 检测接收标志
  if(!(CANRFLG&0x02))
    return(FALSE);
  
  // 检测 CAN协议报文模式 (一般/扩展) 标识符
  if(CANRIDR1&0x08)
    // IDE = Recessive (Extended Mode)
    return(FALSE);
  // 读标识符
  msg->id = (unsigned int)(CANRIDR0<<3) |
            (unsigned char)(CANRIDR1>>5);
  
  if(CANRIDR1&0x10)
    msg->RTR = TRUE;
  else
    msg->RTR = FALSE;
  
  // 读取数据长度
  msg->len = CANRDLR;
  
  // 读取数据
  for(i = 0; i < msg->len; i++)
    msg->data = *((&CANRDSR0)+i);
  // 清 RXF 标志位 (缓冲器准备接收)
  CANRFLG = 0x01;
  
  return(TRUE);
   
}
/////////////////////////////////////////////////////////////////////////////////////////
// MSCANCheckRcvdMsg
// --------------------------------------------------------------------------------------
// Verify if a new message is available in the Receiver Buffer Register
/////////////////////////////////////////////////////////////////////////////////////////
Bool MSCANCheckRcvdMsg(void)
{
  // 检测接收标志位
  if(CANRFLG&0x01)
    return(TRUE);
  else return(FALSE);
  
}

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-9-27 08:04 , Processed in 0.075908 second(s), 19 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表