RFID RC522 con STM32F769I-Discovery

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

ingrese la descripción de la imagen aquí

¿Alguien tiene alguna idea de por qué mi chip no responde en absoluto?

Estoy inicializando mi SPI con:

    /* SPI SCK GPIO pin configuration  */
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);

/* SPI MISO GPIO pin configuration; MISO line should be floating */
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);

/* SPI MOSI GPIO pin configuration  */
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);

/* SPI CS GPIO pin configuration  */
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;

Estoy conectando el pin de reinicio de mi placa directamente al pin de reinicio RFID-RC522.

También probé el chip con la biblioteca de miguel balboa para arduino y funciona bien allí.

Después de presionar el botón de reinicio en mi placa, el software del analizador ni siquiera decodifica los dos primeros valores. Si observo lo que se supone que la biblioteca debe enviar para el restablecimiento es 0x01<<1, entonces 0x02 como la dirección reg_command, luego 0x0f como comando de restablecimiento pcd. ¿Por qué sería diferente?

Aquí hay una imagen de cómo se ve la comunicación justo después de un reinicio:

ingrese la descripción de la imagen aquí

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

Además, este párrafo de la hoja de datos me hace pensar que podría haberme equivocado en mis valores SPI CPOL/CPHA, ya que parece que los datos son estables durante el borde descendente del reloj (pensé que eso es lo que estaba haciendo la configuración SPI_PHASE_1EDGE):

Los bytes de datos en las líneas MOSI y MISO se envían primero con el MSB. Los datos en las líneas MOSI y MISO deben ser estables en el flanco ascendente del reloj y se pueden cambiar en el flanco descendente. Los datos son proporcionados por el MFRC522 en el flanco descendente del reloj y son estables durante el flanco ascendente del reloj.

También 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?

Estás configurando an SPIx_NSS_PINy an SPIx_CS_PINtambién. ¿Cuál es tu pin de selección de chip real?
@Bence Kaulics SPIx_CS_PIN. Tienes razón, el NSS no hace mucho, solo se inicializa. Lo eliminé.

Respuestas (1)

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.

ingrese la descripción de la imagen aquí

Si revisa el diagrama de tiempo SPI en la hoja de datos del 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.

ingrese la descripción de la imagen aquí

Ahora el STM32 tiene las configuraciones CPOL y CPHA que asumió que eran incorrectas. La descripción para aquellos del manual de referencia STM32F7xx :

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 de CPHA : SpiHandle.Init.CLKPhase = SPI_PHASE_1EDGE;es correcta, en el diagrama de tiempo los datos se muestrean en la primera transición de reloj. Pero debería ser un borde ascendente y no descendente.

Para CPOL, su configuración es inactiva ALTA mientras que en el diagrama de tiempo es inactiva BAJA. Si observa que si su señal de reloj se negara, 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.

Entonces, en general, intentaría cambiar esta línea:

SpiHandle.Init.CLKPolarity       = SPI_POLARITY_HIGH;

a:

SpiHandle.Init.CLKPolarity       = SPI_POLARITY_LOW;

También puedes ir con prueba y error porque tienes un máximo de 4 tipos de reloj y el analizador lógico para verificar las señales.

¡Eso fue útil, gracias! Sin embargo, todavía hay un error en el protocolo informado por el rc522. Actualicé la publicación original con más información.
No importa, fue un error en mis modificaciones de la biblioteca. Puedo comunicarme bien con el chip ahora.
@Nirri Me alegro de escuchar eso.
Sin embargo, como regla general, siempre que SPI falle o se comporte de manera misteriosa, siempre verifique CPHA y CPOL. Así que este es un buen consejo, no obstante.
Ya cubriste esto perfectamente, solo quería agregar que este diagrama me parece muy útil al configurar CPOL y CK