RFID RC522 con STM32F769I-Discovery

1

Estoy intentando comunicarme con el chip rc522 con el uso de este código , solo modifiqué el SPI llamadas para usar las bibliotecas HAL y SPI inicializado con las bibliotecas HAL. Mantuvo todas las demás funciones intactas. Ahora la imagen de abajo es lo que capturé con mi analizador lógico y realmente no tengo idea de qué estoy haciendo mal. Para mi nuevo ojo, mi comunicación SPI se ve bien. Sin embargo, el chip no está devolviendo nada y recibo 0xFF cada vez (también capturé eso con mi analizador lógico mientras que el rc522 estaba conectado a mi STM32F7Discovery).

¿Alguientienealgunaideadeporquémichipnorespondeenabsoluto?

EstoyinicializandomiSPIcon:

/*SPISCKGPIOpinconfiguration*/GPIO_InitStruct.Pin=SPIx_SCK_PIN;GPIO_InitStruct.Mode=GPIO_MODE_AF_PP;GPIO_InitStruct.Pull=GPIO_PULLUP;GPIO_InitStruct.Speed=GPIO_SPEED_HIGH;GPIO_InitStruct.Alternate=SPIx_SCK_AF;HAL_GPIO_Init(SPIx_SCK_GPIO_PORT,&GPIO_InitStruct);/*SPIMISOGPIOpinconfiguration;MISOlineshouldbefloating*/GPIO_InitStruct.Pull=GPIO_NOPULL;GPIO_InitStruct.Pin=SPIx_MISO_PIN;GPIO_InitStruct.Alternate=SPIx_MISO_AF;HAL_GPIO_Init(SPIx_MISO_GPIO_PORT,&GPIO_InitStruct);/*SPIMOSIGPIOpinconfiguration*/GPIO_InitStruct.Pull=GPIO_PULLUP;GPIO_InitStruct.Pin=SPIx_MOSI_PIN;GPIO_InitStruct.Alternate=SPIx_MOSI_AF;HAL_GPIO_Init(SPIx_MOSI_GPIO_PORT,&GPIO_InitStruct);/*SPICSGPIOpinconfiguration*/GPIO_InitStruct1.Pin=SPIx_CS_PIN;GPIO_InitStruct1.Mode=GPIO_MODE_OUTPUT_PP;GPIO_InitStruct1.Speed=GPIO_SPEED_HIGH;GPIO_InitStruct1.Pull=GPIO_PULLUP;HAL_GPIO_Init(SPIx_CS_GPIO_PORT,&GPIO_InitStruct1);SPIx_CLK_ENABLE();SpiHandle.Instance=SPIx;SpiHandle.Init.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_32;SpiHandle.Init.Direction=SPI_DIRECTION_2LINES;SpiHandle.Init.CLKPhase=SPI_PHASE_1EDGE;SpiHandle.Init.CLKPolarity=SPI_POLARITY_HIGH;SpiHandle.Init.DataSize=SPI_DATASIZE_8BIT;SpiHandle.Init.FirstBit=SPI_FIRSTBIT_MSB;SpiHandle.Init.TIMode=SPI_TIMODE_DISABLE;SpiHandle.Init.CRCCalculation=SPI_CRCCALCULATION_DISABLE;SpiHandle.Init.NSS=SPI_NSS_SOFT;SpiHandle.Init.Mode=SPI_MODE_MASTER;

EstoyconectandoelpindereiniciodemiplacadirectamentealpindereinicioRFID-RC522.

Tambiénprobéelchipconlabibliotecademiguelbalboaparaarduinoyfuncionabienallí.

Despuésdepresionarelbotóndereinicioenmitablero,losdosprimerosvaloresnisiquierasondecodificadosporelsoftwaredelanalizador.Siveoloquesesuponequelabibliotecaestáenviandopararestableceres0x01<<1,entonces0x02comoladirecciónreg_command,luego0x0fcomocomandodereiniciodepcd.¿Porquéseríadiferente?

Aquíhayunaimagendecómosevelacomunicaciónjustodespuésdeunrestablecimiento:

Como se puede ver, mi selección de chip baja durante el reinicio y sigue siendo baja cuando comienza la comunicación, aunque puse un pullup en él.

También este párrafo de la hoja de datos me hace pensar que podría haber equivocado los valores de SPI CPOL / CPHA, ya que parece que los datos son estables durante la caída del límite del reloj (pensé que eso es lo que hacía SPI_PHASE_1EDGE):

  

Los bytes de datos en ambas líneas MOSI y MISO se envían con el MSB primero.   Los datos de las líneas MOSI y MISO deben ser estables en el borde ascendente de   El reloj y se puede cambiar en el borde descendente. Los datos son proporcionados por   el MFRC522 en el borde del reloj descendente y es estable durante el levantamiento   borde del reloj.

También a partir de este párrafo, que es el único que describe estos valores, no puedo descifrar cuál debería ser el valor base del reloj. Alto o bajo?

    
pregunta xtrinch

1 respuesta

3

Su sospecha parece ser correcta y la configuración de su reloj SPI es incorrecta. Se puede observar en la imagen del analizador lógico que los datos cambian en el flanco ascendente y se mantienen estables en el flanco descendente.

SirevisaeldiagramadetiempoSPIenlahojadedatosde RC522 . Puede ver que el reloj está BAJO antes de la comunicación, los datos se muestrean en el flanco ascendente y los datos cambian en el flanco descendente.

AhoraelSTM32tienelasconfiguracionesCPOLyCPHAqueasumióqueeranincorrectas.LadescripciónparaaquellosdeSTM32F7xx manual de referencia :

  

Bit1 CPOL: polaridad del reloj

     

0: CK a 0 cuando está inactivo

     

1: CK a 1 cuando está inactivo

     

Bit 0 CPHA: fase de reloj

     

0: la primera transición de reloj es el primer borde de captura de datos

     

1: la segunda transición de reloj es el primer borde de captura de datos

Para su configuración CPHA : SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE; es correcto, en el diagrama de tiempo los datos se muestrean en la primera transición de reloj. Pero debería ser un flanco ascendente y no una caída.

Para CPOL , su configuración está inactiva ALTA, mientras que en el diagrama de tiempo está inactiva BAJA. Si observa que si su señal de reloj se anulara, entonces la primera transición de reloj sería un flanco ascendente, mientras que los datos son estables y los datos cambiarían en el flanco descendente.

Así que, en general, intentaría cambiar esta línea:

SpiHandle.Init.CLKPolarity       = SPI_POLARITY_HIGH;

a:

SpiHandle.Init.CLKPolarity       = SPI_POLARITY_LOW;

También puede realizar una prueba y error porque tiene un máximo de 4 tipos de reloj y el analizador lógico para verificar las señales.

    
respondido por el Bence Kaulics

Lea otras preguntas en las etiquetas