Antecedentes
Estoy tratando de hacer una conexión SPI entre dos STM32F103C8T6.
Mediciones
Según mi analizador lógico, recibo una señal que parece estar bien (enviando 10 bytes con valores 0x55):
Resultados
La función de callback de recepción de mi receptor también se detiene en el breakpoint (última línea en el código a continuación):
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
/* Evitar advertencia de compilación de argumento(s) no utilizado(s) */
if (hspi1.RxXferCount == 10)
Problema
Envié 10 bytes, sin embargo, RxXferCount tiene un valor de 0. En cambio, RxXferSize tiene un valor de 10, pero pRxBuffPtr está vacío.
Pregunta
¿Cómo puedo recibir los bytes correctos?
Valores del registro SPI1 y de la variable hspi1
Código relevante
Inicialización (usando un GPIO para definir Maestro y Esclavo):
/* Función de inicialización de SPI1 */
static void MX_SPI1_Init(void)
{
hspi1.Instance = SPI1;
hspi1.Init.Mode = (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_SET ?
SPI_MODE_MASTER : SPI_MODE_SLAVE);
hspi1.Init.Direction = SPI_DIRECTION_2LINES;
hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi1.Init.NSS = SPI_NSS_SOFT;
hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi1.Init.CRCPolynomial = 10;
if (HAL_SPI_Init(&hspi1) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
Función principal:
int main(void)
{
...
MX_SPI1_Init();
...
_transmitter = (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_SET ?
SPI_MODE_MASTER : SPI_MODE_SLAVE);
while (1)
{
if (_transmitter)
{
uint8_t data[] = { 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55 };
HAL_SPI_Transmit_IT(&hspi1, data, 10);
}
else
{
HAL_SPI_Receive_IT(&hspi1, _spi_data, 10);
}
}
}