[Kinetis] MK22FX512VLL12 CAN波特率自适应

[复制链接]
 楼主| 济南大卫 发表于 2016-3-25 13:28 | 显示全部楼层 |阅读模式
CAN, se, pse, ps, ui
在调试的时候使用PE初始化CAN接口代码,后来调试CAN速率自动变化功能,发现无法在重启的情况下自适应变化。

于是跟踪寄存器状态,发现收到上位机变速率数据,进入CAN初始化之后,CTRL0并没有变化,是因为PE的代码,CTRL0的置零放在了CAN CAN_MCR_MDIS_MASK之后、使能之前,造成CTRL0并未被置零,因此造成CAN速率无法改变。

应该是这样的:等到使能之后再置零CTRL0,然后再初始化CTRL0这样就可以随心所欲更改CAN速率了, oh year
  1.   /* SIM_SCGC6: FLEXCAN0=1 */
  2.   SIM_SCGC6 |= SIM_SCGC6_FLEXCAN0_MASK;//使能CAN0时钟
  3.   pinAndInterupt(DeviceDataPrv);
  4.   /* CAN0_MCR: MDIS=1 */
  5.   CAN0_MCR |= CAN_MCR_MDIS_MASK;       /*为了下面的初始化暂时关闭CAN模块 Disable CAN module */
  6.   /*Bus Clock selected*/
  7. #if 0 //放在这里因为下面 上面MCR已关闭,在这里设置没有意义,必须在下面MCR中使能CAN后才可设置  CAN_MCR_MDIS_MASK
  8.   /* 设置CAN接口的时钟源、接口特性确定发送速率CAN0_CTRL1: PRESDIV=0,RJW=0,PSEG1=0,PSEG2=0,BOFFMSK=0,ERRMSK=0,CLKSRC=1,LPB=0,TWRNMSK=0,RWRNMSK=0,??=0,??=0,SMP=0,BOFFREC=0,TSYN=0,LBUF=0,LOM=0,PROPSEG=0 */
  9.   CAN0_CTRL1 = 0;
  10.   i = CAN0_CTRL1;
  11.   CAN0_CTRL1 = CAN_CTRL1_PRESDIV(0x00) |
  12.                CAN_CTRL1_RJW(0x00) |
  13.                CAN_CTRL1_PSEG1(0x00) |
  14.                CAN_CTRL1_PSEG2(0x00) |
  15.                //CAN_CTRL1_CLKSRC_MASK | //0 The CAN engine clock source is the oscillator clock.
  16.                CAN_CTRL1_PROPSEG(0x00);
  17.   i = CAN0_CTRL1;
  18. #endif
  19.   /*使能CAN接口以及接收FIFO CAN0_MCR: MDIS=0,SOFTRST=1 */
  20.   CAN0_MCR = (uint32_t)((CAN0_MCR & (uint32_t)~(uint32_t)(
  21.               CAN_MCR_MDIS_MASK
  22.              )) | (uint32_t)(
  23.                           CAN_MCR_SRXDIS_MASK | //disalbe self reception
  24.               CAN_MCR_SOFTRST_MASK
  25.              ));                       /* Soft Reset */
  26.   while (CAN_PDD_GetSoftResetState(CAN0_BASE_PTR) == CAN_PDD_NOT_RESET){} /* Wait for Soft reset Acknowledge */
  27.   while (CAN_PDD_GetFreezeAck(CAN0_BASE_PTR) == CAN_PDD_NOT_FREEZE){} /* Wait for entering the freeze mode */
  28.   /* CAN0_MCR: WRNEN=1,IRMQ=1,MAXMB&=~0x0E,MAXMB|=1 */
  29.   CAN0_MCR = (uint32_t)((CAN0_MCR & (uint32_t)~(uint32_t)(
  30.               //CAN_MCR_MAXMB(0x0E)
  31.                           CAN_MCR_MAXMB(0x0D)
  32.              )) | (uint32_t)(
  33.               CAN_MCR_WRNEN_MASK |//使能告警中断
  34.               CAN_MCR_IRMQ_MASK |//使能接收队列功能
  35.               //CAN_MCR_MAXMB(0x01)
  36.                           CAN_MCR_MAXMB(0x02) |//使能3个BUFFER
  37.                           CAN_MCR_SRXDIS_MASK //disalbe self reception
  38.              ));                       /* MCR reg. Settings */
  39. #ifndef CAN_TEST
  40.   if(CAN_CONFIG1.m_WorkMode == CAN_WORK_MOD_LOOP)
  41.   {
  42.           CAN0_MCR        &=        (~(uint32_t)(CAN_MCR_SRXDIS_MASK));//开启接收自己发送数据的功能
  43.   }
  44. #endif
  45.   /* CAN0_CTRL1: PRESDIV|=0x19,PSEG1|=3,PSEG2|=1,LPB=1,LBUF=1 */
  46. #ifdef CAN_TEST
  47.   CAN0_CTRL1 |= CAN_CTRL1_PRESDIV(0x07) |
  48.                 CAN_CTRL1_PSEG1(0x03) |
  49.                 CAN_CTRL1_PSEG2(0x01) |
  50.                 //CAN_CTRL1_LPB_MASK | //close loop mod
  51.                 CAN_CTRL1_LBUF_MASK;   /* Setting CTRL1 register */
  52. #else
  53.   changeCanBuat(CAN_CONFIG1.m_BaudRate);
  54. #endif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

11

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部