Fondo
Estoy tratando de hacer una conexión SPI entre dos STM32F103C8T6.
Mediciones
De acuerdo con mi analizador lógico, obtengo una señal que se ve bien (enviando 10 bytes con valores 0x55):
Resultados
La función de devolución de llamada de mi receptor para RX Complete también se detiene en el punto de interrupción (última línea en el código a continuación):
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
{
/* Prevent unused argument(s) compilation warning */
if (hspi1.RxXferCount == 10)
Problema
Envié 10 bytes, sin embargo, RxXferCount tiene el valor 0. En cambio, RxXferSize tiene el valor 10, pero pRxBuffPtr está vacío.
Pregunta
¿Cómo puedo recibir los bytes correctos?
Valores del registro SPI1 y variable hspi1
Código relevante
Inicialización (usando un GPIO para definir Maestro y Esclavo):
/* SPI1 init function */
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);
}
}
}
Sentirse estúpido, pero encontró la respuesta. Solo quiero mencionarlo para otros:
El resultado NO está dentro del argumento hsp (.pRxBuffPtr) del controlador de interrupciones
void HAL_SPI_RxCpltCallback(SPI_HandleTypeDef *hspi)
pero en la variable _spi_data proporcionada por el comando de recepción:
HAL_SPI_Receive_IT(&hspi1, _spi_data, 10);