Estoy intentando recibir tramas CAN en un STM32F412G-DISCOVERY con un transceptor SN65HVD233, transmitido desde un dispositivo USB2CAN. Ambos están conectados en un bus de unos 15 cm de largo con dos resistencias de 120 Ω en cada extremo.
Conecté un osciloscopio para leer los pines RX y TX en la placa STM32 antes de que sean transformados por el transceptor. Cuando configuro el controlador CAN en modo silencioso y envío un marco CAN desde el USB2CAN usando:
$ cansend can0 '144#25'
Veo en el osciloscopio en el pin de RX el cuadro completo (el amarillo es el RX de la placa, el azul de su TX):
NB:elcursorindicaelintervalodetiempodeunbit(2µs,latasadebitsesde500kb/s).
(ElHAL_CAN_Receive
callstilltimeout,peroeseesotroproblema).Perocuandopongoelcontroladorenmodonormal,estoesloquemido:
Yaquíestáelcódigo:
hcan1.pTxMsg=&g_out_msg;hcan1.pRxMsg=&g_in_msg;hcan1.Instance=CAN1;hcan1.Init.Prescaler=12;hcan1.Init.Mode=CAN_MODE_NORMAL;hcan1.Init.SJW=CAN_SJW_1TQ;hcan1.Init.BS1=CAN_BS1_1TQ;hcan1.Init.BS2=CAN_BS2_1TQ;hcan1.Init.TTCM=DISABLE;hcan1.Init.ABOM=DISABLE;hcan1.Init.AWUM=DISABLE;hcan1.Init.NART=DISABLE;hcan1.Init.RFLM=DISABLE;hcan1.Init.TXFP=DISABLE;if(HAL_CAN_Init(&hcan1)!=HAL_OK)fatal_error("failed to init HAL CAN.");
CAN_FilterConfTypeDef sFilterConfig;
sFilterConfig.FilterNumber = 0;
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT;
sFilterConfig.FilterIdHigh = 0x0000;
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000;
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = 0;
sFilterConfig.FilterActivation = ENABLE;
sFilterConfig.BankNumber = 14;
if (HAL_CAN_ConfigFilter(&hcan1, &sFilterConfig) != HAL_OK)
fatal_error("failed to setup CAN filter.");
HAL_StatusTypeDef can_status;
if ((can_status = HAL_CAN_Receive(&hcan1, CAN_FIFO0, 20000)) != HAL_OK)
fatal_error("failed to receive frame: %d", can_status);
Parece que el emisor (USB2CAN) intentó escribir un recesivo (1) para el segundo bit de la identificación, mientras que el receptor (STM32) envió un dominante (0): el emisor detectó esa colisión y dejó de emitir.
¿Por qué el controlador CAN STM32 envió ese bit dominante que detuvo la comunicación?