历史上的今天
返回首页

历史上的今天

今天是:2024年10月08日(星期二)

正在发生

2019年10月08日 | STM32 CAN 波特率的计算

2019-10-08 来源:eefocus

STM32里的CAN 支持2.0A,2.0B, 带有FIFO,中断等, 这里主要提一下内部的时钟应用.

bxCAN挂接在APB1总线上,采用总线时钟,所以我们需要知道APB1的总线时钟是多少. 我们先看看下图,看看APB1总线时钟:


APB1时钟取自AHB的分频, 而AHB又取自系统时钟的分频, 系统时钟可选HSI,HSE, PLLCLK, 这个在例程的RC设置里都有的,


总线时钟MHz   (3+TS1+TS2)*(BRP+1)

===================================================

下面是我的计算:

CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq; 

注意//#define CAN_BS1_3tq                 ((uint8_t)0x02) /*!< 3 time quantum */
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure.CAN_Prescaler = 4;//2
nominal bit time(3+5+1)tq=9tq
关于分频系数 查看 system_stm32f10x.c下面的
static void SetSysClockTo72(void) 函数
/* HCLK = SYSCLK */
/* PCLK2 = HCLK */
/* PCLK1 = HCLK/2 */

所以can时钟 72MHZ/2/4=9 Mhz
tq=1/36Mhz
波特率为 1/nominal bit time= 9/9=1MHZ 

=========================================

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

              ====================================================

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); 

注意//#define CAN_BS1_3tq                 ((uint8_t)0x02) /*!< 3 time quantum */
拨特率10K,公式:72MHZ/2/200/(1+9+8)=0.01,即10K,和SJA1000测试通过   

================================================

120欧姆电阻要加上!!! 

哦   确实是 

      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 

======================================

的:将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 

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 

=========================================

得到500Kb/s的波特率

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;

每一位的Tq数目 = 1 (固定SYNC_SEG) +   8 (BS1) + 7 (BS2) = 16

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

其中:
1 为分频系数
16 为每一位的Tq数目

为了设置为 100K, 把分频系数改为5即可, BS1 BS2 不变

每一位的Tq数目 = 1 (固定) +   8 (BS1) + 7 (BS2) = 16
如果CAN时钟是 8 MHz : (8M / 5 ) / 16 = 100K

如果想得到 1M 的波特率, CAN时钟仍然是 8 MHz的情况下, 分频系数不变

应该改变 BS1 BS2

CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;

每一位的Tq数目 = 1 (固定) +   5 (BS1) + 2 (BS2) = 8
如果CAN时钟是 8 MHz : (8M / 1 ) / 8 = 1000K




另外尽可能的把采样点设置为 CiA 推荐的值:

75%      when 波特率 > 800K
80%      when 波特率 > 500K
87.5%    when 波特率 <= 500K

所以对于 100K 的波特率(假定使用 8MHz 时钟) 
可以修改该BS1 BS2 为:

CAN_InitStructure.CAN_Prescaler=5;
CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;

(1+13) / (1+13+2) = 87.5%

所以对于 500K 的波特率(假定使用 8MHz 时钟) 
可以修改该BS1 BS2 为:

CAN_InitStructure.CAN_Prescaler=1;
CAN_InitStructure.CAN_BS1=CAN_BS1_13tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;

(1+13) / (1+13+2) = 87.5%

所以对于 1000K 的波特率(假定使用 8MHz 时钟) 
可以修改该BS1 BS2 为:

CAN_InitStructure.CAN_Prescaler=1;
CAN_InitStructure.CAN_BS1=CAN_BS1_5tq;
CAN_InitStructure.CAN_BS2=CAN_BS2_2tq;

(1+5) / (1+5+2) = 75%

个人见解, 仅供参考。 

上边这个公式算出来的就是CAN的速率了


推荐阅读

史海拾趣

天二科技(EVER OHMS)公司的发展小趣事

进入90年代,随着电子技术的快速发展,市场对电阻器的要求也越来越高。天二科技紧跟行业趋势,投入大量资源进行技术研发和产品创新。1996年,公司成功推出贴片电阻器,这一产品凭借其优良的性能和稳定的品质,迅速赢得了市场的认可。此后,天二科技又陆续推出了耐高温电阻器、超薄贴片电阻器等一系列新产品,进一步丰富了公司的产品线。

AiT Semiconductor Inc公司的发展小趣事

在半导体行业,技术创新是企业持续发展的关键。AiT公司深知这一点,因此始终将创新作为公司的核心竞争力。他们投入大量资金和资源用于研发,不断推出具有创新性和领先性的半导体产品。同时,公司还积极与高校、科研机构等合作,共同开展技术研发和人才培养工作。这些创新举措使得AiT公司在行业中始终保持领先地位。

E-Z-HOOK公司的发展小趣事

