搜索
bottom↓
回复: 74

STM32————CAN总线学习贴(一):怎样设置CAN总线波特率 ?【恢复】

[复制链接]

出0入0汤圆

发表于 2008-12-25 09:48:42 | 显示全部楼层 |阅读模式
  目的:将can总线波特率设置为250k

    

 在官方的can例程上 给出了100k 查询 和500k 中断方式的例子 分别设置如下:

  CAN_Polling:

  /* CAN cell init */

  CAN_InitStructure.CAN_TTCM=DISABLE;

  CAN_InitStructure.CAN_ABOM=DISABLE;

  CAN_InitStructure.CAN_AWUM=DISABLE;

  CAN_InitStructure.CAN_NART=DISABLE;

  CAN_InitStructure.CAN_RFLM=DISABLE;

  CAN_InitStructure.CAN_TXFP=DISABLE;

  CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;

  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;

  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;

  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;

  CAN_InitStructure.CAN_Prescaler=5;

  CAN_Init(&CAN_InitStructure); 100k



  /* CAN cell init */   CAN_Interrupt

  CAN_InitStructure.CAN_TTCM=DISABLE;

  CAN_InitStructure.CAN_ABOM=DISABLE;

  CAN_InitStructure.CAN_AWUM=DISABLE;

  CAN_InitStructure.CAN_NART=DISABLE;

  CAN_InitStructure.CAN_RFLM=DISABLE;

  CAN_InitStructure.CAN_TXFP=DISABLE;

  CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack;

  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;

  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;

  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;

  CAN_InitStructure.CAN_Prescaler=1;

  CAN_Init(&CAN_InitStructure); //500k

  

  数据手册计算公式

   

 (原文件名:未命名.JPG) 

  设置:CAN_BS1_8tq CAN_BS2_7tq pclk=36m  产生250k波特率

  计算结果是 CAN_Prescaler=8   

  疑问: 100k 时CAN_Prescaler=5; 500k时CAN_Prescaler=1; 250k时 怎么会算出来 =8??

  请教大家该怎么设置?

 



--------------没人关注   先上传点资料作贡献--------------------------------

目录: 

  Can总线协议 中文版

   点击此处下载 ourdev_558404.pdf(文件大小:376K) (原文件名:can协议中文.pdf) 



  iCAN协议规范.ppt

  应用层协议介绍.ppt

  制定主从通讯协议.ppt

  总线错误及故障处理.ppt

点击此处下载 ourdev_558403.rar(文件大小:803K) (原文件名:CAN-bus开发与应用.rar) 

  -------------------------------------------------

   击此处下载 ourdev_558423.pdf(文件大小:278K) (原文件名:基于CAN总线的液压挖掘机分布式电子监控系统研究.pdf) 

点击此处下载 ourdev_558424.pdf(文件大小:174K) (原文件名:基于CAN总线技术的挖掘机电子控制系统设计.pdf) 

点击此处下载 ourdev_558425.pdf(文件大小:227K) (原文件名:挖掘机器人控制系统CAN总线接口.pdf) 

点击此处下载 ourdev_558426.pdf(文件大小:236K) (原文件名:基于CAN总线的挖掘机轨迹规划系统.pdf) 







  

  

  

本贴被 346675655 编辑过,最后修改时间:2008-12-25,13:33:54.

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2008-12-25 12:54:38 | 显示全部楼层
  问题太简单了?? 

  自己顶一个

出0入0汤圆

发表于 2008-12-25 13:15:24 | 显示全部楼层
我顶一个,正在学习

出0入0汤圆

发表于 2008-12-25 13:35:37 | 显示全部楼层
我也想知道

出0入0汤圆

 楼主| 发表于 2008-12-25 13:40:28 | 显示全部楼层
  之前16位的mcu can例程里都有各种给出波特率 的设置方案

 这个就俩波特率,不知道设置为250k 怎么设置



 -------------

  弱弱的说: 没搞明白这三个参数具体什么意思 想照猫画虎配置为250k  

   CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; 

    CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; 

    CAN_InitStructure.CAN_Prescaler=1; 



---------------

   看来不光自己一个人想知道这个问题阿 

   继续期待做过的 指点一下 

出0入0汤圆

发表于 2008-12-25 13:41:55 | 显示全部楼层
因为例程中的pclk=8m.

出0入0汤圆

发表于 2008-12-25 14:05:13 | 显示全部楼层
啥也不说,我就顶你,LZ,我最近也在整CAN,跟sja1000通信的,焦头烂额的

出0入0汤圆

发表于 2008-12-25 14:10:13 | 显示全部楼层
can时钟是RCC_APB1PeriphClock,你要注意CAN时钟频率

CAN波特率 = RCC_APB1PeriphClock/CAN_SJW+CAN_BS1+CAN_BS2/CAN_Prescaler;

