4604|7

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

can拨特率计算? [复制链接]

我算的怎么和例子上的不一样啊?例子上的100KBPS/S:设置如下(用的外部晶振(是8M的吗?),SYSCLK是HSE,CAN时钟应该是4M吧!

  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;

  if(HSEStartUpStatus == SUCCESS)
  {
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Select HSE as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

    /* Wait till HSE is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x04)
    {
    }
此帖出自stm32/stm8论坛

最新回复

                                 struct CAN_BTR_BITS {    Uint32  BRP             :10;    // 9:0        波特率分频器 该位域定义了时间单元(tq/tCAN)的时间长度 tq = (BRP[9:0]+1) x tPCLK    Uint32  Reserved2       :6;    // 15:10    Uint32  TS1             :4;    // 19:16    时间段1 tBS1 = tCAN x (TS1[3:0] + 1)    Uint32  TS2             :3;    // 22:20    时间段2 该位域定义了时间段2占用了多少个时间单元 tBS2 = tCAN x (TS2[2:0] + 1)    Uint32  Reserved1       :1;    // 23            Uint32  SJW             :2;    // 25:24    重新同步跳跃宽度 tRJW = tCAN x (SJW[1:0] + 1)    Uint32  Reserved0       :4;    // 29:26        Uint32  LBKM            :1;    // 30    环回模式(用于调试)0: 禁止环回模式     Uint32  SILM          :1;    // 31    静默模式(用于调试)0: 正常状态 1: 静默模式};void STM32_CAN_Configuration(void){                  /* Enable CAN reset state */      STM32_Rcc_Regs->apb1rstr.all |=  RCC_CANRST;       /* Release CAN from reset state */      STM32_Rcc_Regs->apb1rstr.all &= ~RCC_CANRST;        //时钟使能        STM32_Rcc_Regs->apb1enr.all |=RCC_CANEN;                    // 初始化请求        STM32_Can_Regs->mcr.bit.INRQ=1; //CAN_MCR_INRQ     ((u32)0x00000001) /* Initialization request 初始化请求*/        while(!STM32_Can_Regs->msr.bit.INAK); // 硬件对CAN_MSR寄存器的INAK 位置1 来进行确认。         STM32_Can_Regs->btr.bit.BRP=5; // 6分频          STM32_Can_Regs->btr.bit.TS1=5; // 12TQ                  STM32_Can_Regs->btr.bit.TS2=5; // 12TQ         STM32_Can_Regs->btr.bit.SJW=1;         STM32_Can_Regs->btr.bit.LBKM=1;                                     }//END SUB   详情 回复 发表于 2009-3-5 16:46
点赞 关注
 

回复
举报

81

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

按CAN_InitStructure这个设置,CAN时钟应该是18MHZ

  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=5;

上面参数设置CAN寄存器,要得到100KPS/S的拨特率,CAN时钟应该是18MHZ吧?
此帖出自stm32/stm8论坛
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

要得到100KPS/S的拨特率

stm32f10x_can.h:

/* CAN synchronisation jump width */
#define CAN_SJW_1tq                 ((u8)0x00)  /* 1 time quantum */
#define CAN_SJW_2tq                 ((u8)0x01)  /* 2 time quantum */
#define CAN_SJW_3tq                 ((u8)0x02)  /* 3 time quantum */
#define CAN_SJW_4tq                 ((u8)0x03)  /* 4 time quantum */

#define IS_CAN_SJW(SJW) (((SJW) == CAN_SJW_1tq) || ((SJW) == CAN_SJW_2tq)|| 
                         ((SJW) == CAN_SJW_3tq) || ((SJW) == CAN_SJW_4tq))

/* time quantum in bit segment 1 */
#define CAN_BS1_1tq                 ((u8)0x00)  /* 1 time quantum */
#define CAN_BS1_2tq                 ((u8)0x01)  /* 2 time quantum */
#define CAN_BS1_3tq                 ((u8)0x02)  /* 3 time quantum */
#define CAN_BS1_4tq                 ((u8)0x03)  /* 4 time quantum */
#define CAN_BS1_5tq                 ((u8)0x04)  /* 5 time quantum */
#define CAN_BS1_6tq                 ((u8)0x05)  /* 6 time quantum */
#define CAN_BS1_7tq                 ((u8)0x06)  /* 7 time quantum */
#define CAN_BS1_8tq                 ((u8)0x07)  /* 8 time quantum */
#define CAN_BS1_9tq                 ((u8)0x08)  /* 9 time quantum */
#define CAN_BS1_10tq                ((u8)0x09)  /* 10 time quantum */
#define CAN_BS1_11tq                ((u8)0x0A)  /* 11 time quantum */
#define CAN_BS1_12tq                ((u8)0x0B)  /* 12 time quantum */
#define CAN_BS1_13tq                ((u8)0x0C)  /* 13 time quantum */
#define CAN_BS1_14tq                ((u8)0x0D)  /* 14 time quantum */
#define CAN_BS1_15tq                ((u8)0x0E)  /* 15 time quantum */
#define CAN_BS1_16tq                ((u8)0x0F)  /* 16 time quantum */

#define IS_CAN_BS1(BS1) ((BS1) <= CAN_BS1_16tq)

/* time quantum in bit segment 2 */
#define CAN_BS2_1tq                 ((u8)0x00)  /* 1 time quantum */
#define CAN_BS2_2tq                 ((u8)0x01)  /* 2 time quantum */
#define CAN_BS2_3tq                 ((u8)0x02)  /* 3 time quantum */
#define CAN_BS2_4tq                 ((u8)0x03)  /* 4 time quantum */
#define CAN_BS2_5tq                 ((u8)0x04)  /* 5 time quantum */
#define CAN_BS2_6tq                 ((u8)0x05)  /* 6 time quantum */
#define CAN_BS2_7tq                 ((u8)0x06)  /* 7 time quantum */
#define CAN_BS2_8tq                 ((u8)0x07)  /* 8 time quantum */


stm32f10x_can.c :

 /* Set the bit timing register */
    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);


  CAN_InitStructure.CAN_BS1=CAN_BS1_8tq;
  CAN_InitStructure.CAN_BS2=CAN_BS2_7tq;
  CAN_InitStructure.CAN_Prescaler=5;

