la comunicación CAN no funciona

3

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

simular este circuito : esquema creado usando CircuitLab

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 esto documento (gracias a Maple). Parte relevante:

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.

    
pregunta Michel Keijzers

3 respuestas

4
  

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

Si el canal 2 es verdaderamente CANH, con la misma base de tiempo que CANL en el canal 0, entonces ese es obviamente tu problema. No parece en absoluto saludable, debería parecer un espejo diferencial de CANL.

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

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

  • Siempre agregue 2 resistencias de terminación de 120ohm, una en cada extremo del bus, incluso si trabaja con velocidades de transmisión bajas y distancias cortas. A menudo se necesita una cierta diferencia de impedancia de aproximadamente 60ohm entre CANH y CANL para que los circuitos de CAN permanezcan felices.

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

    Hay un mito entre los no ingenieros que no necesitan una conexión a tierra para señales diferenciales, pero eso es una tontería a menos que el bus CAN esté aislado galvánicamente con optoacopladores o similares. 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 de tierra. Los transceptores CAN pueden recibir hasta aproximadamente 40 V de diferencia de potencial 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 justo como se esperaba, siempre debería tener un bit de relleno después de 5 bits consecuentes alto / bajo en un marco CAN.

    
respondido por el Lundin
2

Un problema obvio es que no tiene ninguna resistencia de terminación en el bus CAN. Recuerde, no son solo para terminar la línea de transmisión, sino que también son resistencias que se pueden juntar para que el bus se encuentre en estado recesivo cuando no está siendo impulsado explícitamente.

Si esto está en una sola placa, puedes ponerte unos 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 llevar a tierra para que ambos dispositivos utilicen la misma referencia de tierra.

    
respondido por el Olin Lathrop
2

Revisé una enorme cantidad de sugerencias, argumentos y contra argumentos aquí, y creo que todo esto le hizo un mal servicio. No hay magia en CAN, y aquí está la prueba:

Esteterribledesordenenmiescritorioesunbancodepruebasrápidoysucioparaalgunosprogramasenlosqueestoytrabajandoenestemomento.TienedoscontroladoresdemotordualesconinterfacesCANyAVRconectadosaCANatravésdelcontroladorMCP2515+transceptorTJA1050(¡exactamentelomismoqueustedtiene!).

Loscontroladoresdelmotorseconectaroncon3cables(incluidoeldetierra)peroelAVRtienesolo2.Notengonisiquieraunbusrecto:todoestáconectadoenlafuentesinusar(enestemomento,habíaotrocontroladorallíantes)DB15Enchufehiceuncírculosobrelafoto.Puedeverunsoloresistorde100ohmiossentadoallíconectandotodoslosCANLyCANHjuntos.Ytodofuncionabiena500kb/s.

Noestoysugiriendoqueestasealaformacorrectadehacerlascosas.Todoloquedigoesqueaestasdistanciasyvelocidades,sininterferenciasyconunapotenciaestable,todosesosdetallesfinosyconocimientossimplementenoimportan.

Entonces,estoesloqueestoysugiriendo.

  1. Tusesquemasestánbien.AsegúresedequetodoslosRX,TX,CANL,CANHseconectendeacuerdoconesto(inclusosisabequeestánbien,nuncaestádemáshacerunaverificación).

  2. Dejeesosresistoresde120ohmiosenlosmódulos.

  3. Silodesea,puedeconectardosTJA1050atierra,perosisuconfiguraciónescomolamía,noimportaenabsoluto,yaquetodofuncionaconlamismafuenteyladistanciaesinsignificante.

  4. ConectesuanalizadorlógicoparamedirTX(atierra)enelladodeenvío,yRX(atierra)enelladoderecepción.Creoqueestoyahasidosugeridoalmenos3veces,peronuncavilosresultados.

  5. Ejecutatusprogramas.DeberíaverexactamentelamismaseñalenRXquetieneenTX.Sinolohaces,entonceselproblemaestáenalgúnlugardelaconexiónCAN.Perosilohace,entonceselproblemaestáenelsoftware,muyprobablementeenlaconfiguracióndefiltroomáscara.

ACTUALIZACIÓN

Elobjetivoprincipaldeconectarcontroladoresdirectamentefueeliminar(enlamedidadeloposible)elaspectofísico.Siloscablessoncortos,losdiodossonrápidosyelarranqueescorrecto,nodeberíahaberningunadiferenciaenlospinesRX.Asegúresedeconectarelpull-upasuVccreal(esedocumentofueescritoparaelsistemade5V).

Sugieroquecompruebestusconexionesunavezydejesdeladolapreguntasobreelcableado.Centrémonosenelladodelsoftware.Asíescomolodiagnosticaría.

  1. Minimizatucódigo.LoúnicoquedebetenerenelladodeTXessolosuficienteparaenviarunmarcodedatosbaseunavezporsegundoenunbucle.Sugierotransmitirunnúmerodesecuenciacíclicadeunbytesimple.LoúnicoquedebetenersuladodeRXessololosuficienteparaleerestebyteytalvezimprimirloendepuración.Nodeberíanodevolvernadaparaevitarcontaminarlaprueba.

  2. DebugTXprimero.Mencionastequeenunmomentosolorecibíasunmensaje.Porlotanto,elobjetivoprincipalesasegurarsedequeTXenvíeesosmensajescadasegundo.Ydeberíaverlosconsuanalizadorlógicoenesebusdeunsolocable.

Problemascomunesaquí:usoincorrectodebuffersdetransmisión,manejoincorrectodeEOT,marcodedatosconformatoincorrecto(ID,bitsdecontrol,etc.).Tambiénpuedesvercómotubiblioteca/controladormanejaelbitACK.Técnicamentenoesnecesario,peroalgunasimplementacionespodríanintentarvolveratransmitirelmismomensajeunayotravezhastaqueserecibaelmensajeACK,loqueimpidequelosbuffersdeTxobtengandatosnuevos.

  • Con ese movimiento operativo hacia el lado RX y vea si recibe ese número de secuencia correctamente.
  • Problemas comunes aquí: diferente velocidad de datos, uso incorrecto de los buffers de RX, manejo incorrecto de las interrupciones, filtro incorrecto o máscara de filtro. Podría ayudar a configurar sus filtros para aceptar el mensaje de cualquier al principio.

    1. Solo cuando tanto TX como RX funcionan correctamente, puede realizar copias cruzadas del código de transmisión y recepción y comenzar a trabajar en la comunicación bidireccional de solicitud-respuesta.
    respondido por el Maple

    Lea otras preguntas en las etiquetas