乐鑫技术交流
直播中

张莹

7年用户 1021经验值
私信 关注
[问答]

can sample loopbackdemo卡在can begin不动,为什么?

卡在Serial.println ("pos65") ;的下一行不动.

/******************************************************************************/
/* File name        : LoopBackDemo.ino                                        */
/* Project          : ESP32-CAN-DRIVER                                        */
/* Description      : ESP32 CAN Self Test with Interrupt Handler              */
/* ---------------------------------------------------------------------------*/
/* Copyright        : Copyright © 2019 Pierre Molinaro. All rights reserved.  */
/* ---------------------------------------------------------------------------*/
/* Author           : Mohamed Irfanulla                                       */
/* Supervisor       : Prof. Pierre Molinaro                                   */
/* Institution      : Ecole Centrale de Nantes                                */
/* ---------------------------------------------------------------------------*/

//------------------------------- Board Check ----------------------------------

#ifndef ARDUINO_ARCH_ESP32
  #error "Select an ESP32 board"
#endif

//------------------------------- Include files --------------------------------

#include
#include  // For ARDUINO_ESP32_RELEASE

//——————————————————————————————————————————————————————————————————————————————
//  ESP32 Desired Bit Rate
//——————————————————————————————————————————————————————————————————————————————

static const uint32_t DESIRED_BIT_RATE = 100UL * 1000UL ; // 1 Mb/s

//——————————————————————————————————————————————————————————————————————————————
//   SETUP
//——————————————————————————————————————————————————————————————————————————————

void setup() {
//--- Switch on builtin led
  pinMode (LED_BUILTIN, OUTPUT) ;
  digitalWrite (LED_BUILTIN, HIGH) ;
//--- Start serial
  Serial.begin (115200) ;
  delay (100) ;
//--- Display ESP32 Chip Info
  esp_chip_info_t chip_info ;
  esp_chip_info (&chip_info) ;
  Serial.print ("ESP32 Arduino Release: ") ;
  Serial.println (ARDUINO_ESP32_RELEASE) ;
  Serial.print ("ESP32 Chip Revision: ") ;
  Serial.println (chip_info.revision) ;
  Serial.print ("ESP32 SDK: ") ;
  Serial.println (ESP.getSdkVersion ()) ;
  Serial.print ("ESP32 Flash: ") ;
  Serial.print (spi_flash_get_chip_size () / (1024 * 1024)) ;
  Serial.print (" MB ") ;
  Serial.println (((chip_info.features & CHIP_FEATURE_EMB_FLASH) != 0) ? "(embeded)" : "(external)") ;
  Serial.print ("APB CLOCK: ") ;
  Serial.print (APB_CLK_FREQ) ;
  Serial.println (" Hz") ;
//--- Configure ESP32 CAN
  Serial.println ("Configure ESP32 CAN654546") ;
  ACAN_ESP32_Settings settings (DESIRED_BIT_RATE) ;
  Serial.println ("pos60") ;
  settings.mRequestedCANMode = ACAN_ESP32_Settings::LoopBackMode ;
  Serial.println ("pos61") ;
  settings.mRxPin = GPIO_NUM_4 ; // Optional, default Tx pin is GPIO_NUM_4
  settings.mTxPin = GPIO_NUM_5 ; // Optional, default Rx pin is GPIO_NUM_5
  Serial.println ("pos65") ;
  const uint32_t errorCode = ACAN_ESP32::can.begin (settings) ;
  Serial.println ("pos67") ;
  if (errorCode == 0) {
    Serial.print ("Bit Rate prescaler: ") ;
    Serial.println (settings.mBitRatePrescaler) ;
    Serial.print ("Time Segment 1:     ") ;
    Serial.println (settings.mTimeSegment1) ;
    Serial.print ("Time Segment 2:     ") ;
    Serial.println (settings.mTimeSegment2) ;
    Serial.print ("RJW:                ") ;
    Serial.println (settings.mRJW) ;
    Serial.print ("Triple Sampling:    ") ;
    Serial.println (settings.mTripleSampling ? "yes" : "no") ;
    Serial.print ("Actual bit rate:    ") ;
    Serial.print (settings.actualBitRate ()) ;
    Serial.println (" bit/s") ;
    Serial.print ("Exact bit rate ?    ") ;
    Serial.println (settings.exactBitRate () ? "yes" : "no") ;
    Serial.print ("Distance            ") ;
    Serial.print (settings.ppmFromDesiredBitRate ()) ;
    Serial.println (" ppm") ;
    Serial.print ("Sample point:       ") ;
    Serial.print (settings.samplePointFromBitStart ()) ;
    Serial.println ("%") ;
    Serial.println ("Configuration OK!");
  }else {
    Serial.print ("Configuration error 0x") ;
    Serial.println (errorCode, HEX) ;
  }
}

