OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 11235|回复: 11

CAN控制器的波特率可以重复设置吗?

[复制链接]

67

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2011-11-15
在线时间
4 小时
发表于 2012-3-30 15:57:15 | 显示全部楼层 |阅读模式
CAN控制器的波特率可以重复设置吗?就是在一个程序中设置两次波特率。后面设置的波特率有用吗?可以修改第一次的波特率吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-3-30 16:38:25 | 显示全部楼层
回复 支持 反对

使用道具 举报

54

主题

248

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2012-3-23
在线时间
0 小时
发表于 2012-3-30 21:06:56 | 显示全部楼层
试一下,不就知道了。
从心所欲
回复 支持 反对

使用道具 举报

67

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2011-11-15
在线时间
4 小时
 楼主| 发表于 2012-3-31 09:00:19 | 显示全部楼层
回复【3楼】楚地狂生:
---------------------------------
我试了好像不行,所以来问问情况,求证一下
回复 支持 反对

使用道具 举报

2

主题

1436

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2209
金钱
2209
注册时间
2010-12-16
在线时间
190 小时
发表于 2012-3-31 18:13:51 | 显示全部楼层
要在初始化模式,才能修改波特率和时间片。
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

67

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2011-11-15
在线时间
4 小时
 楼主| 发表于 2012-4-5 10:52:45 | 显示全部楼层
确实可以修改,问题就在于一个运算符的优先级上,就是!CANCTL1&0x01这句的问题,导致第二次无法进入初始化模式所以就不能呢个修改。后来改为!(CANCTL1&0x01)就好了
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-5 11:02:27 | 显示全部楼层
能否上传工程给需要的朋友参考?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

67

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2011-11-15
在线时间
4 小时
 楼主| 发表于 2012-4-5 13:24:11 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
我可以把关于CAN的上传,但是不是stm芯片的,而是飞思卡尔的一款单片机,可以吗?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-5 13:44:27 | 显示全部楼层
都可以.
回复 支持 反对

使用道具 举报

67

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2011-11-15
在线时间
4 小时
 楼主| 发表于 2012-4-5 14:02:29 | 显示全部楼层
参数:usBaudRate为要设的波特率,stInit是一个结构体

unsigned char sj,p;
    unsigned char t_seg1, t_seg2;
    unsigned char BRP = stInit.ucBaudRate;
    unsigned int  uiDMR = 0, uiDAR = 0;

  
    //使能CAN
    CANCTL1_CANE = 1;   

       
    //进入初始化模式
    if (!(CANCTL1&0x01))                   
        CANCTL0 =0x01;
    
    // 确认是否进入初始化模式
    while (!(CANCTL1&0x01));
      
   
   
//********************* 设置ID过滤器****************************************  
    switch(stInit.ucFilterMode)
    {
        case 0:
        {   // Disables all the Filters            
            CANIDMR0 = 0xFF;
            CANIDMR1 = 0xFF;
            CANIDMR2 = 0xFF;
            CANIDMR3 = 0xFF;
            CANIDMR4 = 0xFF;
            CANIDMR5 = 0xFF;
            CANIDMR6 = 0xFF;
            CANIDMR7 = 0xFF;
            break;
        }
        case 1:
        {   
            //Abales Filter0;                              
            CANIDAC_IDAM0  = 1; 
            CANIDAC_IDAM1  = 0;                
            if(stInit.uiFilterID1 == 0 || stInit.uiFilterID2 == 0)
            {
                uiDAR = stInit.uiFilterID1 | stInit.uiFilterID2;
                uiDMR = 0;
            }
            else
            {                
                uiDAR = stInit.uiFilterID1; 
                uiDMR = stInit.uiFilterID1 ^ stInit.uiFilterID2;                 
            }
            CANIDAR0 = (unsigned char)(uiDAR >> 3);
            CANIDAR1 = (uiDAR & 0x07) << 5;
            CANIDMR0 = (unsigned char)(uiDMR >> 3);
            CANIDMR1 = ((uiDMR & 0x07) << 5) | 0x1f;

            CANIDAR2 = 0;
            CANIDAR3 = 0;
            CANIDMR2 = 0x00;
            CANIDMR3 = 0x1f;

            if(stInit.uiFilterID3 == 0 || stInit.uiFilterID4 == 0)
            {
                uiDAR = stInit.uiFilterID3 | stInit.uiFilterID4;
                uiDMR = 0;
            }
            else
            {                
                uiDAR = stInit.uiFilterID3; 
                uiDMR = stInit.uiFilterID3 ^ stInit.uiFilterID4;                                 
            }
            CANIDAR4 = (unsigned char)(uiDAR >> 3);
            CANIDAR5 = (uiDAR & 0x07) << 5;
            CANIDMR4 = (unsigned char)(uiDMR >> 3);
            CANIDMR5 = ((uiDMR & 0x07) << 5) | 0x1f;

            CANIDAR6 = 0;
            CANIDAR7 = 0;
            CANIDMR6 = 0x00;
            CANIDMR7 = 0x1f;          
            break;
        }
       }
