打印

STM32 CAN波特率设置

[复制链接]
7906|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjun2012|  楼主 | 2012-11-22 11:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void RCC_Configuration(void)
{
  ErrorStatus HSEStartUpStatus;
  u8 len;
     RCC_DeInit();
  RCC_HSEConfig(RCC_HSE_ON);
  HSEStartUpStatus=RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus==SUCCESS)
  {
   FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
  FLASH_SetLatency(FLASH_Latency_2);
  }
  RCC_HCLKConfig(RCC_SYSCLK_Div1);
  RCC_PCLK1Config(RCC_HCLK_Div4);
  RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_4);
  RCC_PLLCmd(ENABLE);
  while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET)
  {
  }
  RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
     while(RCC_GetSYSCLKSource()!=0X08)
  {
  }

     RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
}


  CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;                              /*  波特率相关设置              */
  CAN_InitStructure.CAN_BS1 = CAN_BS1_16tq;
  CAN_InitStructure.CAN_BS2 = CAN_BS2_8tq;
  CAN_InitStructure.CAN_Prescaler = 2;

我的晶振是25M的,利用上面的参数得到CAN波特率为500kps,根据网上搜查资料,需要知道CAN系统时钟,哪位大虾告诉我根据上面的设置推算出CAN系统时钟怎么不对啊?
沙发
wangjun2012|  楼主 | 2012-11-22 11:26 | 只看该作者
每一位的Tq数目 = 2(固定SYNC_SEG) +  16 (BS1) + 8 (BS2) = 26

如果CAN时钟是 X MHz : (xM / 2) / 26 = 500K ,推算出X= 26M,也就说CAN时钟为26M吗?如果是26M,那系统时钟哪里如何对上的?

使用特权

评论回复
板凳
IJK| | 2012-11-22 11:37 | 只看该作者
LZ的情况我估计是正常的。

估计CAN的输入时钟为 25M:
CAN波特率为 25M  / CAN_Prescaler / (CAN_BS1+CAN_BS2+1) = 25M /2 /25 = 0.5M

注意:CAN的输入时钟有2个来源。

使用特权

评论回复
地板
wangjun2012|  楼主 | 2012-11-22 11:56 | 只看该作者
IJK您好! SJW=2,不是等于1啊?如果是1的话.如果CAN时钟是25M,又是如何推出的啊?

使用特权

评论回复
5
wangjun2012|  楼主 | 2012-11-22 11:58 | 只看该作者
事实证明我把SJW修改为1,波特率也是500KBPS,请问这个25M,CAN系统时钟如何推算的?

使用特权

评论回复
6
wangjun2012|  楼主 | 2012-11-22 12:08 | 只看该作者
RCC_HCLKConfig(RCC_SYSCLK_Div1);
  RCC_PCLK1Config(RCC_HCLK_Div4);
  RCC_PLLConfig(RCC_PLLSource_PREDIV1,RCC_PLLMul_4);
  RCC_PLLCmd(ENABLE);
请问几条语句哪里是设置CAN系统时钟的呢?

使用特权

评论回复
7
wangjun2012|  楼主 | 2012-11-22 13:08 | 只看该作者
RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
#else
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
#endif

    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
这是USB初始化的,如果我用了USB,再去设置CAN就不好使了,请问我该如何修改?

使用特权

评论回复
8
IJK| | 2012-11-22 13:59 | 只看该作者
IJK您好! SJW=2,不是等于1啊?如果是1的话.如果CAN时钟是25M,又是如何推出的啊?
wangjun2012 发表于 2012-11-22 11:56


CAN波特率跟SJW没有关系。

使用特权

评论回复
9
wangjun2012|  楼主 | 2012-11-22 17:38 | 只看该作者
RCC_PCLK1Config(RCC_HCLK_Div8);         //8分频率           add new        81M CAN时钟

    /* PLL2 configuration: PLL2CLK = (HSE / 5) * 8 = 40 MHz */
    RCC_PREDIV2Config(RCC_PREDIV2_Div5);
    RCC_PLL2Config(RCC_PLL2Mul_8);

    /* Enable PLL2 */
    RCC_PLL2Cmd(ENABLE);

    /* Wait till PLL2 is ready */
    while (RCC_GetFlagStatus(RCC_FLAG_PLL2RDY) == RESET)
    {}

    /* PLL configuration: PLLCLK = (PLL2 / 5) * 9 = 72 MHz */
    RCC_PREDIV1Config(RCC_PREDIV1_Source_PLL2, RCC_PREDIV1_Div5);
    RCC_PLLConfig(RCC_PLLSource_PREDIV1, RCC_PLLMul_9);
晶振是25M,请问系统时终多少啊?是不是9*72M=648MBPS

使用特权

评论回复
10
wangjun2012|  楼主 | 2012-11-23 09:09 | 只看该作者
搞定了,由于清楚了波特率如何计算,但不清楚CAN系统时钟,和CPU的系统始终究竟为多少,那个函数也木有解释,后来通过示波器看出波特率大概在100K,因此反推CAN系统时钟和CPU时钟,然后再按照CPU时钟从5K-1Mbps全部测试通过.看样子资料不全,找不到对口的资料还是比较麻烦的.

使用特权

评论回复
11
wangch_sh| | 2013-12-10 08:51 | 只看该作者
学习了。

使用特权

评论回复
12
atgjlc| | 2014-2-27 10:04 | 只看该作者
BS1,BS2 是怎么确定的,我想把波特率改为125K和500K

使用特权

评论回复
13
hhhhhhgggg| | 2017-2-28 07:01 | 只看该作者
wangjun2012 发表于 2012-11-23 09:09
搞定了,由于清楚了波特率如何计算,但不清楚CAN系统时钟,和CPU的系统始终究竟为多少,那个函数也木有解释,后 ...

can系统时钟和cpu系统时钟什么关系啊?再有BS1和BS2怎么确定啊,波特率改为125k

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

48

帖子

0

粉丝