自E-Z-HOOK公司成立以来,其产品线一直在不断扩大。到了1970年代,随着电子行业的快速发展,对测试工具的需求也日益增加。公司的新主人继承了阿尔伯特·史密斯的愿景,并决定进一步扩展产品线。他们引入了一系列新的测试钩型号,以适应不同尺寸和形状的测试点。此外,公司还开始生产其他与测试相关的零部件和组件,以满足客户日益增长的需求。

Allen Avionics Inc公司的发展小趣事

在电子产品日益复杂化的背景下,E-Z-HOOK公司不断追求技术创新。他们投入大量资源研发新型测试工具,以提高测试效率和准确性。其中一项重要的创新是开发出了可重复使用的测试钩。这种测试钩具有极高的耐用性和可靠性,可以大大降低测试成本。此外,公司还推出了一系列智能化测试解决方案,通过集成先进的传感器和软件技术,实现了对测试过程的实时监控和数据分析。

BOOKLY公司的发展小趣事

BOOKLY公司深知品质是赢得市场的关键。因此,公司从创立之初就建立了严格的质量管理体系,确保每一款产品的品质和性能都达到最高标准。同时,BOOKLY还注重品牌塑造,通过精心的品牌设计和营销活动,提升了品牌知名度和美誉度。这些努力使得BOOKLY的产品在市场上获得了良好的口碑和广泛的认可。

虹冠电子(Champion)公司的发展小趣事

虹冠电子始终秉持着节能环保的理念,将这一理念融入到产品研发和生产过程中。公司推出的电源管理IC产品,不仅具有高效能、低能耗的特点,还具备类零电压切换PFC与PWM技术,进一步提高了电源的使用效率。虹冠电子的产品广泛应用于个人计算机、云端运算服务器、LED显示屏等领域,为全球节能减排事业做出了积极贡献。

问答坊 | AI 解惑

自制USB转串口下载线

如题,小弟刚刚学习单片机,但本本上没有串口,烧写程序的时很不方便,自己去电脑城买个个便宜的还不能用,有人建议自制,烦请哪位大侠指点怎么样制作,都是需要什么元件?…

查看全部问答>

射频集成电路有哪些经典教科书?

[1] Thomas H. Lee,The Design of CMOS Radio-Frequency Integrated Circuits。Cambridge University Press,1998。       中译本: 清华大学余志平、周润德: CMOS射频集成电路设计。电子工业出版社,2004。 , [2] Robe ...…

查看全部问答>

LED产业蓬勃发展 PCB行业迎来新契机

世博、亚运、“十城万盏”政策推进,LED市场需求大增。据广东省LED产业联盟负责人介绍,我国户外照明市场率先启动,带动产业快速发展。科技部开展的“十城万盏”工程标志着国内LED产业迎来第三次快速发展机遇,仅我国城市道路照明替换成LED路灯带来 ...…

查看全部问答>

PCI驱动相关 (分层驱动)

请教各位大虾:本人刚接触驱动开发,目前需要写一个PCI驱动加一个串口驱动 PCI驱动目前已经能正确获取基址,但是怎么加串口驱动比较合理? 1.可不可以通过一个驱动程序在AddDevice函数中通过IoCreateDevice来创建2个设备(PCI和COM),相当于2个驱动合在 ...…

查看全部问答>

单片机定时中断

一段定时显示程序 void Time0()interrupt 1 { unsigned idata i =1; TR0 = 0; TH0  = 0xB8; //20ms定时 TL0  = 0x00; i++; if(i==500)//10s { timing = 1; } TR0 = 1; } void main() { timing ...…

查看全部问答>

谁能帮忙解释一下 USB Cable-Based Association Framework CBAF 这个名词呢?

大侠帮忙! 谁能帮忙解释一下 USB Cable-Based Association Framework CBAF 这个名词呢? 谢谢!…

查看全部问答>

关于映像的问题

刚刚接触vxworks,向大家请教几个基础问题,不要见笑哈 1,bootable格式的映像文件包含那些内容?是不是包括了bsp,vxworks操作系统文件和自己编写的应用程序三部分,加电后自己可以运行到应用程序? 2.downloadable格式的映像文件是不是不包括vx ...…

查看全部问答>

手机使用习惯调查

你如果习惯把手机装裤兜里,请问你装在左面还是右面?? 分少没办法散 ,勿怪!…

查看全部问答>

受到“位带别名区“启发,STM32F103.H头文件计划。

受到“位带别名区“启发,STM32F103.H头文件计划。现在已经使用STM32F103.H头文,基本代替了STM32库,直接使用寄存器和位结构。现在受到“位带别名区“启发,把STM32 外设寄存器全部加上“位带别名区“定义。每个比特膨胀成一个32  ...…

查看全部问答>

求教,关于单片机驱动继电器点亮灯泡的程序。

程序应该是没什么问题的,可能是我模拟电路上的问题,在运行的时候,死活点不亮。求高手看看。代码文件和protues模拟文件在附件的压缩包里。…

查看全部问答>