查看: 16929|回复: 8

[求助] K60CAN总线无法发送

[复制链接]

该用户从未签到

11

主题

49

帖子

0

中级会员

Rank: 3Rank: 3

积分
215
最后登录
1970-1-1
发表于 2015-1-6 14:37:30 | 显示全部楼层 |阅读模式
K60 CAN发送扩展帧不成功;请教大师!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! void CANInit(void){
         UInt8 i;
        // CAN0BaseAdd=CAN0_BASE_PTR;
         OSC_CR=0x80|0x02;  //使能CAN外部时钟
         SIM_SCGC6|=0x10;   //使能CAN0的时钟模块
        // SIM_SCGC3|=0x10;   //使能CAN1的时钟模块
         
     NVICICPR0 = (NVICICPR0 & ~(0x07<<29)) | (0x07<<29);//清除挂载在FlexCAN0的中断  
         NVICISER0 = (NVICISER0 & ~(0x07<<29)) | (0x07<<29);//使能FlexCAN0中断
                
         NVICICPR1 = (NVICICPR1 & ~(0x1F<<0)) | (0x1F);//清除挂载在FlexCAN0的中断                 
         NVICISER1 = (NVICISER1 & ~(0x1F<<0)) | (0x1F);//使能FlexCAN0中断
         
        // NVICICPR1 = (NVICICPR1 & ~(0xFF<<5)) | (0xFF<<5);//清除挂载在FlexCAN1的中断  
        // NVICISER1 = (NVICISER1 & ~(0xFF<<5)) | (0xFF<<5);//使能FlexCAN1中断   
         
         PORTB_PCR18 = 0X0203;//使能CAN0TX 使能上拉
         PORTB_PCR19 =0X0203 ; //使能CAN0RX 使能上拉
         
         //选择时钟源,外设时钟48MHz,内部时钟:12MHz
         CAN0_CTRL1|=0x00002000;
          CAN0_MCR |= CAN_MCR_FRZ_MASK;  //使能冻结模式   y
        // CAN0_MCR|=0x40000000;
         CAN0_MCR&= ~CAN_MCR_MDIS_MASK;//使能CAN模块 y
        // CAN0_MCR&=0x7FFFFFFF;
       
            //确认已退出冻结模式
     while((CAN_MCR_LPMACK_MASK & CAN0_MCR));// (((CAN_MCR) >> (20)) & 1)
    // while((CAN0_MCR >> 20) & 1);
            //软件复位
     CAN0_MCR ^= CAN_MCR_SOFTRST_MASK;
            //等待复位完成
     while(CAN_MCR_SOFTRST_MASK & CAN0_MCR);   
         //   while((CAN0_MCR >> 25) & 1);   //(CAN0_MCR >> 25) & 1
            //等待进入冻结模式
           // while(!((CAN0_MCR >> 24) & 1));//(CAN0_MCR >> 24) & 1
     while(!(CAN_MCR_FRZACK_MASK & CAN0_MCR));
            //将16个邮箱缓冲区内容清0
            for(i=0;i<16;i++)
            {
                    CAN0_BASE_PTR->MB[i].CS = 0x00000000;
                    CAN0_BASE_PTR->MB[i].ID = 0x00000000;
                    CAN0_BASE_PTR->MB[i].WORD0 = 0x00000000;
                    CAN0_BASE_PTR->MB[i].WORD1 = 0x00000000;
            }
             CAN0_MCR |= CAN_MCR_SRXDIS_MASK;  //禁止自发自收
             //配置相关的寄存器
             CAN0_CTRL2 &= ~CAN_CTRL2_EACEN_MASK; //接收邮箱过滤IDE匹配,RTR不匹配
             CAN0_CTRL2&= ~CAN_CTRL2_RRS_MASK;  //不自动产生远程请求帧产生
             CAN0_CTRL2 &= ~CAN_CTRL2_MRP_MASK;   //ID首先从邮箱中匹配

               //canx->CTRL1 |= CAN_CTRL1_LBUF_MASK;  //发送的时候从低Msg开始
            // CAN0_CTRL1 &= ~CAN_CTRL1_LBUF_MASK;   //发送的时候从低优先级发送                                          
             CAN0_CTRL1&= ~CAN_CTRL1_LPB_MASK;   //使用正常模式
             SetCANBand(250);
            // CAN0_CTRL1=CAN0_CTRL1|(0<<12);  //使用正常模式
             
                ////不屏蔽ID
              CAN0_RXMGMASK=0x0;
              CAN0_RX14MASK=0x0;
              CAN0_RX15MASK=0x0;         
             
              CAN0_MCR &=~( CAN_MCR_HALT_MASK);  //0x10000000u
              //等待直到退出冻结模式
                      while( CAN0_MCR& CAN_MCR_FRZACK_MASK);   
                      //等到不在冻结模式,休眠模式或者停止模式
                      while((CAN0_MCR & CAN_MCR_NOTRDY_MASK));
                   
             
}


