NAK en CAN al programar stm32f407vg uC

1

Recibo un error NAK en la comunicación CAN. No estoy realmente seguro de por qué, también el encuadre es bastante extraño, ya que en el programa estoy enviando cosas diferentes. Tengo dos dispositivos y, por lo tanto, controlo 4 pines lógicos:

  1. Dispositivo primero (primera y segunda vista lógica) CAN1 Tx (1) y Rx (2)

  2. Segundo dispositivo CAN2 Tx (3) y CAN2 Rx (4)

A continuación se muestra una captura de pantalla de saleae de dos cuadros:

Elprimercuadroenelzoomseveasí:

Eselprimercuadroenzoom.MesaleunerrorporqueCAN2semantienealtotodoeltiempo.

Elsegundocuadro(ytodoslosposteriores)enelzoomseveasí:

LoúltimoenCAN1TxesNAKyenCAN1RxyCAN2RxesACK.Enzoom:

lo que quiero hacer de hecho es:

  • Ejecutar CAN a 100kB / s
  • CAN1 y 2 envían el mismo mensaje (CAN2 de hecho no envía nada, como CAN1 y CAN2 envía lo mismo)
  • Quiero enviar / recibir 8 bytes de datos (por el momento puede ser cualquier cosa)

Y el código responsable de configurar la CAN es:

CAN_InitTypeDef canInit;
RCC_APB1PeriphClockCmd(CAN_CLK, ENABLE); //enable clock

CAN_DeInit(CANx);

/* CAN cell init */
canInit.CAN_TTCM = DISABLE;
canInit.CAN_ABOM = DISABLE;
canInit.CAN_AWUM = DISABLE;
canInit.CAN_NART = DISABLE; //retransmission
canInit.CAN_RFLM = DISABLE;
canInit.CAN_TXFP = DISABLE;
canInit.CAN_Mode = CAN_Mode_Normal;
canInit.CAN_SJW = CAN_SJW_1tq;

/* CAN Baudrate = 100 kBps (CAN clocked at 42 MHz(168MHz / 4)) */
canInit.CAN_BS1 = CAN_BS1_11tq;
canInit.CAN_BS2 = CAN_BS2_8tq;
canInit.CAN_Prescaler = 21; // 42MHz/21 | 2MHz/(11+8+1)
CAN_Init(CANx, &canInit); //CANx == CAN2

/* CAN filter init */
CAN_FilterInitTypeDef  canFilterInit;
canFilterInit.CAN_FilterNumber = 0;
canFilterInit.CAN_FilterMode = CAN_FilterMode_IdMask;
canFilterInit.CAN_FilterScale = CAN_FilterScale_32bit;
canFilterInit.CAN_FilterIdHigh = 0x0000;
canFilterInit.CAN_FilterIdLow = 0x0000;
canFilterInit.CAN_FilterMaskIdHigh = 0x0000;
canFilterInit.CAN_FilterMaskIdLow = 0x0000;
canFilterInit.CAN_FilterFIFOAssignment = 0;
canFilterInit.CAN_FilterActivation = DISABLE; //do not use filter at all
CAN_FilterInit(&canFilterInit);

/* Enable FIFO 0 message pending Interrupt */
CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);

El marco es el siguiente:

sendMessage.StdId = 0x7FF;
sendMessage.ExtId = 0x1FFFFFFF;
sendMessage.RTR = CAN_RTR_Data;
sendMessage.IDE = CAN_Id_Extended;
sendMessage.DLC = 8;

for(int dataByte=0; dataByte<8; dataByte++){
  sendMessage.Data[dataByte] = 0xFF;
}

strongDelay();

while(1){   
    CAN_Transmit(CAN2, &sendMessage);
}

No sé qué tipo de información debería proporcionarse, pero sí lo que veo:

  • La identificación es completamente diferente de la que quiero enviar
  • El marco se interpreta como RTR, pero debe ser como el marco de DATOS
  • Algunos de los bits están equivocados, ya que puedes verlos tachados en el programa
  • La frecuencia es como la que yo quería (por lo que no es algo aleatorio, es enviar)
  • Más bien no es causado por el ruido en las conexiones (la vista pseudo analógica parece estar bien)
  • el transciever y otras cosas deberían estar bien, porque se compraron como listas para usar en los tableros CAN.

Cualquier ayuda sería apropiada, ya que me estoy quedando sin ideas, qué debería cambiar.

    
pregunta DawidPi

1 respuesta

1

Entonces, lo que hice mal fue el hecho de que me he olvidado de inicializar RCC para CAN1, ya que siempre se necesita, al inicializar CAN2

    
respondido por el DawidPi

Lea otras preguntas en las etiquetas