查看: 3319|回复: 5

[求助] SOS--K10P100M72SF1RM--flexcan配置问题

[复制链接]

该用户从未签到

1

主题

7

帖子

0

限制会员

积分
-2
最后登录
2020-6-17
发表于 2014-2-28 18:06:06 | 显示全部楼层 |阅读模式
如下代码:这个波特率是采用k60的配置的,在测试过程中,只有83k和125k可以测通,其它波特率测不通,示波器看波形83k的是86k,125k的是130k;新手不知道怎么算的,sos大神,sos大牛。。。
补充说明:k60的开发板和我自己弄的板子都是使用50M的晶振,但是看例程里面k60是按48M来算can波特率的那些参数,而自己的k10却按48M算波特率却有误差,按50M就是正常的波特率,并且k10的500k和1m的波特率有误差。
    switch (baudrateKHz)
    {
          case (33): // 33.33K
             if(CAN_CTRL1_REG(CANBaseAdd) & CAN_CTRL1_CLKSRC_MASK)
             {
  // 48M/120= 400k sclock, 12Tq
  // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
  // RJW = 3, PSEG1 = 4, PSEG2 = 4,PRESDIV = 120
  CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
            | CAN_CTRL1_RJW(2)
            | CAN_CTRL1_PSEG1(3)
            | CAN_CTRL1_PSEG2(3)
            | CAN_CTRL1_PRESDIV(119));
             }
             else
             {
  // 12M/20= 600k sclock, 18Tq
  // PROPSEG = 1, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
  // RJW = 4, PSEG1 = 8, PSEG2 = 8,PRESDIV = 20
  CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(0)
            | CAN_CTRL1_PROPSEG(3)
                                               | CAN_CTRL1_PSEG1(7)
                                               | CAN_CTRL1_PSEG2(7)
                                               | CAN_CTRL1_PRESDIV(19));
             }
             break;
            
          case (83): // 83.33K
             if(CAN_CTRL1_REG(CANBaseAdd) & CAN_CTRL1_CLKSRC_MASK)
             {
  // 48M/48= 1M sclock, 12Tq
  // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
  // RJW = 3, PSEG1 = 4, PSEG2 = 4,PRESDIV = 48
  CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
      | CAN_CTRL1_RJW(2)
      | CAN_CTRL1_PSEG1(3)
      | CAN_CTRL1_PSEG2(3)
      | CAN_CTRL1_PRESDIV(47));
             }
             else
             {
     // 12M/12= 1M sclock, 12Tq
     // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 3, PSEG1 = 4, PSEG2 = 4,PRESDIV = 12
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
            | CAN_CTRL1_RJW(2)
            | CAN_CTRL1_PSEG1(3)
            | CAN_CTRL1_PSEG2(3)
            | CAN_CTRL1_PRESDIV(11));
             }
             break;
          case (50):
             if(CAN_CTRL1_REG(CANBaseAdd) & CAN_CTRL1_CLKSRC_MASK)
             {               
     // 48M/80= 0.6M sclock, 12Tq
     // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 3, PSEG1 = 4, PSEG2 = 4, PRESDIV = 40
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
            | CAN_CTRL1_RJW(1)
            | CAN_CTRL1_PSEG1(3)
            | CAN_CTRL1_PSEG2(3)
            | CAN_CTRL1_PRESDIV(79));
             }
             else
             {
     // 12M/20= 0.6M sclock, 12Tq
     // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 3, PSEG1 = 4, PSEG2 = 4, PRESDIV = 20                
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
            | CAN_CTRL1_RJW(2)
            | CAN_CTRL1_PSEG1(3)
            | CAN_CTRL1_PSEG2(3)
            | CAN_CTRL1_PRESDIV(19));                  
             }
             break;
          case (100):
             if(CAN_CTRL1_REG(CANBaseAdd) & CAN_CTRL1_CLKSRC_MASK)
             {
     // 48M/40= 1.2M sclock, 12Tq
     // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 3, PSEG1 = 4, PSEG2 = 4, PRESDIV = 40
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
            | CAN_CTRL1_RJW(2)
            | CAN_CTRL1_PSEG1(3)
            | CAN_CTRL1_PSEG2(3)
            | CAN_CTRL1_PRESDIV(39));
             }
             else
             {
     // 12M/10= 1.2M sclock, 12Tq
     // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 3, PSEG1 = 4, PSEG2 = 4, PRESDIV = 10
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
            | CAN_CTRL1_RJW(2)
            | CAN_CTRL1_PSEG1(3)
            | CAN_CTRL1_PSEG2(3)
            | CAN_CTRL1_PRESDIV(9));                  
             }
             break;
          case (125):
             if(CAN_CTRL1_REG(CANBaseAdd) & CAN_CTRL1_CLKSRC_MASK)
             {                
     // 48M/32= 1.5M sclock, 12Tq
     // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 3, PSEG1 = 4, PSEG2 = 4, PRESDIV = 32
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
               | CAN_CTRL1_RJW(2)
               | CAN_CTRL1_PSEG1(3)
               | CAN_CTRL1_PSEG2(3)
               | CAN_CTRL1_PRESDIV(31));
             }
             else
             {
     // 12M/8= 1.5M sclock, 12Tq
     // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 3, PSEG1 = 4, PSEG2 = 4, PRESDIV = 8
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
            | CAN_CTRL1_RJW(2)
            | CAN_CTRL1_PSEG1(3)
            | CAN_CTRL1_PSEG2(3)
            | CAN_CTRL1_PRESDIV(7));                 
             }
             break;
          case (250):
             if(CAN_CTRL1_REG(CANBaseAdd) & CAN_CTRL1_CLKSRC_MASK)
             {               
     // 48M/16= 3M sclock, 12Tq
     // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 2, PSEG1 = 4, PSEG2 = 4, PRESDIV = 16
     CAN_CTRL1_REG(CANBaseAdd) = (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
     CAN_CTRL1_REG(CANBaseAdd) = (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(CAN_CTRL1_REG(CANBaseAdd) & 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
     CAN_CTRL1_REG(CANBaseAdd) = (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
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
            | CAN_CTRL1_RJW(1)
            | CAN_CTRL1_PSEG1(3)
            | CAN_CTRL1_PSEG2(3)
            | CAN_CTRL1_PRESDIV(1));                  
             }
             break;
          case (1000):
             if(CAN_CTRL1_REG(CANBaseAdd) & CAN_CTRL1_CLKSRC_MASK)
             {                 
     // 48M/6=8M sclock
     // PROPSEG = 4, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 1, PSEG1 = 1, PSEG2 = 2, PRESCALER = 6
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(3)
            | CAN_CTRL1_RJW(0)
            | CAN_CTRL1_PSEG1(0)
            | CAN_CTRL1_PSEG2(1)
            | CAN_CTRL1_PRESDIV(5));
             }
             else
             { 
     // 12M/1=12M sclock,12Tq
     // PROPSEG = 3, LOM = 0x0, LBUF = 0x0, TSYNC = 0x0, SAMP = 1
     // RJW = 4, PSEG1 = 4, PSEG2 = 4, PRESCALER = 1
     CAN_CTRL1_REG(CANBaseAdd) = (0 | CAN_CTRL1_PROPSEG(2)
            | CAN_CTRL1_RJW(3)
            | CAN_CTRL1_PSEG1(3)
            | CAN_CTRL1_PSEG2(3)
            | CAN_CTRL1_PRESDIV(0));
             }
             break;
          default:
             return 1;
       }
我知道答案 目前已有4人回答
回复

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-3-3 14:06:39 | 显示全部楼层

RE:SOS--K10P100M72SF1RM--flexcan配置问题

楼主,你好!
我首先来回答你为什么K60按48M测试无误差,但是你按照48M测试确有误差。
因为K60的代码在系统配置的时候就将主频配置为96M,外设时钟配置为48M,而CAN的时钟来源选择为bus clock,所以这里的配置是正确的。
但是你按48M算,你是否将外设频率配置到了48M呢?你的主频应该是100M,而外设频率是50Mhz。
至于具体的波特率是否测的通,我这边需要验证一下。
等我验证完,会给您回复!
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

7

帖子

0

限制会员

积分
-2
最后登录
2020-6-17
 楼主| 发表于 2014-3-3 14:26:31 | 显示全部楼层

回复:SOS--K10P100M72SF1RM--flexcan配置问题

没错,我这里后来测试了,是按照100m来的,但是重新按100m计算后,k10的33、50、83、125、250的用示波器看,波特率都没啥误差,但是后面的500和1000的就不行了。
回复 支持 反对

使用道具 举报

该用户从未签到

1

主题

7

帖子

0

限制会员

积分
-2
最后登录
2020-6-17
 楼主| 发表于 2014-3-3 14:51:34 | 显示全部楼层

回复:SOS--K10P100M72SF1RM--flexcan配置问题

测试96M和100M发现,96M的各个波特率都能正常,100M(换了PRESDIV值)的500和1000的不行,其它波特率下可以,一直对飞思卡尔的can的波特率参数计算不是很明白(模模糊糊);不知道能不能详细说下怎么计算得来的参数;比如下面这些数据是怎么计算来的:
CAN_CTRL1_PROPSEG(2)
CAN_CTRL1_RJW(1)
CAN_CTRL1_PSEG1(3)
CAN_CTRL1_PSEG2(3)
CAN_CTRL1_PRESDIV(7))
还有sclock这个数值的计算。好让我等新手知其所以然。
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-3-3 15:14:41 | 显示全部楼层

