La comunicación CAN no funciona

Hice el siguiente circuito. Los STM32 son STM32F103C8T6 (píldoras azules). Dejé fuera los cables obvios:

  • Los cuatro componentes conectados a tierra juntos
  • Suministrado 5V a RX TJA 1050 desde RX STM32
  • Suministrado 5V a TX TJA 1050 desde TX STM32

esquemático

simular este circuito : esquema creado con CircuitLab

Los TJA son estos:

ingrese la descripción de la imagen aquí

Software más importante que se ejecuta en TX STM32:

/* CAN init function */
static void MX_CAN_Init(void)
{

  static CanRxMsgTypeDef CanRX;
  static CanTxMsgTypeDef CanTX;
  CAN_FilterConfTypeDef sFilterConfig;

  hcan.Instance = CAN1;

  hcan.pRxMsg = &CanRX;
  hcan.pTxMsg = &CanTX;

  hcan.Init.Prescaler = 8;
  hcan.Init.Mode = CAN_MODE_NORMAL;
  hcan.Init.SJW = CAN_SJW_1TQ;
  hcan.Init.BS1 = CAN_BS1_12TQ;
  hcan.Init.BS2 = CAN_BS2_5TQ;
  hcan.Init.TTCM = DISABLE;
  hcan.Init.ABOM = DISABLE;
  hcan.Init.AWUM = DISABLE;
  hcan.Init.NART = DISABLE;
  hcan.Init.RFLM = DISABLE;
  hcan.Init.TXFP = DISABLE;
  if (HAL_CAN_Init(&hcan) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }


  sFilterConfig.FilterNumber = 0;
  sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
  sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
  sFilterConfig.FilterIdHigh = 0x07ff;
  sFilterConfig.FilterIdLow = 0x0000;
  sFilterConfig.FilterMaskIdHigh = 0x07ff;
  sFilterConfig.FilterMaskIdLow = 0x0000;
  sFilterConfig.FilterFIFOAssignment = CAN_FILTER_FIFO0;
  sFilterConfig.FilterActivation = ENABLE;
  sFilterConfig.BankNumber = 14;

  if (HAL_CAN_ConfigFilter(&hcan, &sFilterConfig) != HAL_OK)
  {
      Error_Handler();
  }
}

en principal:

..
hcan.pTxMsg->StdId = 0x100;
hcan.pTxMsg->ExtId = 0x01;
hcan.pTxMsg->IDE = CAN_RTR_DATA;
hcan.pTxMsg->IDE = CAN_ID_STD;
hcan.pTxMsg->DLC = 2;

while (1)
{
  hcan.pTxMsg->Data[0] = 0x10;
  hcan.pTxMsg->Data[1] = 0x1;

      HAL_CAN_Transmit(&hcan, 10)
  HAL_Delay(1000);
 }

Y en TX STM32 el mismo código para inicializar CAN, y el siguiente código en main:

if (HAL_CAN_Receive_IT(&hcan, CAN_FIFO0) != HAL_OK)
{
  Error_Handler();
}


