首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LPC 2292与LPC1758板之间的CAN通信“帧启动”错误

LPC 2292与LPC1758板之间的CAN通信“帧启动”错误
EN

Stack Overflow用户
提问于 2016-01-26 03:23:57
回答 1查看 1.2K关注 0票数 15

我正在尝试设置可以在两个LPC设备节点之间进行通信。我的设置包括几个写在CAN总线上的CAN节点。例如,LPC 2292 CAN控制器可以写到can总线上,并且LPC1758可以接收数据。这个很好用。现在,LPC1758有两个CAN控制器,我设置了一个用于接收数据,另一个用于在总线上传输数据作为响应。我还为LPC 1758 CAN 1发送和接收以及CAN 2发送和接收设置了中断处理程序。(我没有LPC 2292的代码。它不在我的控制之下)

我的问题是在LPC1758方面。在这里,CAN 1接收器能够从其他CAN节点获取数据,因为我可以看到中断向量处理程序正在被调用。问题是当LPC 1758 CAN 2转换器写入总线时。它会产生一个公共汽车错误。更确切地说是"Start of Frame " error。(我使用Ulink2调试器)。现在阅读CAN规范,我知道CAN消息的开始框架应该以低(主导)位CAN规范;见第3页开始。

如何修复此错误?这不是一个可配置的寄存器,我可以将第一个位设置为0或1。我运行了默认的LPC 1758 can代码,这是与KEIL C:\Keil_v5\ARM\Boards\Keil\MCB1700\CAN一起提供的,我认为代码很好,因为当我在KEIL的模拟模式下运行代码时,我可以看到CAN通信工作得很好。

这是“框架的开始”,是我缺少的其他配置的副产品吗?

代码语言:javascript
复制
Update Code : 

我运行默认的LPC 1758 CAN代码,这是与KEIL C:\Keil_v5\ARM\Boards\Keil\MCB1700\CAN一起提供的,我认为该代码很好,因为当我在KEIL的模拟模式下运行该代码时,我可以看到can通信运行良好。此外,除了baudrate之外,我没有对代码进行任何更改。可以设置:

代码语言:javascript
复制
/*----------------------------------------------------------------------------
  setup CAN interface.  CAN controller (1..2)
 *----------------------------------------------------------------------------*/
void CAN_setup (uint32_t ctrl)  {
  LPC_CAN_TypeDef *pCAN = (ctrl == 1) ? LPC_CAN1 : LPC_CAN2;

  if (ctrl == 1) {
    LPC_SC->PCONP       |=  (1 << 13);           /* Enable power to CAN1 block */
    LPC_PINCON->PINSEL0 |=  (1 <<  0);           /* Pin P0.0 used as RD1 (CAN1) */
    LPC_PINCON->PINSEL0 |=  (1 <<  2);           /* Pin P0.1 used as TD1 (CAN1) */

    NVIC_EnableIRQ(CAN_IRQn);                    /* Enable CAN interrupt */
  } else {
    LPC_SC->PCONP       |=  (1 << 14);           /* Enable power to CAN2 block */
    LPC_PINCON->PINSEL4 |=  (1 << 14);           /* Pin P2.7 used as RD2 (CAN2) */
    LPC_PINCON->PINSEL4 |=  (1 << 16);           /* Pin P2.8 used as TD2 (CAN2) */

    NVIC_EnableIRQ(CAN_IRQn);                    /* Enable CAN interrupt */
  }

  LPC_CANAF->AFMR = 2;                           /* By default filter is not used */
  pCAN->MOD   = 1;                               /* Enter reset mode */
  pCAN->IER   = 0;                               /* Disable all interrupts */
  pCAN->GSR   = 0;                               /* Clear status register */
  CAN_cfgBaudrate(ctrl, /*250000*/ 100000);                 /* Set bit timing */
  pCAN->IER   = 0x0003;                          /* Enable Tx and Rx interrupt */
    //pCAN->IER   = 0x7FF;

}

这是我要发送和接收的代码:

代码语言:javascript
复制
/*----------------------------------------------------------------------------
  wite a message to CAN peripheral and transmit it.  CAN controller (1..2)
 *----------------------------------------------------------------------------*/