如果CAN时钟为8M, CAN_SJW = 1,CAN_BS1 = 8,CAN_BS2 = 7,CAN_Prescaler = 2

那么波特率就是=8M/(1+8+7)/2=250K



本贴被 CoreHu 编辑过,最后修改时间:2008-12-25,14:46:39.

出0入0汤圆

 楼主| 发表于 2008-12-25 15:04:39 | 显示全部楼层
 

 回复楼上 

    那个公式是怎么得来的? 计算不出来

 按照数据手册上的公式为 

     can波特率 =1/( Tpclk*(BRP+1) +Tpclk*(BRP+1)*(TS2+1)+Tpclk*(BRP+1)*(TS1+1)

               =1/(Tpclk*(BRP+1)*(1+TS2+1+TS1+1))

               =Fpclk/((BRP+1)*(TS2+TS1+3))



     BRP =( Fpclk/(can波特率*(TS2+TS1+3))) -1     推了几遍都是这个结果

     若    Fpclk=8M  can波特率=250k  TS1+TS2+3=7+6+3=16

     BRP = 1    ????显然和例子中的不符  但不知道错在哪里 

 

 注stm32库中

  #define CAN_BS1_8tq                 ((u8)0x07)  /* 8 time quantum */

  #define CAN_BS2_7tq                 ((u8)0x06)  /* 7 time quantum */

出0入0汤圆

发表于 2008-12-25 15:22:05 | 显示全部楼层
CAN_Prescaler = brp+1

设置brp=1,即CAN_Prescaler=2

本贴被 CoreHu 编辑过,最后修改时间:2008-12-25,15:25:35.

出0入0汤圆

 楼主| 发表于 2008-12-25 15:36:56 | 显示全部楼层
  哦  确实是 



     CAN->BTR = (u32)((u32)CAN_InitStruct->CAN_Mode << 30) | ((u32)CAN_InitStruct->CAN_SJW << 24) |

               ((u32)CAN_InitStruct->CAN_BS1 << 16) | ((u32)CAN_InitStruct->CAN_BS2 << 20) |

               ((u32)CAN_InitStruct->CAN_Prescaler - 1);



  总结一下

  Fpclk=36M 时 can波特率为250k  的配置为

  

 /* CAN cell init */ 

  CAN_InitStructure.CAN_TTCM=DISABLE; 

  CAN_InitStructure.CAN_ABOM=DISABLE; 

  CAN_InitStructure.CAN_AWUM=DISABLE; 

  CAN_InitStructure.CAN_NART=DISABLE; 

  CAN_InitStructure.CAN_RFLM=DISABLE; 

  CAN_InitStructure.CAN_TXFP=DISABLE; 

  CAN_InitStructure.CAN_Mode=CAN_Mode_LoopBack; 

  CAN_InitStructure.CAN_SJW=CAN_SJW_1tq; 

  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq; 

  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq; 

  CAN_InitStructure.CAN_Prescaler=9; 

  CAN_Init(&CAN_InitStructure); 250k



感谢 【9楼】 CoreHu   



本贴被 346675655 编辑过,最后修改时间:2008-12-26,15:11:12.

出0入0汤圆

发表于 2008-12-25 16:16:05 | 显示全部楼层

出0入0汤圆

发表于 2008-12-27 10:57:54 | 显示全部楼层
10楼,是PCLK1为 36M时,才是你那样的设置,而不是  PCLK.

因为默认初始化的时候,CAN时钟是由PCLK1来提供,

所以在RCC函数里配置要注意系统时钟是由哪个(HSE或者PLL等)来提供,PCLK1分频是多少。

本贴被 caaron 编辑过,最后修改时间:2008-12-27,11:03:13.

出0入0汤圆

发表于 2008-12-27 12:07:51 | 显示全部楼层
mark

出10入95汤圆

发表于 2008-12-28 22:52:56 | 显示全部楼层
can的波特率非常灵活,计算方法没有摸透,不同的平台之间通讯老是算不准,距离远了就通不上,很郁闷啊

出0入4汤圆

发表于 2009-1-5 22:01:12 | 显示全部楼层
记号~

出0入0汤圆

发表于 2009-1-5 22:22:50 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-1-6 10:14:38 | 显示全部楼层
记号!!

出0入0汤圆

发表于 2009-1-16 14:10:43 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2009-6-16 14:08:06 | 显示全部楼层
记号

出0入0汤圆

发表于 2009-6-20 10:27:45 | 显示全部楼层
对头

出0入0汤圆

发表于 2009-6-24 16:22:21 | 显示全部楼层
void CAN_Configuration(void)
{
        CAN_InitTypeDef        CAN_InitStructure;
        CAN_FilterInitTypeDef  CAN_FilterInitStructure;

        /* CAN register init */
        CAN_DeInit();
        CAN_StructInit(&CAN_InitStructure);
       
        /* CAN cell init */
        CAN_InitStructure.CAN_TTCM=DISABLE;
        CAN_InitStructure.CAN_ABOM=DISABLE;
        CAN_InitStructure.CAN_AWUM=DISABLE;
        CAN_InitStructure.CAN_NART=DISABLE;
        CAN_InitStructure.CAN_RFLM=DISABLE;
        CAN_InitStructure.CAN_TXFP=DISABLE;
        CAN_InitStructure.CAN_Mode=CAN_Mode_Normal;
        CAN_InitStructure.CAN_SJW=CAN_SJW_1tq;
        CAN_InitStructure.CAN_BS1=CAN_BS1_9tq;
        CAN_InitStructure.CAN_BS2=CAN_BS2_8tq;
        CAN_InitStructure.CAN_Prescaler=200;
        CAN_Init(&CAN_InitStructure);
       
        /* CAN filter init */
        CAN_FilterInitStructure.CAN_FilterNumber=0;
        CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
        CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_16bit;
        CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000;
        CAN_FilterInitStructure.CAN_FilterIdLow=0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000;
        CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
        CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
        CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
        CAN_FilterInit(&CAN_FilterInitStructure);
}

拨特率10K,公式:72MHZ/2/(1+9+8)=0.01,即10K,和SJA1000测试通过

出0入0汤圆

发表于 2009-6-24 16:23:05 | 显示全部楼层
拨特率10K,公式:72MHZ/2/200/(1+9+8)=0.01,即10K,和SJA1000测试通过

出0入0汤圆

发表于 2009-7-3 21:20:15 | 显示全部楼层
MARK

出0入0汤圆

发表于 2009-7-23 17:54:01 | 显示全部楼层
感谢!

出0入4汤圆

发表于 2009-7-24 08:31:17 | 显示全部楼层
期待后续学习贴

出0入0汤圆

发表于 2009-8-3 11:16:02 | 显示全部楼层
120欧姆电阻要加上!!!

出0入0汤圆

发表于 2009-11-18 23:32:25 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-6-5 16:27:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-21 12:18:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-21 14:12:24 | 显示全部楼层
收藏CAN_BUS协议

出0入0汤圆

发表于 2010-6-21 17:03:23 | 显示全部楼层
acn

出0入0汤圆

发表于 2010-6-22 07:06:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-6-29 11:18:08 | 显示全部楼层
学习中,谢楼主

出0入0汤圆

发表于 2010-11-25 12:38:02 | 显示全部楼层
关注

出0入0汤圆

发表于 2010-11-29 10:46:43 | 显示全部楼层
每一位的Tq数目 = 1 (固定SYNC_SEG) +  8 (BS1) + 7 (BS2) = 16

如果CAN时钟是 8 MHz : (8M / 1 ) / 16 = 500K

出0入0汤圆

发表于 2010-12-5 20:47:30 | 显示全部楼层
先标记下!还未下载!!!!

出0入0汤圆

发表于 2010-12-25 14:18:21 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-2-27 19:31:13 | 显示全部楼层
3.3.0的库 PCLK1=36M,设置也是相同的啊 为什么呢

出0入0汤圆

发表于 2011-3-15 16:42:15 | 显示全部楼层
谢谢楼主解决大问题 好像CAN预分频不用+1做除数的啊,而TIM中的预分频是+1做除数

出0入0汤圆

发表于 2011-3-23 14:44:06 | 显示全部楼层
回复【10楼】346675655
  哦  确实是  
     can->btr = (u32)((u32)can_initstruct->can_mode << 30) | ((u32)can_initstruct->can_sjw << 24) |
               ((u32)can_initstruct->can_bs1 << 16) | ((u32)can_initstruct->can_bs2 << 20) |
               ((u32)can_initstruct->can_prescaler - 1);
  总结一下
  fpclk=36m 时 can波特率为250k  的配置为
   
/* can cell init */  
  can_initstructure.can_tt......
-----------------------------------------------------------------------

如果PCLK1 = 36M时要将can波特率设为500k,岂不是CAN_InitStructure.CAN_Prescaler = 4.5?
36M / (1 + 8 + 7) / 4.5 = 500k

出0入0汤圆

发表于 2011-4-15 12:42:12 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-15 12:42:27 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-4-22 10:32:25 | 显示全部楼层
我也很想知道!!!

出0入0汤圆

发表于 2011-4-23 16:42:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-2 14:00:12 | 显示全部楼层
学习学习

出0入0汤圆

发表于 2011-6-2 23:52:42 | 显示全部楼层
这是我的代码,供参考。


typedef  const struct {
  u8   SJW;
  u8   BS1;
  u8   BS2;
  u16  PreScale;
} tCAN_InitIterm;


const  tCAN_InitIterm  CAN_InitTab[]= {             // CLK=36MHz
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq,   6,     // 1M     36/6/6 =1M
   CAN_SJW_1tq, CAN_BS1_4tq , CAN_BS2_3tq,   5,     // 900K   36/8/5 =0.9
   CAN_SJW_1tq, CAN_BS1_5tq , CAN_BS2_3tq,   5,     // 800K   36/9/5 =0.8
   CAN_SJW_1tq, CAN_BS1_6tq , CAN_BS2_3tq,   6,     // 600K   36/10/6=0.6
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq,  12,     // 500K   
   CAN_SJW_1tq, CAN_BS1_5tq , CAN_BS2_3tq,  10,     // 400K   
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq,  20,     // 300K   36/6/20
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq,  24,     // 250K   
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq,  30,     // 200K   
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq,  40,     // 150K   36/6/40
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq,  48,     // 125K   36/6/48
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq,  60,     // 100K   
   CAN_SJW_1tq, CAN_BS1_4tq , CAN_BS2_3tq,  50,     //  90K   36/8/50 =0.09
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq,  75,     //  80K   
   CAN_SJW_1tq, CAN_BS1_6tq , CAN_BS2_3tq,  60,     //  60K   
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq, 120,     //  50K   
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq, 150,     //  40K  
   CAN_SJW_1tq, CAN_BS1_6tq , CAN_BS2_3tq, 120,     //  30K   
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq, 300,     //  20K      
   CAN_SJW_1tq, CAN_BS1_3tq , CAN_BS2_2tq, 600,     //  10K      最大分频1024
   CAN_SJW_2tq, CAN_BS1_6tq , CAN_BS2_4tq, 600,     //  5K   36/12/600=5K  
   CAN_SJW_2tq, CAN_BS1_6tq , CAN_BS2_4tq, 1000,    //  3K   36/12/1000
   CAN_SJW_2tq, CAN_BS1_10tq, CAN_BS2_6tq, 1000     //  2K   36/18/1000=2K  
};

出0入0汤圆

发表于 2011-6-16 10:53:20 | 显示全部楼层
Mark一下,谢谢楼上的各位解释啊,最近被CAN波特率搞得很晕

出0入0汤圆

发表于 2011-6-20 10:29:24 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-6-20 11:36:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-6-20 21:50:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-7-25 21:46:15 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-7-25 21:58:25 | 显示全部楼层
mark...

出0入0汤圆

发表于 2011-7-28 11:56:24 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2011-9-5 20:12:50 | 显示全部楼层
顶了,马克一下

出0入0汤圆

发表于 2011-9-26 10:28:05 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-10-13 14:55:59 | 显示全部楼层
不错!

出0入0汤圆

发表于 2011-10-15 16:20:00 | 显示全部楼层
帮了很大忙!

出0入0汤圆

发表于 2011-10-15 17:13:47 | 显示全部楼层
想不到 这么老得帖子又被顶了上来
呵呵  现在我都忘记怎么回事了 。。。
一般设置好了 没人去动得

出0入0汤圆

发表于 2011-10-25 10:57:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-27 14:30:34 | 显示全部楼层
mark~~~~

出0入0汤圆

发表于 2011-11-27 15:52:30 | 显示全部楼层
我也mark

出0入0汤圆

发表于 2011-12-24 20:42:46 | 显示全部楼层
mark  毕业设计做can总线

出50入0汤圆

发表于 2011-12-25 13:42:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-7 15:04:08 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-4-8 21:24:19 | 显示全部楼层
bycan挂在APB1总线上,所以总线上的can时钟频率是APB1总线的时钟频率,CAN波特率=CAN时钟频率/分频系数/(1+BS1+BS2),另外应尽可能把采样点设为CIA推荐的值。75%当波特率>800K。80%当波特率>500K。87.5%when 波特率<=500K。其中=BS1+1/BS1+BS2+1

出0入0汤圆

发表于 2012-9-20 19:59:24 | 显示全部楼层
先mark  明天看

出0入0汤圆

发表于 2012-9-27 21:57:26 | 显示全部楼层

出0入0汤圆

发表于 2012-11-13 23:11:42 | 显示全部楼层
记号

出0入0汤圆

发表于 2012-11-15 22:48:12 | 显示全部楼层
非常感谢楼主的分享,学习了!

出0入0汤圆

发表于 2013-7-12 17:40:39 | 显示全部楼层
顶一个!

出0入4汤圆

发表于 2013-7-24 20:37:22 | 显示全部楼层
谢谢楼主

出0入0汤圆

发表于 2022-5-26 10:32:28 | 显示全部楼层
关于采样点的设置为啥都不关心,采样点 = (BS1+1)/(BS1+BS2+1)。这个采样点的设置是否没啥影响
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 09:59

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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