void HAL_CAN_RxCpltCallback(CAN_HandleTypeDef* CanHandle)
{
if ((CanHandle->pRxMsg->StdId == 0x100) &&
    (CanHandle->pRxMsg->IDE   == CAN_ID_STD) &&
    (CanHandle->pRxMsg->DLC   == 2))
{
    printf("1");
}

Sin embargo, la devolución de llamada nunca se llama.

Lo que veo con un analizador lógico:

  • CANH (Canal 2) y CANL (Canal 0) reciben información
  • El canal 4 está conectado a RX STM32, CAN RX y no recibe nada

Veo X en la captura de pantalla a continuación, no estoy seguro de si esto es un problema.

ingrese la descripción de la imagen aquí

Lo que hice

  • Reemplazado TJA, no hay diferencia
  • Ponga puntos de interrupción en varios lugares, todo parece estar bien, excepto la devolución de llamada

Pregunta:

  • ¿Qué debo cambiar para poder recibir información en RX STM32, CAN RX?

Actualizar

Descubrí que hay algún problema de transmisión:

dentro

HAL_StatusTypeDef HAL_CAN_Transmit(CAN_HandleTypeDef* hcan, uint32_t Timeout)

se produce un tiempo de espera (última línea):

while(!(__HAL_CAN_TRANSMIT_STATUS(hcan, transmitmailbox)))
{
  /* Check for the Timeout */
  if(Timeout != HAL_MAX_DELAY)
  {
    if((Timeout == 0U) || ((HAL_GetTick()-tickstart) > Timeout))
    {
      hcan->State = HAL_CAN_STATE_TIMEOUT;

      /* Cancel transmission */
      __HAL_CAN_CANCEL_TRANSMIT(hcan, transmitmailbox);

      /* Process unlocked */
      __HAL_UNLOCK(hcan);
      return HAL_TIMEOUT;
    }
  }
}

No he averiguado de dónde viene este error.

También debido al error, no se envía nada después.

No hay más tiempo ahora, revisaré más mañana o el martes por la noche.

Otros controles:

  • Osciloscopio: aún no comprobado
  • Resistencia entre CANL y CANH: 61,4 ohm (mientras no transmite), cuando transmite un poco menos.
  • El voltaje mientras no se envía entre CANL y CANH es 0 V
  • Agregar una resistencia de 120 R entre CANL y CANH no hace ninguna diferencia (sigue siendo HAL_TIMEOUT).

Actualizar

Todavía por tiempo limitado, pero hice una prueba sin usar transceptores, sino directamente con un circuito simple como se describe en este documento (gracias a Maple). Parte relevante:

ingrese la descripción de la imagen aquí

Sin embargo, el resultado sigue sin funcionar. Los lados del receptor son CASI iguales, pero el transmisor apenas transmite nada

  • Canal 1: Transmisor TX
  • Canal 2: Transmisor RX
  • Canal 3: Receptor TX
  • Canal 4: Receptor RX

ingrese la descripción de la imagen aquí

En el detalle (abajo), en la rampa seleccionada se puede ver una ligera diferencia (hay más de esas). Sin embargo, dado que están conectados entre sí, no los esperaría, pero tal vez mi analizador lógico barato (5 $) podría causarlos.

ingrese la descripción de la imagen aquí

Comenzaría eliminando el cable de tierra "obvio" entre las partes Tx y Rx. Luego me aseguraría de que las resistencias de terminación estén instaladas correctamente. Finalmente mediría voltaje entre CANL y CANH con osciloscopio, porque lo que veo en CANH no se ve bien.
Además, ¿qué intentas hacer con hcan.pTxMsg->IDE repetido dos veces?
@Maple gracias por todos esos consejos. Siempre pensé que los dispositivos acoplados deberían estar conectados a tierra tanto como sea posible. Solía ​​hacerlo con SPI. Así que ahora estoy confundido cuando se debe hacer y cuando no. También creo que las resistencias de 120 ohmios ya están en la placa, pero puedo verificar con un multímetro (¿entre CANL y CANH, supongo?). Mi osciloscopio es realmente malo, apenas sirve para ver gráficos reales. Y la asignación de doble IDE es realmente un error estúpido (debe haberlo pasado por alto dos veces). Esta noche más tarde puedo verificar el circuito y el código nuevamente.
CAN usa señalización diferencial por lo que no necesita tierra común. De hecho, puede tolerar bastante voltaje CN. Es mejor diagnosticar en las condiciones esperadas de operación. Solo se requieren 120 ohmios para cables de más de unos pocos pies, por lo que algunas personas usan uno de 60 ohmios en su lugar. Asegúrese de que no sea el caso con sus módulos.
No necesita un osciloscopio muy bueno; lo que está buscando es que el voltaje entre CANL y CANH permanezca en 0 cuando no hay comunicación y pulso en la dirección correcta cuando la hay. Si el osciloscopio no te funciona, puedes medir ambas líneas a tierra de cada módulo. De acuerdo con la hoja de datos TJA1050, se suponía que debían inyectar un voltaje CN de 0.5V en estado inactivo. Esto es difícil de ver en el analizador lógico para el cable CANL. Si de hecho tiene CANH en el canal 2 y CANL en el canal 0 en su captura de pantalla, parece que CANL y CANH están cruzados.
@Maple ok, tal vez ese sea el problema (también), hasta ahora siempre lo usé (y nunca conseguí que CAN funcionara). Probablemente necesito 120 ohm, para la mayoría de mis dispositivos planificados, la distancia será uno al lado del otro, pero uno estará a unos 3 pies de distancia. Y puedo verificar el osciloscopio para 0.5V (especialmente en estado inactivo). Esta noche probaré todas las opciones e informaré. Muchas gracias por tus explicaciones.
Con cables tan cortos, la función principal de la(s) resistencia(s) es actuar como resistencia(s) de unión . Como tal, el valor no es crítico, ¡pero es crítico que haya uno real!
¿Cuál es la tasa de bits prevista y cuál es la tasa de bits real medida por el analizador lógico?
@PeterMortensen Si quisiera usar 7 dispositivos, todos uno al lado del otro (conector serial DB9 a conector serial DB9 sin cable), excepto un dispositivo que está a unos 3 pies de distancia, ¿qué resistencias debo agregar y dónde? La placa TJA1050 también tiene resistencias de 120 ohmios (pero no estoy seguro de cómo se usan, ya que ya están colocadas en la placa PCB, vea la imagen de arriba).
La tasa de bits del bus CAN es de aproximadamente 250 000 baudios y el analizador lógico es de 24 MHz. Eventualmente, quiero usar una tasa de bits más alta (preferiblemente 1 Mbps o más, pero creo que CAN no admite más).
¿ Qué tasa de bits del bus CAN mide con el analizador lógico (ancho de pulso más corto en los datos)?
Debería funcionar una sola resistencia de 60 ohmios, aunque para cumplir con el estándar de bus CAN deberían ser dos resistencias de 120 ohmios, una en cada extremo del bus. He visto un sistema funcionando con 3 resistencias, 40 ohm efectivos (error cometido en la producción del sistema) en el mundo real. Tenía problemas, pero no era por las 3 resistencias.
@Maple Lo siento, pero la parte de no necesitar tierra es una tontería. Los transceptores CAN pueden manejar hasta algunas diferencias de potencial de 40 V si tiene suerte, pero en realidad no hay garantías de que algo funcione si no conecta una señal a tierra. Esto es fundamental para cualquier electrónica de comunicación de datos que no esté aislada galvánicamente.
@Maple Como ejemplo de la vida real, ayer mismo estaba ayudando con la resolución de problemas de un bus CAN donde la comunicación entre la PC y el dispositivo estaba completamente muerta. Motivo: la conexión del cable de tierra de la señal se perdió accidentalmente. Naturalmente, esto se debe a que el potencial de tierra de la PC que se origina en la línea de 230 VCA puede ser literalmente cualquier cosa en comparación con el dispositivo alimentado desde otra fuente. Tan pronto como se reparó la señal de tierra, todo funcionó a la perfección.
@Lundin GRACIAS por esta explicación; Volveré a colocar el cable de tierra entre los dos STM (y yendo a ambos transceptores CAN), aunque todavía tengo el mismo problema, espero que este fin de semana pueda revisarlo más a fondo.
@Lundin Entonces, ¿básicamente sugieres pasar un cable entre dos puntos que tienen una diferencia de 230 V? Sí, los puntos en común pueden reducir los errores y generalmente se recomiendan. Pero no es tan simple como "conectar siempre a tierra". Sugiero echar un vistazo a 4.4 . OP declaró que todos sus nodos, excepto uno, estarán uno al lado del otro, por lo que asumí que ya tienen una fuente de alimentación común. Agregar otro cable a tierra es una receta para el bucle de tierra que a menudo es muy difícil de diagnosticar.
@Maple, si quiere decir con fuente de alimentación el mismo 'grupo' en un circuito eléctrico: sí. Incluso estoy pensando en usar un adaptador (5V, 6A más o menos) y alimentar todos los dispositivos desde el mismo adaptador. Uno incluye una tira de LED que usará más energía, de ahí el 6A). Y cada conector DB9 alimentará +5V y GND al siguiente dispositivo.
@Maple Es por eso que la persona que hizo la PCB CAN tiene que ser alguien que sepa lo que está haciendo cuando hace los diseños del suelo. Realmente es tan simple como siempre agregar una señal a tierra, o puede obtener todo tipo de errores intermitentes, particularmente en aplicaciones automotrices con altas corrientes en el suministro. Veo que esto falla una y otra vez en los buses CAN y lo he hecho durante los últimos 10 años más o menos.
Para explicar más el problema de la conexión a tierra, en un sistema como un automóvil, todas las conexiones a tierra deben ser como una "estrella" que se remonta a una sola fuente, ya que habrá grandes corrientes que fluyen a través de esta conexión a tierra. Si luego conecta dos nodos en los bordes de esta estrella sin señal a tierra, entonces el centro sucio de la estrella con todas las corrientes de tierra en todo el vehículo actuará como referencia para todas las señales. Sin embargo, si están conectados con una señal de tierra, entonces la tierra de alimentación sucia no estará involucrada en absoluto.
Ahora, si obtiene corrientes masivas que fluyen a través de la tierra de la señal y, por lo tanto, causan bucles de tierra, entonces el diseño de la placa de circuito impreso es una mierda. Se debe pensar un poco al hacer la PCB, no puede simplemente tirar un cable en la conexión a tierra después de que el CAD ya esté hecho y llamarlo "tierra de señal": eso podría dar problemas con los bucles de tierra.
El analizador lógico probablemente no sea capaz de sondear el bus CAN directamente. Utilice RX/TX en cualquier transceptor.
@Jeroen3 Haré esto (también), tengo 8 canales, así que puedo hacer RX/TX desde el receptor y el transmisor y CANL/CANH... el analizador lógico puede usar CAN como decodificador, así que supuse que sería capaz de manejar mensajes CAN también.
@MichelKeijzers ¿Quizás se espera que se use para las líneas RX/TX detrás del transceptor? Porque tendrá el mismo flujo binario allí, pero en sus niveles lógicos normales (3.3V / 5V). No he usado mucho los analizadores lógicos, así que no soy de mucha ayuda allí.
@Lundin Lo revisaré, gracias ... El analizador lógico es muy barato pero me ayudó mucho hasta ahora (aunque tal vez idem dito calidad). Mi osciloscopio es realmente malo, apenas utilizable (antiguo tipo analógico con algunos problemas de actualización).
@MichelKeijzers de su actualización parece un problema de software. No estoy familiarizado con esa biblioteca y cuando busqué ejemplos en la web, no vi nada más que personas que se tiraban del pelo con frustración. Incluso el código de bajo nivel que encontré aquí parece mucho más simple que esa biblioteca. Ahora, (hablando sin ningún conocimiento en absoluto) parece que usar la biblioteca requiere más que en su ejemplo de código, como la configuración del reloj, la configuración de E/S, etc.
@Maple De hecho, tengo algunos problemas con Cube/Hal, pero parece ser la forma predeterminada y asumiría que ST debería solucionarlo/apoyarlo. Soy bastante principiante, por lo que profundizar en todos los registros y hojas de datos relacionadas también es algo abrumador. Esperaba que CubeMX hiciera el trabajo. Aunque de todos modos nunca conseguí que funcionara una tira de led, decidí usar el software Arduino para STM32, pero no pude encontrar el software Arduino para STM32 para CAN.
Acerca de KEIL, traté de instalarlo una vez, pero uno de mis dispositivos probablemente necesitará un programa grande, por lo que probablemente llegue al límite de espacio libre de KEIL de todos modos, tarde o temprano, teniendo que encontrar otra solución nuevamente.
¿Has configurado GPIO con funciones alternativas? F103 necesita eso
Sí, lo intenté, no hubo mejoría.

