Intento establecer una comunicación SPI entre un RPi (como MASTER) y un STM32F410 (como SLAVE, en un tablero Nucleo). Mi PoC es simple, envío 8 bytes desde el Rpi y los imprimo con el UART-over-USB en el Nucleo. Aquí está el código de envío (en Python) que se ejecuta en Rasberry Pi:
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 8000000
to_send = [1,2,3,4,5,6,7,8]
#spi.writebytes(to_send)
spi.xfer(to_send)
y el código de recepción en el STM32:
while(1) {
memset(buf, 0, BRAIN_COM_BUF_SIZE);
HAL_SPI_Receive(&hspi5, (uint8_t*)&buf, BRAIN_COM_BUF_SIZE, HAL_MAX_DELAY);
sprintf((char*) dbg_buffer, "[%d][%d][%d][%d][%d][%d][%d][%d]\r\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]);
HAL_UART_Transmit(&huart2, dbg_buffer, strlen((char const*) dbg_buffer), 1000);
}
y mi código de inicialización SPI (generado por CubeMX):
/* SPI5 init function */
void MX_SPI5_Init(void)
{
hspi5.Instance = SPI5;
hspi5.Init.Mode = SPI_MODE_SLAVE;
hspi5.Init.Direction = SPI_DIRECTION_2LINES;
hspi5.Init.DataSize = SPI_DATASIZE_8BIT;
hspi5.Init.CLKPolarity = SPI_POLARITY_LOW;
hspi5.Init.CLKPhase = SPI_PHASE_1EDGE;
hspi5.Init.NSS = SPI_NSS_SOFT;
hspi5.Init.FirstBit = SPI_FIRSTBIT_MSB;
hspi5.Init.TIMode = SPI_TIMODE_DISABLE;
hspi5.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
hspi5.Init.CRCPolynomial = 15;
if (HAL_SPI_Init(&hspi5) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
}
Nada lujoso ¿verdad? Esta es una comunicación de uno a uno, pero de todos modos configuré y configuré el pin CS. Mi problema con este código es que funciona como, IDK 5% de las veces, como máximo. El resto del tiempo, tengo basura o, peor aún, parece que la función HAL_SPI_Receive () no obtuvo absolutamente nada.
Ejemplo de comportamiento actual:
envio: [1] [2] [3] [4] [5] [6] [7] [8] y el STM32 recibe: [0] [0] [1] [1] [2] [2] [3] [3]
¡Cualquier pista y / o ayuda para desbloquearme será muy útil, gracias!