打印

求教can

[复制链接]
2416|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jacklong0541|  楼主 | 2009-5-21 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家帮我看下,我设置的对吗?现在收发都出错。
void CANInit(void)
{
    DDRM_DDRM2=0;
    DDRM_DDRM3=0;
    DDRM_DDRM4=0;
    DDRM_DDRM5=0; // PM[2:5]设置为输入,即设置为通用I/O口,避免CAN0的重复
    CAN0CTL0=0x01;//设置为初始状态
  while ((CAN0CTL1 &0x01)== 0)
    {
    }  //确保CAN0处于初始状态,即CAN0CTL1_INITAK=1
    CAN0CTL1=0x80; //MSCAN12模块使能
   
    CAN0BTR0 = CAN0BTR0V;    //同步跳转宽度为1,预分频因子为5
    CAN0BTR1 = CAN0BTR1V;    //将位速率设置成 197kbps
    
    CAN0IDAC = CAN0IDACV;    //两个32位验收过滤器
   
    CAN0IDAR0 = CAN0IDAR0V;    //给接收验证码寄存器0-1赋值
    CAN0IDAR1 = CAN0IDAR1V;
    CAN0IDMR0 = CAN0IDMR0V;    //给接收验证屏蔽寄存器0-1赋值
    CAN0IDMR1 = CAN0IDMR1V;
    //CAN0TIER = CAN0TIERV;      //设置中断方式
    //CAN0TIER = CAN0TIERV;
    
    CAN0CTL0=0x00;;   //INITRQ=0,退出初始化模式
    //等待应答
    while ((CAN0CTL1 & 0x01) == 1)
    {
    }
}

//CANSND1DFRM:CAN发送1帧数据-----------------------------------------------*
//功  能:CAN发送1帧数据(数据长度<=8)                                       *
//参  数:ID---报文标识符                                                   *
//       DataBUF---报文数据区首址                                          *
//       LEN---报文数据长度                                                *
//返  回:INT8U CANsnd1DFrm --- 发送成功与否标志,                          *
//       =0,没有空闲发送缓冲区,发送不成功;=1,发送成功                  *
//说明:在发送数据之前,先查询是否有空闲发送缓冲区,若无则不能发送,返回0   *
//-------------------------------------------------------------------------*
INT8U CANSND1DFRM(INT8U * DataBUF )
{
    INT8U BufferSelect;
    INT8U BufferFlag1;
    INT8U i;
    INT8U LEN;
    INT8U x_value=0;
    INT8U * addr;               //发送缓冲区
    INT8U BufNum = 0xFF;        //空闲的发送缓冲区号
    //BufNum = GetSNDBUF();       //查找空闲的发送缓冲区   
    while (CAN0T**==0x00)
    {
       PTH_PTH6=1;
      DelayXms(1000);
     
      PTH_PTH6=0;
      DelayXms(1000);//延时,稳定
      
      PTH_PTH6=1;
      DelayXms(1000);
     
      PTH_PTH6=0;
    
    }  //确保有发送缓冲器为空
    BufferFlag1=CAN0T**;//读出发送缓冲器标志寄存器的内容
    CAN0TBSEL=BufferFlag1;//用以赋值发送缓冲器选择寄存器
    
    addr=(INT8U *)(&CAN0TXF);  //获得发送前台缓冲区首地址 
    //---------------------------------------------------------------------
    //将报文按CAN格式进行封装并存入空闲发送缓冲区等待发送
   addr[0] = ascii2byte(++DataBUF); //11位报文标识符高8位
    addr[0] <<=4;
    addr[0] += ascii2byte(++DataBUF);
    addr[1] = ascii2byte(++DataBUF);    //低3位
    addr[1] <<=5;
    addr[1] &= ~(1 << RTR);     //RTR=0,数据帧
    addr[1] &= ~(1 << IDE);     //IDE位=0 
    LEN= ascii2byte(++DataBUF);    
    for(i = 0; i < LEN; i++) 
    {
      DataBUF++;
      addr[i+4] = ascii2byte(DataBUF); //数据赋值
      addr[i+4]<<=4;
      DataBUF++;
      addr[i+4]+=ascii2byte(DataBUF);   
    }
         addr[12] = LEN&0x0f;             //数据长度
        
    //---------------------------------------------------------------------
    //发送缓冲区相应TXE位写1清除该位来通知MSCAN12发送数据
    BufferSelect=CAN0TBSEL;
    CAN0T**=BufferSelect;
    DelayXms(1000);//延时,稳定
      
      
    
}

相关帖子

沙发
ssoftboy| | 2009-5-21 18:13 | 只看该作者

CAN程序很Easy

1.很少有人用PE生成代码用在产品中
2.手写CAN的代码也很简单,你可以从AN里找示例代码来改

使用特权

评论回复
板凳
开芯行者| | 2009-5-30 17:45 | 只看该作者

同样问题

我和你问题基本一样,同情。PM口不用设置,因为CAN使能有优先权,会自动完成的。 建议用示波器查一下,是波特率的问题,还是没有发出信号。发送数据可设0x55,如正确发送,可见一方波信号。我的问题是用示波器检测信号正常,但波特率一直不对。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

3

帖子

0

粉丝