Respuestas (4)

CANH (Canal 2) y CANL (Canal 0) reciben información

Si el canal 2 es realmente CANH, con la misma base de tiempo que CANL en el canal 0, obviamente ese es su problema. No se ve saludable para nada, debería verse como un espejo diferencial de CANL.

  • Sospecharía que algo como CANH está en cortocircuito con otra señal o algo en el circuito del transceptor CAN se está comportando mal (¿soldadura deficiente?).

  • También asegúrese de que no haya resistencias de extracción entre la MCU y el transceptor, o dentro de la MCU en los registros del puerto. Aunque lógicamente, si este fuera el problema, también causaría que CANL fallara.

  • Agregue siempre 2 resistencias de terminación de 120 ohmios, una en cada extremo del bus, incluso si trabaja con velocidades de transmisión lentas y distancias cortas. A menudo se necesita una cierta diferencia de impedancia de aproximadamente 60 ohmios entre CANH y CANL para que el circuito CAN permanezca feliz.

  • Obviamente, adjunte una señal a tierra entre cada nodo según lo requiera y exija el estándar CAN. De lo contrario, está a merced de cualquier potencial de tierra que tengan sus nodos, y si hay altas corrientes de tierra en la tierra del suministro, podría afectar la comunicación CAN si no usa una tierra de señal dedicada.

    Existe un mito circulando entre los que no son ingenieros de que no necesita una señal a tierra para señales diferenciales, pero eso no tiene sentido a menos que el bus CAN esté aislado galvánicamente con optoacopladores o similar. Las señales diferenciales son simplemente mucho más resistentes que otras señales, por lo que pueden funcionar por suerte incluso si el diseño del sistema es malo y no incluye una señal a tierra. Los transceptores CAN pueden soportar una diferencia de potencial de aproximadamente 40 V antes de que la comunicación se vea afectada.

