Forum: Mikrocontroller und Digitale Elektronik ESP32 mit CJMCU230 Transceiver


von Shannah (Gast)


Lesenswert?

Hallo zusammen,

ich hab ein ESP32 CAN Problem, bei dem ich nicht mehr weiterkomme.

Ich habe zwei ESP 32 (ESP32-WROOM) und möchte mit dem ESP32 eigenen 
CAN-Controller und zwei Transceivern (CJMCU 230 ( Sn65hvd230)) gerne 
eine CAN-Nachricht von einem zum anderen schicken.

Gefunden habe ich diese Demo:
http://www.iotsharing.com/2017/09/how-to-use-arduino-esp32-can-interface.html

leider funktioniert sie jedoch (bei mir) nicht.
Als zugehörige Bibliothek habe ich diese verwendet:

https://github.com/nhatuan84/esp32-can-protocol-demo/blob/master/examples/esp32can/esp32can.ino

Die GPIO habe ich mit 4 und 5 beibehalten, die Baudrate allerdings auf 
125kBPS gesetzt (bzw verschiedene getestet).

Es werden keine Daten hin und her transferiert.


Deshalb habe ich einen der ESP32 als EMpfänger beibehalten mit dem 
Receiver Code von nhatuan84
1
#include <ESP32CAN.h>
2
#include <CAN_config.h>
3
4
CAN_device_t CAN_cfg;
5
CAN_frame_t rx_frame;
6
7
void setup() {
8
    Serial.begin(115200);
9
    Serial.println("iotsharing.com CAN demo");
10
    CAN_cfg.speed=CAN_SPEED_125KBPS;
11
    CAN_cfg.tx_pin_id = GPIO_NUM_5;
12
    CAN_cfg.rx_pin_id = GPIO_NUM_4;
13
    
14
   // xQueueCreate(number of item the queue can hold,size of each item);
15
    CAN_cfg.rx_queue = xQueueCreate(10,sizeof(CAN_frame_t));
16
    //initialize CAN Module
17
    ESP32Can.CANInit();
18
}
19
20
void loop() {
21
    //CAN_frame_t rx_frame;
22
    //receive next CAN frame from queue
23
    //xQueueReceive( xQueue, &DataToReceive, xBlockTime );
24
    if(xQueueReceive(CAN_cfg.rx_queue,&rx_frame, 3*portTICK_PERIOD_MS)==pdTRUE){
25
26
      //do stuff!
27
      if(rx_frame.FIR.B.FF==CAN_frame_std)
28
        printf("New standard frame");
29
      else
30
        printf("New extended frame");
31
32
      if(rx_frame.FIR.B.RTR==CAN_RTR)
33
        printf(" RTR from 0x%08x, DLC %d\r\n",rx_frame.MsgID,  rx_frame.FIR.B.DLC);
34
      else{
35
        printf(" from 0x%08x, DLC %d\n",rx_frame.MsgID,  rx_frame.FIR.B.DLC);
36
        /* convert to upper case and respond to sender */
37
        for(int i = 0; i < 8; i++){
38
          printf("0x%02X ", rx_frame.data.u8[i]);
39
          }
40
        
41
      }
42
      //respond to sender
43
     // ESP32Can.CANWriteFrame(&rx_frame);
44
    }
45
}

und als Sender einen Arduino Mega verwendet mit dem SEED CAN Bus Shild 
und der SEED Bibliothek
(http://wiki.seeedstudio.com/CAN-BUS_Shield_V2.0/)

und folgendem Code
1
#include <mcp_can.h>
2
#include <SPI.h>
3
4
/*SAMD core*/
5
#ifdef ARDUINO_SAMD_VARIANT_COMPLIANCE
6
    #define SERIAL SerialUSB
7
#else
8
    #define SERIAL Serial
9
#endif
10
11
// the cs pin of the version after v1.1 is default to D9
12
// v0.9b and v1.0 is default D10
13
const int SPI_CS_PIN = 9;
14
15
MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin
16
17
void setup() {
18
    SERIAL.begin(115200);
19
20
    while (CAN_OK != CAN.begin(CAN_125KBPS, MCP_16MHz)) {            // init can bus : baudrate = xxxk
21
        SERIAL.println("CAN BUS Shield init fail");
22
        SERIAL.println(" Init CAN BUS Shield again");
23
        delay(100);
24
    }
25
    SERIAL.println("CAN BUS Shield init ok!");
26
}
27
28
unsigned char stmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
29
void loop() {
30
    // send data:  id = 0x00, standrad frame, data len = 8, stmp: data buf
31
    stmp[7] = stmp[7] + 1;
32
    if (stmp[7] == 100) {
33
        stmp[7] = 0;
34
        stmp[6] = stmp[6] + 1;
35
36
        if (stmp[6] == 100) {
37
            stmp[6] = 0;
38
            stmp[5] = stmp[6] + 1;
39
        }
40
    }
41
42
    CAN.sendMsgBuf(0x00, 0, 8, stmp);
43
44
Serial.println("Send data : ");
45
 
46
   for(int i = 0; i<8; i++)    // print the data of CAN 
47
        {
48
            
49
          Serial.print(stmp[i]);
50
           Serial.print("\t");
51
        }
52
        Serial.println();
53
    
54
    delay(1000);                       // send data per 100ms
55
}

Der Mega sendet auch, und der ESP32 empfängt ebenfalls Daten, allerdings 
nicht in den angegebenen delay(1000), sondern die Daten rasseln am ESP32 
einfach nur so rein. Er gibt mir mehrmals den canFrame
[0 0 0 0 0 0 0 1] und
[0 0 0 0 0 0 0 2] aus und bleibt dann auf Ewigkeiten einfach bei
[0 0 0 0 0 0 0 3] hängen.

Wenn ich im ESP32 Code die Zeile
"// ESP32Can.CANWriteFrame(&rx_frame);" auskommentiere, empfängt der 
ESP32
einmal den Frame mit der Zahl 3


08:13:04.786 -> rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
08:13:04.786 -> configsip: 0, SPIWP:0xee
08:13:04.786 -> 
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
08:13:04.786 -> mode:DIO, clock div:1
08:13:04.786 -> load:0x3fff0018,len:4
08:13:04.786 -> load:0x3fff001c,len:1100
08:13:04.786 -> load:0x40078000,len:9344
08:13:04.786 -> load:0x40080400,len:6348
08:13:04.786 -> entry 0x400806a8
08:13:04.905 -> iotsharing.com CAN demo
08:13:04.905 -> New standard frame from 0x00000000, DLC 8
08:13:04.905 -> 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x03 New standard 
frame from 0x00000000, DLC 8


Sowohl Shield als auch der ESP32 Tranceiver sollen nach Datanblatt 120 
Ohm terminiert sein. Ich habe keine ahnung mehr, woran es liegen könnte, 
und bin für jeden Tipp dankbar.

Viele Grüße

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.