Hice el siguiente circuito. STM32 son STM32F103C8T6 (pastillas azules). Dejé los cables obvios:
- Los cuatro componentes conectados a tierra
- Se suministraron 5V a RX TJA 1050 desde RX STM32
- Se suministraron 5V a TX TJA 1050 desde TX STM32
Los TJA son estos:
ElsoftwaremásimportantequeseejecutaenTXSTM32:
/*CANinitfunction*/staticvoidMX_CAN_Init(void){staticCanRxMsgTypeDefCanRX;staticCanTxMsgTypeDefCanTX;CAN_FilterConfTypeDefsFilterConfig;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();}}
Enmain:
..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);}
YenTXSTM32,elmismocódigoparainicializarlaCANyelsiguientecódigoenlapáginaprincipal:
if(HAL_CAN_Receive_IT(&hcan,CAN_FIFO0)!=HAL_OK){Error_Handler();}voidHAL_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.
Loquehice
- TJA'sreemplazados,nohaydiferencia
- Coloquepuntosdeinterrupciónenvarioslugares,todopareceestarbien,exceptoladevolucióndellamada
Pregunta:
- ¿QuédebocambiarparapoderrecibirinformaciónenRXSTM32,CANRX?
Actualizar
Descubríquehayalgúnproblemadetransmisión:
dentrode
HAL_StatusTypeDefHAL_CAN_Transmit(CAN_HandleTypeDef*hcan,uint32_tTimeout)
seproduceuntiempodeespera(últimalínea):
while(!(__HAL_CAN_TRANSMIT_STATUS(hcan,transmitmailbox))){/*CheckfortheTimeout*/if(Timeout!=HAL_MAX_DELAY){if((Timeout==0U)||((HAL_GetTick()-tickstart)>Timeout)){hcan->State=HAL_CAN_STATE_TIMEOUT;/*Canceltransmission*/__HAL_CAN_CANCEL_TRANSMIT(hcan,transmitmailbox);/*Processunlocked*/__HAL_UNLOCK(hcan);returnHAL_TIMEOUT;}}}
Nohedescubiertodedóndeprovieneesteerror.
Tambiéndebidoalerror,noseenvíanadadespués.
Ahoranotengomástiempo,revisarémásmañanaomartesporlanoche.
Otrasverificaciones:
- Osciloscopio:aúnnohasidoverificado
- ResistenciaentreCANLyCANH:61.4ohm(mientrasnosetransmite),cuandosetransmiteunpocomenos.
- ElvoltajemientrasnoseenvíaentreCANLyCANHes0V
- Agregarunaresistenciade120RentreCANLyCANHnohaceningunadiferencia(siguesiendounHAL_TIMEOUT).
Actualizar
Todavíaesuntiempolimitado,perohiceunapruebasinusartransceptores,perodirectamenteconuncircuitosimplecomosedescribeen
Sinembargo,elresultadotodavíanofunciona.LosladosdelreceptorsonCASIiguales,peroeltransmisorapenastransmitenada
- Canal1:TransmisorTX
- Canal2:TransmisorRX
- Canal3:ReceptorTX
- Canal4:ReceptorRX
Eneldetalle(abajo),enlarampaseleccionadasepuedeverunaligeradiferencia(haymásdeesos).Sinembargo,dadoqueestánconectadosentresí,noesperaríaesto,peroquizásmianalizadorlógicobarato(5$)puedacausarestos.