La X roja en su alcance no es un error sino un relleno de bits. Su alcance los agrega allí para indicar que no son parte de los datos reales. Es tal como se esperaba, siempre debe tener un bit de relleno después de 5 bits altos/bajos consecutivos en un cuadro CAN.

Podría ser una soldadura deficiente, soy un novato con la soldadura, pero también probé diferentes transceptores CAN (del mismo tipo), teniendo el mismo problema. Espero que mis habilidades de soldadura sean tan malas (que mis STM32 funcionen bien). Yo mismo no usé ninguna resistencia, pero hay algunas en las placas del transceptor CAN (no estoy seguro de cómo están en el circuito, es tecnología SMD). Medí con un multímetro (y ocasionalmente envíos de 1 segundo) una resistencia de alrededor de 60-120 ohmios entre CANL y CANH, así que supongo que las resistencias integradas se encargarán de eso. Así que supongo que está bien.
"No se ve nada saludable, debería verse como un espejo diferencial de CANL". Ese fue mi primer comentario en este hilo. Luego me di cuenta de que está usando un analizador lógico, por lo que no debería poder ver CANL en absoluto, sin ajustar los niveles lógicos. El hecho de que lo vea probablemente significa que las líneas están intercambiadas.
@Maple Verificaré las líneas lo antes posible.
Umm, bueno, ¿puedes medir con un alcance y verificar que tienes 2.5V +/- 1V en ambas líneas? CANL va de 2,5 V a 1,5 V = dominante, CANH hace exactamente lo contrario.
"exactamente opuesto" sería pasar de 1.5 a 2.5V. CANH cambia entre 2,5 y 3,6 V, lo que permite ver en el analizador lógico. Pero todo esto es pelos de punta. La prueba más simple de comparar el pin TX en un módulo y RX en el otro indicará si las líneas CAN funcionan de inmediato. Y si lo hacen el problema está en el software.

