打印

STR710的CAN总线的波特率设置问题请教

[复制链接]
2555|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
8yuuu|  楼主 | 2008-10-23 20:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想请问下STR710的CAN总线的波特率设置寄存器CAN-BTR是怎么用的?  我看手册说是BRP是波特率因子,还有SJW、TSEG1、TSEG2,都不知道与波特率有什么关系,看手册都看的不怎么明白,如果我现在APB1总线的时钟是8MHZ,  设置了BRP为8,  照我的理解,波特率就是1MHZ,   不知道SJW、TSEG1、TSEG2设置与波特率有什么关系??(我是想把波特率设置在20K左右)
沙发
starm| | 2008-10-23 21:46 | 只看该作者

apb1= 24 mhz

// macro to format the timing register value from the timing parameters
#define CAN_TIMING(tseg1, tseg2, sjw, brp)    (((tseg2-1) & 0x07) << 12) | (((tseg1-1) & 0x0F) << 8) | (((sjw-1) & 0x03) << 6) | ((brp-1) & 0x3F)


/*******************************************************************************
* Function Name  : CAN_SetTiming
* Description    : Setup the CAN timing with specific parameters
* Input 1        : Time Segment before the sample point position, from 2 to 16
* Input 2        : Time Segment after the sample point position, from 1 to 8
* Input 3        : Synchronisation Jump Width, from 1 to 4
* Input 4        : Baud Rate Prescaler, from 1 to 1024
* Output         : None
* Return         : None
* Note           : CAN must be in initialization mode
*******************************************************************************/
void CAN_SetTiming(u32 tseg1, u32 tseg2, u32 sjw, u32 brp)
{
    CAN->BTR = CAN_TIMING(tseg1, tseg2, sjw, brp);
    CAN->BRPR = ((brp-1) >> 6) & 0x0F;
}


//------------------------------------------------------------------------------
// write the predefined timing value
//------------------------------------------------------------------------------
void ECU_CAN_SetupBaudRate(u32 dwBaudRate)
{
  u32 brp;
  if (dwBaudRate <= 500000)
  {
    brp  = (24000000 / 16) / dwBaudRate;
    CAN_SetTiming(11, 4, 4, brp);
  }
  else if (dwBaudRate <= 1000000)
  {
    brp  = (24000000 / 8 ) / dwBaudRate;
    CAN_SetTiming( 4, 3, 3, brp);
  }
  CAN->BRPR = 0;         
}

使用特权

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

本版积分规则

24

主题

68

帖子

0

粉丝