About the CAN controller.

cliftonk
Posts: 9
Joined: Sat Jun 10, 2017 8:43 pm

Re: About the CAN controller.

Postby cliftonk » Sat Dec 02, 2017 10:57 pm

I have a basic question:

1) How can I validate and test the CAN circuitry in the ESP32 DevKitC with only using a single DevKitC module?

I would like to validate that CAN works in the ESP32 DevKitC before buying a lot of other modules.

User avatar
rudi ;-)
Posts: 1729
Joined: Fri Nov 13, 2015 3:25 pm

Re: About the CAN controller.

Postby rudi ;-) » Wed Dec 06, 2017 3:02 pm

cliftonk wrote: The CAN chip on the CAN board that I have, the VP230, does appear to be a SN65HVD23x 3.3V, when I do a google search.
the CAN board which you have, which CAN board you use for this ( have you a link ? )
-------------------------------------
love it, change it or leave it.
-------------------------------------
問候飛出去的朋友遍全球魯迪

User avatar
rudi ;-)
Posts: 1729
Joined: Fri Nov 13, 2015 3:25 pm

Re: About the CAN controller.

Postby rudi ;-) » Wed Dec 06, 2017 3:08 pm

cliftonk wrote:I have a basic question:

1) How can I validate and test the CAN circuitry in the ESP32 DevKitC with only using a single DevKitC module?

I would like to validate that CAN works in the ESP32 DevKitC before buying a lot of other modules.
how looks your CAN circuitry?

to 1)
CAN tester, oscilloscope, logic analyzer

perhabs you have a look into basic first here or there or as video this helps to understand for pulls and terminate the CAN line, and whats happend, if this is not done ( some transceivers going to sleep )
-------------------------------------
love it, change it or leave it.
-------------------------------------
問候飛出去的朋友遍全球魯迪

1soproni
Posts: 3
Joined: Fri Dec 22, 2017 7:37 am

Re: About the CAN controller.

Postby 1soproni » Fri Dec 22, 2017 7:51 am

Hi guys,