Un problema obvio es que no tiene resistencias de terminación en el bus CAN. Recuerde, no son solo para terminar la línea de transmisión, sino que también son las resistencias de unión para que el bus esté en estado recesivo cuando no está siendo activado explícitamente.

Si esto está en una sola placa, puede salirse con la suya colocando alrededor de 60 Ω entre CANL y CANH. Si el bus CAN es un cable real, coloque 120 Ω entre CANL y CANH en cada extremo. En ese caso, el cable también debe tener tierra para que ambos dispositivos usen la misma referencia de tierra.

Gracias..lo intentare este fin de semana; Todavía me pregunto qué hacen las resistencias 120R en el tablero ... Supongo que estas son las resistencias sobre las que escribe. Usaré 120R, ya que eventualmente serán cables reales, aunque en su mayoría cortos.
@Michel: Si esas cosas TJA1050 son módulos cuando las resistencias ya están en ellos, entonces no deberías agregar las tuyas. Probablemente haya alguna opción para habilitarlos o deshabilitarlos. Normalmente, no desea que los nodos intenten terminar el bus. Desea terminar el autobús en cada extremo. Por esa razón, no esperaría que los módulos incluyeran las resistencias de terminación a menos que estuvieran habilitadas opcionalmente.
No hay forma de deshabilitarlos (al menos no sin desoldar/rayar el PCB)... de todos modos será fácil hacer una verificación para ver si resuelve el problema (si solo hay uno al menos).
Encontré este enlace: sparks.gogo.co.nz/… que dice "Tenga en cuenta que este transceptor tiene una resistencia de terminación 120R instalada (marca 121). Si tiene más de 2 transceptores en un bus, es posible que deba quitar esta resistencia para todos menos el primer y el último transceptor, su kilometraje puede variar".
@MichelKeijzers Eso es realmente extraño; como dice Olin, tales resistencias de terminación no deberían habilitarse como configuración predeterminada. Además, esas resistencias parecen 0603 o 0805, que posiblemente sean demasiado débiles para una terminación CAN adecuada. Debe usar una resistencia que pueda manejar un par de 100 mW. Uso 400 mW como regla general, pero no recuerdo de dónde saqué ese número.
@Lundin, lo que puedo hacer es arrancar la resistencia, soldar los dos extremos de la resistencia extraída y usar mis propias resistencias. Hice un terminador DMX hace algún tiempo que usa resistencias de 120 ohm 0.5W, por lo que 400 mW suena familiar.
Cuando dice "suelde los dos extremos de la resistencia extraída", espero que no se refiera a cortocircuitar las almohadillas donde estaba. Eso acortaría sus líneas L y H.
@Maple inicialmente quise decir eso, pero no es una buena idea, lo verifiqué y la resistencia entre CANL y CANH es actualmente de 61,4 ohmios, así que está bien.

