Arm LPC 2292和LPC1758板之间的CAN通信;“帧的开始”;错误

Arm LPC 2292和LPC1758板之间的CAN通信;“帧的开始”;错误,arm,embedded,microcontroller,can-bus,Arm,Embedded,Microcontroller,Can Bus,我正在尝试设置两个LPC设备节点之间的CAN通信。我的设置包括写入CAN总线的两个CAN节点。例如,LPC 2292 CAN控制器可以写入CAN总线,LPC1758可以接收数据。这个很好用。现在LPC1758有2个CAN控制器,我设置了一个用于接收数据,另一个用于在总线上传输数据作为响应。我还为LPC1758 CAN 1发送和接收以及CAN 2发送和接收设置了中断处理程序。(我没有LPC2292的代码。它不在我的控制之下) 我的问题在LPC1758侧。在这里,CAN 1接收器能够从其他CAN节点

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

我的问题在LPC1758侧。在这里,CAN 1接收器能够从其他CAN节点获取数据,因为我可以看到正在调用中断向量处理程序。问题是当LPC1758 CAN 2传输程序写入总线时。它得到一个总线错误。更具体地说,
“帧开始”错误
。(我使用一个Ulink2调试器)。现在阅读CAN规范,我知道CAN消息的开始帧应该以低(主)位开始

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

这是我所缺少的一些其他配置的副产品吗

Update Code : 
我运行KEIL
C:\KEIL\u v5\ARM\Boards\KEIL\MCB1700\CAN附带的默认LPC 1758 CAN代码,我认为代码很好,因为当我在KEIL的模拟模式下运行代码时,我可以看到CAN通信工作良好。此外,除了波特率,我没有对代码做任何更改。
可以设置:

/*----------------------------------------------------------------------------
  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;

}
波特率计算:

/*----------------------------------------------------------------------------
  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 */
}

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

** 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控制器进行发送和传输。我希望这对某人有帮助

波特率配置是否正确?@swand我被告知CAN总线上的其他节点的速率为100KBps。因此,我将我的新LPC1758编程为100KBPS,并且我能够从其他LPC节点接收消息。我只是不能从我的LPC1758发送任何信息。我还需要检查罐头钟吗?SJW、TSEG1和TSEG2寄存器等中的值?它们是否需要在所有板上都相同?我没有其他板的配置。我只知道波特率。有什么提示吗?主要目标是,我的新CAN节点将是现有CAN网络的即插即用。谢谢你的帮助!你能展示一些代码吗?你能发布一个can跟踪和你试图传输的数据帧吗?您确定CAN总线在您尝试发送时处于空闲状态吗?即,您的LPC2292在哪个时间间隔内发送数据?您应该在设置波特率后进入正常模式:LPC_CAN1->MOD=0x00;您应该检查其他2个传输缓冲区。这一定是LPC特有的问题。因为我在另一个控制器上使用相同的CAN控制器,并且工作正常
/*----------------------------------------------------------------------------
  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 */
}
** 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