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).
¿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:
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?
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.
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.
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.
Bence Kaulics
SPIx_NSS_PIN
y anSPIx_CS_PIN
también. ¿Cuál es tu pin de selección de chip real?xtrinch