Revisé una enorme cantidad de sugerencias, argumentos y contraargumentos aquí y creo que todo esto te hizo un flaco favor. No hay magia en CAN, y aquí está la prueba:

ingrese la descripción de la imagen aquí

Este horrible desorden en mi escritorio es un banco de pruebas rápido y sucio para un software en el que estoy trabajando en este momento. Tiene dos controladores de motor duales con interfaces CAN y AVR conectados a CAN a través del controlador MCP2515 + transceptor TJA1050 (¡exactamente lo mismo que tiene usted!).

Los controladores del motor se conectaron con 3 cables (incluida la conexión a tierra), pero el AVR solo tiene 2. Ni siquiera tengo un bus directo: todo está conectado en estrella en el enchufe DB15 que no se usa (en este momento, había otro controlador allí antes). en la foto. Puede ver una sola resistencia de 100 ohmios sentada allí que conecta todos los CANL y CANH juntos. Y todo funciona bien a 500kb/s.

No estoy sugiriendo que esta sea la manera correcta de hacer las cosas. Todo lo que digo es que a esta distancia y velocidad, sin interferencias y con potencia estable, todos esos detalles finos y conocimientos técnicos simplemente no importan.

Entonces, esto es lo que estoy sugiriendo.

  1. Tus esquemas están bien. Asegúrese de que todos los RX, TX, CANL, CANH estén conectados de acuerdo con esto (incluso si sabe que están bien, nunca está de más comprobarlo).

  2. Deje esas resistencias de 120 ohmios en los módulos.

  3. Puede conectar las tierras de dos TJA1050 juntos si lo desea, pero si su configuración es como la mía, no importa en absoluto, ya que todos se alimentan del mismo suministro y la distancia es insignificante.

  4. Conecte su analizador lógico para medir TX (a tierra) en el lado de envío y RX (a tierra) en el lado de recepción. Creo que esto ya se ha sugerido al menos 3 veces, pero nunca vi los resultados.

  5. Ejecute sus programas. Debería ver exactamente la misma señal en RX que en TX. Si no lo hace, entonces el problema está en algún lugar de la conexión CAN. Pero si lo hace, entonces el problema está en el software, muy probablemente en la configuración del filtro o la máscara.

