打印
[Kinetis]

MK22FX512VLL12 CAN波特率自适应

[复制链接]
1170|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
济南大卫|  楼主 | 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
  /* SIM_SCGC6: FLEXCAN0=1 */
  SIM_SCGC6 |= SIM_SCGC6_FLEXCAN0_MASK;//使能CAN0时钟
  pinAndInterupt(DeviceDataPrv);
  /* CAN0_MCR: MDIS=1 */
  CAN0_MCR |= CAN_MCR_MDIS_MASK;       /*为了下面的初始化暂时关闭CAN模块 Disable CAN module */
  /*Bus Clock selected*/
#if 0 //放在这里因为下面 上面MCR已关闭,在这里设置没有意义,必须在下面MCR中使能CAN后才可设置  CAN_MCR_MDIS_MASK
  /* 设置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 */
  CAN0_CTRL1 = 0;
  i = CAN0_CTRL1;
  CAN0_CTRL1 = CAN_CTRL1_PRESDIV(0x00) |
               CAN_CTRL1_RJW(0x00) |
               CAN_CTRL1_PSEG1(0x00) |
               CAN_CTRL1_PSEG2(0x00) |
               //CAN_CTRL1_CLKSRC_MASK | //0 The CAN engine clock source is the oscillator clock.
               CAN_CTRL1_PROPSEG(0x00);
  i = CAN0_CTRL1;
#endif
  /*使能CAN接口以及接收FIFO CAN0_MCR: MDIS=0,SOFTRST=1 */
  CAN0_MCR = (uint32_t)((CAN0_MCR & (uint32_t)~(uint32_t)(
              CAN_MCR_MDIS_MASK
             )) | (uint32_t)(
                          CAN_MCR_SRXDIS_MASK | //disalbe self reception
              CAN_MCR_SOFTRST_MASK
             ));                       /* Soft Reset */
  while (CAN_PDD_GetSoftResetState(CAN0_BASE_PTR) == CAN_PDD_NOT_RESET){} /* Wait for Soft reset Acknowledge */
  while (CAN_PDD_GetFreezeAck(CAN0_BASE_PTR) == CAN_PDD_NOT_FREEZE){} /* Wait for entering the freeze mode */
  /* CAN0_MCR: WRNEN=1,IRMQ=1,MAXMB&=~0x0E,MAXMB|=1 */
  CAN0_MCR = (uint32_t)((CAN0_MCR & (uint32_t)~(uint32_t)(
              //CAN_MCR_MAXMB(0x0E)
                          CAN_MCR_MAXMB(0x0D)
             )) | (uint32_t)(
              CAN_MCR_WRNEN_MASK |//使能告警中断
              CAN_MCR_IRMQ_MASK |//使能接收队列功能
              //CAN_MCR_MAXMB(0x01)
                          CAN_MCR_MAXMB(0x02) |//使能3个BUFFER
                          CAN_MCR_SRXDIS_MASK //disalbe self reception
             ));                       /* MCR reg. Settings */
#ifndef CAN_TEST
  if(CAN_CONFIG1.m_WorkMode == CAN_WORK_MOD_LOOP)
  {
          CAN0_MCR        &=        (~(uint32_t)(CAN_MCR_SRXDIS_MASK));//开启接收自己发送数据的功能
  }
#endif
  /* CAN0_CTRL1: PRESDIV|=0x19,PSEG1|=3,PSEG2|=1,LPB=1,LBUF=1 */
#ifdef CAN_TEST
  CAN0_CTRL1 |= CAN_CTRL1_PRESDIV(0x07) |
                CAN_CTRL1_PSEG1(0x03) |
                CAN_CTRL1_PSEG2(0x01) |
                //CAN_CTRL1_LPB_MASK | //close loop mod
                CAN_CTRL1_LBUF_MASK;   /* Setting CTRL1 register */
#else
  changeCanBuat(CAN_CONFIG1.m_BaudRate);
#endif

相关帖子

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

本版积分规则

3

主题

11

帖子

2

粉丝