UInt8 SetCANBand(UInt32 baudrateKHz)
{   

     switch (baudrateKHz)
     {

           case (250):
              if(CAN0_CTRL1 & CAN_CTRL1_CLKSRC_MASK)
              {               
                                 // 48M/(PRESDIV+1)= 3M sclock, 12Tq=(1+(PSEG1+1)+(PSEG2+1)+(PROPSEG+1))
                     //波特率=3M/12=250K
                                 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
                                 // RJW = 2, PSEG1 = 4, PSEG2 = 4, PRESDIV = 16
                                 CAN0_CTRL1 = (0 | CAN_CTRL1_PROPSEG(2)
                                                                                                | CAN_CTRL1_RJW(1)
                                                                                                | CAN_CTRL1_PSEG1(3)
                                                                                                | CAN_CTRL1_PSEG2(3)
                                                                                                | CAN_CTRL1_PRESDIV(15));
              }
              else
              {
                                 // 12M/4= 3M sclock, 12Tq
                                 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
                                 // RJW = 2, PSEG1 = 4, PSEG2 = 4, PRESDIV = 4
                                 CAN0_CTRL1= (0 | CAN_CTRL1_PROPSEG(2)
                                                                                                | CAN_CTRL1_RJW(1)
                                                                                                | CAN_CTRL1_PSEG1(3)
                                                                                                | CAN_CTRL1_PSEG2(3)
                                                                                                | CAN_CTRL1_PRESDIV(3));                  
              }
              break;
           case (500):
              if(CAN0_CTRL1 & CAN_CTRL1_CLKSRC_MASK)
              {               
                                 // 48M/8=6M sclock, 12Tq
                                 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
                                 // RJW = 2, PSEG1 = 4, PSEG2 = 4, PRESDIV = 6
                                 CAN0_CTRL1 = (0 | CAN_CTRL1_PROPSEG(2)
                                                                                                | CAN_CTRL1_RJW(1)
                                                                                                | CAN_CTRL1_PSEG1(3)
                                                                                                | CAN_CTRL1_PSEG2(3)
                                                                                                | CAN_CTRL1_PRESDIV(7));
              }
              else
              {
                                 // 12M/2=6M sclock, 12Tq
                                 // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
                                 // RJW = 2, PSEG1 = 4, PSEG2 = 4, PRESDIV = 2
                                 CAN0_CTRL1 = (0 | CAN_CTRL1_PROPSEG(2)
                                                 | CAN_CTRL1_RJW(1)
                                                 | CAN_CTRL1_PSEG1(3)
                                                 | CAN_CTRL1_PSEG2(3)
                                                 | CAN_CTRL1_PRESDIV(1));      
                                                                                              
              }
              break;


}
}
//此程序可写MB,但发送未完成,程序死在 while(!(CAN0_BASE_PTR->IFLAG1 & (1<<iMB)))循环中
  UInt8 CANSendData(UInt16 iMB, UInt32 id,UInt8 length,UInt8 Data[])
  {
         UInt8 i;
         UInt16  j;

      //以下四步骤为发送过程
         CAN0_BASE_PTR->MB[iMB].CS = ( (0x08&0x0000000F)<<24)//缓冲区写激活代码
                                                          | (1<<21)//缓冲区写IDE位
                                                          | (0<<20)//缓冲区写RTR位
                              |((length&0x0000000F)<<16);  //缓冲区写数据长度

      //缓冲区写ID
         CAN0_BASE_PTR->MB[iMB].ID = (1 <<30) | id;  

      //缓冲区写内容
         CAN0_BASE_PTR->MB[iMB].WORD0 =(UInt32)((Data[0]<<24)|(Data[1]<<16)|(Data[2]<<8)|Data[3]) ;
         CAN0_BASE_PTR->MB[iMB].WORD1 =(UInt32)((Data[4]<<24)|(Data[5]<<16)|(Data[6]<<8)|Data[7]) ;  

      //延迟
      for(i = 0;i < 100;i++);

      //通过制定的发送代码开始发送
      CAN0_BASE_PTR->MB[iMB].CS = (CAN0_BASE_PTR->MB[iMB].CS & ~(0x0F000000))
                                                          |   ( (0x0C&0x0000000F)<<24)//写激活代码
                                                          | ((length&0x0000000F)<<16);//缓冲区写数据长度

      //限时等待发送完成(如果使用中断则限时等待语句可删除)

      while(!(CAN0_IFLAG1 & (1<<iMB)))
      {
              if((j++)>0x1000)
                      return 1;
      }
      //清报文缓冲区中断标志
      CAN0_IFLAG1 = (1<<iMB);
      return 0;
  }

