This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 0 voto(s) - 0 Media
  • 1
  • 2
  • 3
  • 4
  • 5
CONSULTA ESP32 con SN65HVD230
#1
Hola! Estoy trabajando en un proyecto basado en procesador ESP32, el cual se comunica con otra placa por protocolo CANBUS.

El bitrate, es de 125k por lo que es presumiblemente, "rapido".

Estoy usando la libreria de Sandeep Mistry o conocida también como adafruit_CAN que es compatible con un transceptor CAN de Texas Instruments SN65HVD230.

Utilizo freeRTOS  para un método que recibirá tramas por sockets, y las graba en la placa.

Luego la propia librería dota de un callback atachado a la isr para recibir las respuestas.

Aquí empieza mi problema, si le mando una trama por segundo, todo es maravilloso, pero en el momento que empiezo a mandarlas cada 200ms , puedo ver (con un analizador can enganchado al bus desde el pc) que las tramas están llegando, se estan recibiendo en la placa y esta está contestando, pero mi transceiver no dispara el callback.

He probado con olvidarme del callback y utilizar otro método de Rtos para la lectura, con el mismo resultado.

¿Alguna idea? 
Gracias de antemano.
  Responder
#2
(25-04-2023, 05:43 PM)wikilift escribió: Hola! Estoy trabajando en un proyecto basado en procesador ESP32, el cual se comunica con otra placa por protocolo CANBUS.

El bitrate, es de 125k por lo que es presumiblemente, "rapido".

Estoy usando la libreria de Sandeep Mistry o conocida también como adafruit_CAN que es compatible con un transceptor CAN de Texas Instruments SN65HVD230.

Utilizo freeRTOS  para un método que recibirá tramas por sockets, y las graba en la placa.

Luego la propia librería dota de un callback atachado a la isr para recibir las respuestas.

Aquí empieza mi problema, si le mando una trama por segundo, todo es maravilloso, pero en el momento que empiezo a mandarlas cada 200ms , puedo ver (con un analizador can enganchado al bus desde el pc) que las tramas están llegando, se estan recibiendo en la placa y esta está contestando, pero mi transceiver no dispara el callback.

He probado con olvidarme del callback y utilizar otro método de Rtos para la lectura, con el mismo resultado.

¿Alguna idea? 
Gracias de antemano.

Hola, me respondo por si alguna vez alguien se encuentra en la misma situación, huid de las librerías pese a que su autor hizo un gran trabajo, y funcionarán bien en la mayoría de los casos, si necesitáis una comunicación CAN en la que hayan muchos paquetes concurrentes con una ventana de tiempo muy corta no funcionarán, si queréis ahorrar tiempo y disgustos os dejo la implementación del driver IDF CAN de espressif, es una implementación mínima pero es un punto de partida, veréis que lee perfectamente y escribe a la velocidad que sea.


#include "driver/gpio.h"
#include "driver/can.h"
TaskHandle_t can_receive_task_handle;
void can_receive_task(void *arg)
{
  can_message_t rx_msg;
  for(;; )
  {
    if (can_receive(&rx_msg, pdMS_TO_TICKS(100)) == ESP_OK)
    {
      printf("Received message: ID = 0x%08X, Data: ", rx_msg.identifier);
      for (int i = 0; i < rx_msg.data_length_code; i++)
      {
        printf("%02X ", rx_msg.data[i]);
      }
      printf("\n");
    }
  }
}
void setup()
{
  Serial.begin(115200);
  //? Configure GPIO pins for CAN must be 4/5 or 16/17
  gpio_install_isr_service(0);
  gpio_set_direction(GPIO_NUM_17, GPIO_MODE_OUTPUT);
  gpio_set_direction(GPIO_NUM_16, GPIO_MODE_INPUT);
  //! Configure CAN controller
  can_general_config_t can_config = {
      .mode = CAN_MODE_NORMAL,
      .tx_io = GPIO_NUM_17,
      .rx_io = GPIO_NUM_16,
      .clkout_io = GPIO_NUM_NC,
      .bus_off_io = GPIO_NUM_NC,
      .tx_queue_len = 5,
      .rx_queue_len = 5,
      .alerts_enabled = CAN_ALERT_NONE,
      .clkout_divider = 0};
  can_timing_config_t timing_config = CAN_TIMING_CONFIG_125KBITS();
  can_filter_config_t filter_config = CAN_FILTER_CONFIG_ACCEPT_ALL();
  if (can_driver_install(&can_config, &timing_config, &filter_config) == ESP_OK &&
      can_start() == ESP_OK)
  {
    Serial.println("CAN controller initialized successfully");
  }
  else
  {
    Serial.println("Error initializing CAN controller");
    return;
  }
  //! Create RTOS task for receiving CAN messages
  xTaskCreate(can_receive_task, "can_receive_task", 2048, NULL, 5, &can_receive_task_handle);
}
void loop()
{

}
  Responder