上面参数设置CAN寄存器,要得到100KPS/S的拨特率,CAN时钟应该是18MHZ吧?


由此推断, CAN时钟应该是 8 MHz ( 使用 HSE 8MHz, PLL 不使用 ? )

8M / 5 / ( 1+ 8 + 7 ) = 100 K




https://bbs.eeworld.com.cn/club/bbs/list.asp?boardid=49&t=3079355&tp=%u5F97%u5230500Kb/s%u7684%u6CE2%u7279%u7387
此帖出自stm32/stm8论坛
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

4
 

也不对啊!

谢谢你!不过CAN的时钟是APB1啊,例子上:

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);  
   RCC_SYSCLKConfig(RCC_SYSCLKSource_HSE);

    /* Wait till HSE is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x04)
    {
    }

  外部晶振是8MHZ,CAN时钟应该是4MHZ啊
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 

例子上是 4M的CAN时钟,说明有误。

                                    按例子上的设置,波特率是50KHZ。
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

6
 

starm的回答

                                  starm的回答,值得参考
此帖出自stm32/stm8论坛
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

7
 

顶一把。

/ 复位值: 0x0123 0000
// PCLK1=36MHz
// 时间单元(tq/tCAN)的时间长度 tq = (BRP[9:0]+1) x tPCLK
// 时间单元:36MHZ/(BRP+1)
//
//  CAN波特率速度计算: 36MHZ/prescal/(tsof+ts1+ts2)
//  如果把BRP=2,  即是3分频,PLCK/3 = 36MHZ/3
//  把 TS1=8 TS2=7; 注意已经+1了。
//  则CAN波特率速度=36/3/(1+8+7) = 36/3/16 = 0.75MHZ = 750 KHZ
此帖出自stm32/stm8论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

8
 

看看

struct CAN_BTR_BITS {
    Uint32  BRP             :10;    // 9:0        波特率分频器 该位域定义了时间单元(tq/tCAN)的时间长度 tq = (BRP[9:0]+1) x tPCLK
    Uint32  Reserved2       :6;    // 15:10
    Uint32  TS1             :4;    // 19:16    时间段1 tBS1 = tCAN x (TS1[3:0] + 1)
    Uint32  TS2             :3;    // 22:20    时间段2 该位域定义了时间段2占用了多少个时间单元 tBS2 = tCAN x (TS2[2:0] + 1)
    Uint32  Reserved1       :1;    // 23        
    Uint32  SJW             :2;    // 25:24    重新同步跳跃宽度 tRJW = tCAN x (SJW[1:0] + 1)
    Uint32  Reserved0       :4;    // 29:26    
    Uint32  LBKM            :1;    // 30    环回模式(用于调试)0: 禁止环回模式 
    Uint32  SILM          :1;    // 31    静默模式(用于调试)0: 正常状态 1: 静默模式
};


void STM32_CAN_Configuration(void)
{  
        
        /* Enable CAN reset state */
      STM32_Rcc_Regs->apb1rstr.all |=  RCC_CANRST;
       /* Release CAN from reset state */
      STM32_Rcc_Regs->apb1rstr.all &= ~RCC_CANRST;
        //时钟使能
        STM32_Rcc_Regs->apb1enr.all |=RCC_CANEN;    
        
        // 初始化请求
        STM32_Can_Regs->mcr.bit.INRQ=1; //CAN_MCR_INRQ     ((u32)0x00000001) /* Initialization request 初始化请求*/

        while(!STM32_Can_Regs->msr.bit.INAK); // 硬件对CAN_MSR寄存器的INAK 位置1 来进行确认。

         STM32_Can_Regs->btr.bit.BRP=5; // 6分频 
         STM32_Can_Regs->btr.bit.TS1=5; // 12TQ         
         STM32_Can_Regs->btr.bit.TS2=5; // 12TQ
         STM32_Can_Regs->btr.bit.SJW=1;
         STM32_Can_Regs->btr.bit.LBKM=1;
         
         
         
          
}//END SUB
此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表