程序运行时我寄存器值如下:CAN0_MCR=0x4082000f   
CAN0_CTRL1=0x0f5b2002

CAN0_IFLAG1        0x00000000

CAN0_CTRL2        0x00c00000       

CAN0_CS0        0x0c280000       

CAN0_ID0        0x5801f456        //我在ID处写的是0x180156f4,为何变成这样了?

CAN0_WORD00        0x11223344
CAN0_WORD10       0x55667788 //数据都已经写入了但为何发不出来?       









我知道答案 目前已有8人回答
回复

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-1-6 17:33:00 | 显示全部楼层
能否说一下具体现象是什么,或者波形是如何?
回复 支持 反对

使用道具 举报

该用户从未签到

11

主题

49

帖子

0

中级会员

Rank: 3Rank: 3

积分
215
最后登录
1970-1-1
 楼主| 发表于 2015-1-6 18:39:03 | 显示全部楼层
示波器的波形很杂乱;300mv左右的电平,应该是什么都没发出来;想问下CAN发送有流程是什么,在写入数据之后是否还需要置别的寄存器
回复 支持 反对

使用道具 举报

该用户从未签到

124

主题

3600

帖子

0

金牌会员

Rank: 6Rank: 6

积分
5781
最后登录
1970-1-1
发表于 2015-1-13 10:13:37 | 显示全部楼层
跟你分享一个K60 CAN例程,你可以参考一下。 KINETIS512_SC.zip (7.06 MB, 下载次数: 375)
回复 支持 反对

使用道具 举报

该用户从未签到

57

主题

531

帖子

0

金牌会员

Rank: 6Rank: 6

积分
1356
最后登录
2016-12-5
发表于 2015-9-17 11:01:33 | 显示全部楼层
群主问题解决了吗?求开源代码
回复 支持 反对

使用道具 举报

该用户从未签到

7

主题

53

帖子

0

中级会员

Rank: 3Rank: 3

积分
232
最后登录
2016-6-28
发表于 2016-3-11 10:29:29 | 显示全部楼层
您好。我的现象跟您的一模一样,请问您最后是如何解决的呢?
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

2

帖子

0

新手上路

Rank: 1

积分
17
最后登录
2017-11-22
发表于 2017-9-26 10:36:35 | 显示全部楼层
我也是遇到的同样的问题,请问有解决的吗?
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

4

帖子

0

新手上路

Rank: 1

积分
27
最后登录
2019-4-24
发表于 2019-4-23 13:22:41 | 显示全部楼层
请问楼主解决了吗?
回复 支持 反对

使用道具 举报

该用户从未签到

0

主题

1

帖子

0

新手上路

Rank: 1

积分
20
最后登录
2021-11-15
发表于 2019-11-26 08:39:38 | 显示全部楼层
reignheart 发表于 2016-3-11 10:29
您好。我的现象跟您的一模一样,请问您最后是如何解决的呢?

大佬你好,请问这是什么原因?
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-9-7 23:36 , Processed in 0.101915 second(s), 29 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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