ACTUALIZAR

El objetivo de conectar los controladores directamente era eliminar (tanto como fuera posible) el aspecto físico. Si los cables son cortos, los diodos son rápidos y el pull-up es correcto, no debería haber ninguna diferencia en los pines RX. Asegúrese de conectar el pull-up a su Vcc real (ese documento fue escrito para el sistema de 5V).

Sugiero verificar sus conexiones una vez y dejar de lado la cuestión del cableado. Centrémonos en el lado del software. Así es como lo diagnosticaría.

  1. Minimiza tu código. Lo único que debe tener en el lado de TX es suficiente para enviar un marco de datos base una vez por segundo en un bucle. Sugiero transmitir un número de secuencia cíclico simple de un byte. Lo único que debería tener su lado RX es lo suficiente para leer este byte y tal vez imprimirlo en la depuración. No debe devolver nada para evitar contaminar la prueba.

  2. Primero depure TX. Mencionaste que en un momento solo estabas recibiendo un mensaje. Entonces, el objetivo número 1 es asegurarse de que TX envíe esos mensajes cada segundo. Y debería verlos con su analizador lógico en ese bus de un solo cable.

Problemas comunes aquí: uso incorrecto de los búferes de transmisión, manejo incorrecto de EOT, marco de datos mal formado (ID, bits de control, etc.). También verifique cómo su biblioteca/controlador maneja el bit ACK. Técnicamente no es necesario, pero algunas implementaciones podrían intentar retransmitir el mismo mensaje una y otra vez hasta que se reciba ACK, bloqueando así los búferes Tx para que no obtengan nuevos datos.

  1. Con ese trabajo, muévase al lado RX y vea si recibe ese número de secuencia correctamente.

Problemas comunes aquí: tasa de datos diferente, uso incorrecto de búferes RX, manejo incorrecto de interrupciones, filtro o máscara de filtro incorrectos. Podría ayudar configurar sus filtros para aceptar cualquier mensaje al principio.

  1. Solo cuando tanto TX como RX funcionan correctamente, puede realizar una copia cruzada del código de transmisión y recepción y comenzar a trabajar en la comunicación bidireccional de solicitud-respuesta.
Comentaré esto pronto... Encontré un problema si apago un STM y el otro todavía tiene encendido el LED de encendido, así que creo que hay algún problema de voltaje (o un atajo en alguna parte). Acerca de 4, todavía estoy intentando, obtengo resultados diferentes cada vez, y RX/TX sigue siendo diferente, así que creo que el problema está en la conexión CAN. ¿Crees que puedo pasar por alto los TJA y, al igual que la prueba, conectar RX y TX de ambos STM juntos? (STM_Receiver_CAN_RX a STM_Transmitter_CAN_TX y STM_Receiver_CAN_TX a STM_Transmitter_CAN_RX?
Buena idea, pero no, es (solo un poco) más complicado que eso. Mira aquí
eso parece bastante fácil de probar. Con suerte, lo haré hoy si me queda tiempo. Gracias por toda la ayuda hasta ahora.
Hola Maple, lo probé sin transceptor y aún no funciona, también hay ligeras diferencias en el RX del receptor/transmisor STM aunque no esperaría esto, ya que están conectados. Ver la pregunta actualizada para el analizador lógico (abajo: ver actualización).
He agregado algunas sugerencias a la respuesta.
gracias... lo revisare despues del fin de semana cuando tenga mas tiempo. Realmente aprecio su esfuerzo por ayudarme (y para mí sería realmente un impulso si consigo que CAN funcione). con UART y SPI tuve menos problemas.

Aunque todavía no lo he intentado (después de todo, no necesitaba CAN), la solución es actualizar dentro de STM32CubeMX, la biblioteca HAL F1 a 1.7 (o superior), donde la implementación de CAN se ha corregido/cambiado.