//——————————————————————————————————————————————————————————————————————————————

static uint32_t gBlinkLedDate = 0 ;
static uint32_t gReceivedFrameCount = 0 ;
static uint32_t gSentFrameCount = 0 ;

//——————————————————————————————————————————————————————————————————————————————
//   LOOP
//——————————————————————————————————————————————————————————————————————————————

void loop () {
  CANMessage frame ;
  if (gBlinkLedDate < millis ()) {
    gBlinkLedDate += 500 ;
    digitalWrite (LED_BUILTIN, !digitalRead (LED_BUILTIN)) ;
    Serial.print ("Sent: ") ;
    Serial.print (gSentFrameCount) ;
    Serial.print (" ") ;
    Serial.print ("Receive: ") ;
    Serial.print (gReceivedFrameCount) ;
    Serial.print (" ") ;
    Serial.print (" STATUS 0x") ;
    Serial.print (TWAI_STATUS_REG, HEX) ;
    Serial.print (" RXERR ") ;
    Serial.print (TWAI_RX_ERR_CNT_REG) ;
    Serial.print (" TXERR ") ;
    Serial.println (TWAI_TX_ERR_CNT_REG) ;
    const bool ok = ACAN_ESP32::can.tryToSend (frame) ;
    if (ok) {
      gSentFrameCount += 1 ;
    }
  }
  while (ACAN_ESP32::can.receive (frame)) {
    gReceivedFrameCount += 1 ;
  }
}
                                                                                                                                             

回帖(1)

李英

2024-6-12 16:24:59
从你提供的代码片段来看,问题可能出现在以下几个方面:

1. **CAN 总线初始化失败**:如果 CAN 总线没有正确初始化,程序可能会在 `CAN.begin()` 处卡住。请检查你的硬件连接是否正确,以及是否使用了正确的 CAN 总线速率。

2. **CAN 总线错误**:在 `CAN.begin()` 之后,你应该检查 `CAN.begin()` 的返回值,以确保 CAN 总线没有错误。如果返回值为 `CAN_OK`,则表示初始化成功;否则,可能存在错误。

3. **串口通信问题**:如果程序在 `Serial.println("pos65")` 处卡住,可能是串口通信出现了问题。请检查你的串口连接是否正确,以及串口波特率是否与你的设备兼容。

4. **代码逻辑问题**:如果上述问题都排除了,那么可能是代码逻辑上的问题。请检查你的代码,确保在 `Serial.println("pos65")` 之后的代码没有逻辑错误或者死循环。

5. **硬件故障**:如果以上所有问题都排除了,那么可能是硬件故障。请检查你的 CAN 总线设备和 Arduino 板是否工作正常。

为了解决这个问题,你可以尝试以下步骤:

1. 确保硬件连接正确,包括 CAN 总线设备和 Arduino 板。
2. 检查串口波特率设置,确保与你的设备兼容。
3. 在 `CAN.begin()` 之后添加一个错误检查,例如:
   ```cpp
   if (CAN.begin(CAN_1000KBPS) != CAN_OK) {
     Serial.println("Failed to initialize CAN bus");
     while(1); // 死循环,等待用户干预
   }
   ```
4. 仔细检查代码逻辑,确保没有死循环或其他逻辑错误。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分