I just heard about esp32. I use arduino (pro micro) with MCP2515 CAN module for my project (https://hackaday.io/projects/hacker/236035). I need also bluetooth feature (HFP and PBAP). Can I do it with a single esp32 board without extrnal can module?
Which board should I use?

cliftonk
Posts: 9
Joined: Sat Jun 10, 2017 8:43 pm

Re: About the CAN controller.

Postby cliftonk » Sat Dec 23, 2017 5:49 am

I bought the WaveShare CAN Module.
I hooked it up and everything works fine.
I might have had bad chips.

Bartimaeus
Posts: 3
Joined: Fri Jan 05, 2018 7:10 pm

Re: About the CAN controller.

Postby Bartimaeus » Fri Jan 05, 2018 8:28 pm

Are there configuration changes that need to be done based on different ESP32 modules for the CAN bus?

I'm not able to get any CAN bus functionality to work using the Arduino example from here:
http://www.iotsharing.com/2017/09/how-t ... rface.html

I have this module board which uses the ESP-WROOM-32: https://www.tindie.com/products/Fusion/ ... rod_search

Unlike the example, I only have one ESP module, but I do have a VSCOM USB-CAN adapter that I can send and print messages with with a python script. Nothing shows up on the CAN bus (probed with oscilloscope) when the ESP module is supposed to be transmitting (added a serial print after the call to ESP32Can.CANWriteFrame(&rx_frame) to check it wasn't hanging) When I send messages to the ESP module with the VSCOM the ESP module is not setting the acknowledge bit at the end of the received CAN frame.

I've ruled out all of the possible hardware things I could think of that could be causing the problem. I've confirmed that pins IO4 and IO5 are connected to the correct pins on the transceiver chip, and when I transmit a CAN message from my VSCOM the data shows up on the RXD output from the transceiver. The CAN bus is properly terminated with two 120 ohm resistors.

Any help is appreciated, was not expecting it to be so much trouble.

Bartimaeus
Posts: 3
Joined: Fri Jan 05, 2018 7:10 pm

Re: About the CAN controller.

Postby Bartimaeus » Mon Jan 08, 2018 2:29 am

Did some more troubleshooting today, it looks like writes to MODULE_CAN->OCR have no effect (always 0). This would explain what I'm seeing, but I don't know why it's happening.

ESP_Dazz
Posts: 308
Joined: Fri Jun 02, 2017 6:50 am

Re: About the CAN controller.

Postby ESP_Dazz » Mon Jan 08, 2018 8:29 am

The CAN output control register doesn't actually exist as the ESP32 CAN peripheral only consists of the controller portion and requires an external transceiver functionality.

One of the likely causes of the ESP32 not outputting anything during transmission could be due to the RX pin not being able to observe the TX pin. The first bit in a CAN message is a dominant bit (represented by a low voltage on the TX pin), however if the RX pin observes something different the CAN controller will automatically assume that it has lost arbitration and cease transmission immediately. To see if this is cause of the issue, try directly connecting the TX pin to the RX pin on the ESP32, and observe if there is any activity from the TX pin (in theory the TX pin should repeatedly transmit due to the lack of an ACK bit form another CAN module).

It should also be noted that the CAN controller has a self test mode and a self transmission request (see SJA1000 documentation) which will enable you to test the CAN controller using only a single ESP32 module.

Bartimaeus
Posts: 3
Joined: Fri Jan 05, 2018 7:10 pm

Re: About the CAN controller.

Postby Bartimaeus » Sun Jan 14, 2018 12:07 am

Thank you for the help, I looked at the R and D pins on the CAN transceiver and noticed that even though the D line (transmit) was changing the R line was not. It turns out that the Rs pin (mode select pin) on the CAN transceiver was connected to pin 27 (IO16) on the ESP-Wroom-32 module. Adding two lines of code to set GPIO_NUM_16 to OUTPUT and drive it LOW before initializing the CAN library solved the problem. Both receive and transmit functions appear to be working just fine now.

I'm less than thrilled with the Tindie seller that failed to give any documentation or examples for the board they were selling, would have saved me from spending two days trying to get the thing to work...

dmaxben
Posts: 108
Joined: Thu Nov 16, 2017 6:04 pm

Re: About the CAN controller.

Postby dmaxben » Tue Jan 16, 2018 8:21 pm

Just started messing around with CAN on the ESP32....I designed my own PCB using an Infineon 3.3v CAN transceiver chip, assembled a prototype, and got it working perfectly! Many thanks to the excellent work of everyone involved in bringing the ESP32's internal CAN controller to life.

The one question I do have is regarding the libraries/formatting/syntax of how messages are sent within your code. I am using Arduino.

Right now, here is the test code that works perfectly

Code: Select all

 
      my_frame.FIR.B.FF = CAN_frame_ext;
      my_frame.MsgID = 291;
      my_frame.FIR.B.DLC = 8;
      my_frame.data.u8[0] = 7;
      my_frame.data.u8[1] = 174;
      my_frame.data.u8[2] = 6;
      my_frame.data.u8[3] = 3;
      my_frame.data.u8[4] = 0;
      my_frame.data.u8[5] = 0;
      my_frame.data.u8[6] = 127;
      my_frame.data.u8[7] = 255;
      
      ESP32Can.CANWriteFrame(&my_frame);
My question is, does anyone have input as far as making the above formatting/syntax more concise, such as modifying the ESP32 native CAN library to handle the message buffer as a single array?

The MCP2515 CAN SPI interface chip libraries are extremely concise and easy to use with global variables and byte arrays to hold the message.

Using the MCP2515 library is in the format of:

CAN.sendMsgBuf (CAN ID, std/ext ID, DLC length, message_bytes_array);

std (11bit) ID = 0
extended (29bit) ID = 1

So the MCP2515 equivalent of my ESP32 example above would be

Code: Select all

byte my_frame[8] = {8, 7, 174, 6, 3, 0, 0, 127, 255};

CAN.sendMsgBuf (291, 0, 8, my_frame);
Two lines of code, versus 12 lines of code.

I have a couple very large and complex CAN interface programs (2000+ lines of code) written for 8-bit AVR and MCP2515's that I am migrating over to the ESP32. It would be extremely nice to be able to tweak the ESP32 CAN libraries so they are compatible with my existing (MCP2515) programs.....rewriting the entire program to fit the ESP32's different CAN handling syntax.

two lines of code to send a message, and the ability to just leave all of the CAN messages at the beginning of the program in global variables is much easier to work with than using 12 lines of code to send the same message.

Especially since my project has 200 CAN messages stored in global variables used throughout the program...

Thanks

Who is online

Users browsing this forum: JK Sleepling and 128 guests