RE:SOS--K10P100M72SF1RM--flexcan配置问题

我找找相关资料,稍等!
回复 支持 反对

使用道具 举报

该用户从未签到

145

主题

4926

帖子

0

金牌会员

Rank: 6Rank: 6

积分
9267
最后登录
1970-1-1
发表于 2014-3-4 16:51:45 | 显示全部楼层

回复:SOS--K10P100M72SF1RM--flexcan配置问题

回复第 4 楼 于2014-03-03 14:51:34发表:
测试96M和100M发现,96M的各个波特率都能正常,100M(换了PRESDIV值)的500和1000的不行,其它波特率下可以,一直对飞思卡尔的can的波特率参数计算不是很明白(模模糊糊);不知道能不能详细说下怎么计算得来的参数;比如下面这些数据是怎么计算来的:
CAN_CTRL1_PROPSEG(2)
CAN_CTRL1_RJW(1)
CAN_CTRL1_PSEG1(3)
CAN_CTRL1_PSEG2(3)
CAN_CTRL1_PRESDIV(7))
还有sclock这个数值的计算。好让我等新手知其所以然。
 

不好意思,回复迟了。
楼主请看我们这个应用笔记,讲的比较清楚:
AN1798.pdf (507.19 KB, 下载次数: 42)
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-7-19 01:28 , Processed in 0.106873 second(s), 27 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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