void CAN_wrMsg (uint32_t ctrl, CAN_msg *msg)  {
  LPC_CAN_TypeDef *pCAN = (ctrl == 1) ? LPC_CAN1 : LPC_CAN2;
  uint32_t CANData;

  CANData = (((uint32_t) msg->len) << 16)     & 0x000F0000 | 
            (msg->format == EXTENDED_FORMAT ) * 0x80000000 |
            (msg->type   == REMOTE_FRAME)     * 0x40000000;

  if (pCAN->SR & (1<<2))  {                      /* Transmit buffer 1 free */
    pCAN->TFI1  = CANData;                       /* Write frame informations */
    pCAN->TID1 = msg->id;                        /* Write CAN message identifier */
    pCAN->TDA1 = *(uint32_t *) &msg->data[0];    /* Write first 4 data bytes */
    pCAN->TDB1 = *(uint32_t *) &msg->data[4];    /* Write second 4 data bytes */
    //pCAN->CMR  = 0x31;                           /* Select Tx1 for Self Tx/Rx */
    pCAN->CMR  = 0x21;                           /* Start transmission without loop-back */ -- Here is when "Start of Frame " error happens

  }
}

接收代码是可以的,但仍然可以投递。

代码语言:javascript
复制
/*----------------------------------------------------------------------------
  read a message from CAN peripheral and release it.  CAN controller (1..2)
 *----------------------------------------------------------------------------*/
void CAN_rdMsg (uint32_t ctrl, CAN_msg *msg)  {
  LPC_CAN_TypeDef *pCAN = (ctrl == 1) ? LPC_CAN1 : LPC_CAN2;
  uint32_t CANData;

                                                 /* Read frame informations */
  CANData = pCAN->RFS;
  msg->format   = (CANData & 0x80000000) == 0x80000000;
  msg->type     = (CANData & 0x40000000) == 0x40000000;
  msg->len      = ((uint8_t)(CANData >> 16)) & 0x0F;

  msg->id = pCAN->RID;                           /* Read CAN message identifier */

  if (msg->type == DATA_FRAME)  {                /* Read the data if received message was DATA FRAME  */ 
    *(uint32_t *) &msg->data[0] = pCAN->RDA;
    *(uint32_t *) &msg->data[4] = pCAN->RDB;
  }
}

波德率计算:

代码语言:javascript
复制
/*----------------------------------------------------------------------------
  configure the requested baudrate.  CAN controller (1..2)
 *----------------------------------------------------------------------------*/
static void CAN_cfgBaudrate (uint32_t ctrl, uint32_t baudrate)  {
  LPC_CAN_TypeDef *pCAN = (ctrl == 1) ? LPC_CAN1 : LPC_CAN2;
  uint32_t result = 0;
  uint32_t nominal_time;

  /* Determine which nominal time to use for PCLK */
  if (((PCLK / 1000000) % 6) == 0) {
    nominal_time = 12;                   /* PCLK based on  72MHz CCLK */
  } else {
    nominal_time = 10;                   /* PCLK based on 100MHz CCLK */
  }

  /* Prepare value appropriate for bit time register */
  result  = (PCLK / nominal_time) / baudrate - 1;
  result &= 0x000003FF;
  result |= CAN_BIT_TIME[nominal_time];

  pCAN->BTR  = result;                           /* Set bit timing */
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-11 05:38:01

我终于能够摆脱“帧的开始”错误,这个错误一直困扰着我。我与其他一些CAN总线代码作者进行了讨论,他建议我使用相同的CAN控制器进行发送和接收。简而言之,这一点:

代码语言:javascript
复制
** Does not work** : 
LPC 2292 : CAN 1 Rx & CAN 2 Tx
LPC 1750 : CAN 1 Rx & CAN 2 TX 

** WORKS** :
LPC 2292 : CAN 1 Rx & CAN 1 Tx
LPC 1750 : CAN 1 Rx & CAN 1 TX 

作为一个新手,我可能犯了这个错误。但是KEIL提供的默认代码显示使用交替CAN控制器发送和传输。我希望这能帮上忙。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35006567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档