//设置波特率
    switch(usBaudRate)         
     {
    
case BAUDRATE_50K:
sj=(SJW_50K-1)<<6;
p=(PRE_50K-1);
t_seg1=(T_SEG1_50K-1);
t_seg2=(T_SEG2_50K-1)<<4;
break;
case BAUDRATE_100K:
sj=(SJW_100K-1)<<6;
p=(PRE_100K-1);
t_seg1=(T_SEG1_100K-1);
t_seg2=(T_SEG2_100K-1)<<4;
break;

case BAUDRATE_125K:
sj=(SJW_125K-1)<<6;
p=(PRE_125K-1);
t_seg1=(T_SEG1_125K-1);
t_seg2=(T_SEG2_125K-1)<<4;
break;

case BAUDRATE_250K:
sj=(SJW_250K-1)<<6;
p=(PRE_250K-1);
t_seg1=(T_SEG1_250K-1);
t_seg2=(T_SEG2_250K-1)<<4;
break;
case BAUDRATE_500K:
sj=(SJW_500K-1)<<6;
p=(PRE_500K-1);
t_seg1=(T_SEG1_500K-1);
t_seg2=(T_SEG2_500K-1)<<4;
break;
case BAUDRATE_800K:
sj=(SJW_800K-1)<<6;
p=(PRE_800K-1);
t_seg1=(T_SEG1_800K-1);
t_seg2=(T_SEG2_800K-1)<<4;
break;
case BAUDRATE_1000K:
sj=(SJW_1000K-1)<<6;
p=(PRE_1000K-1);
t_seg1=(T_SEG1_1000K-1);
t_seg2=(T_SEG2_1000K-1)<<4;
break;

default:
break;
     }

    //选择时钟源
    CANCTL1_CLKSRC=0;
    // 设置SJW和Tq clock分频器
    CANBTR0 = (sj|p);      
    // 设置时间段1和时间段2
    CANBTR1 = (t_seg1 | t_seg2);

     CANCTL1 = 0x84;                    // 设置CAN的loop功能
    if(stInit.ucLoopEnable == 1)
        CANCTL1_LOOPB = 1;         
    else
        CANCTL1_LOOPB = 0;          

      CANCTL0 = 0x00;                 // 让CAN进入正常运行模式
    while(CANCTL1&0x01);            // 确认CAN进入正常模式

    while(!(CANCTL0&0x10));         //等待CAN同步
    CANRIER_RXFIE = 1;              // 使能接收中断
回复 支持 反对

使用道具 举报

67

主题

151

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2011-11-15
在线时间
4 小时
 楼主| 发表于 2012-4-5 14:04:59 | 显示全部楼层
代码不方便完全上传,不过这部分就是整个CAN初始化的一个过程了。当然代码不完善,还有许多要改进的地方。如果有什么问题可以一起讨论,共同进步。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-4-5 14:06:55 | 显示全部楼层
谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 10:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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