Estoy tratando de conectar raspberry pi con stm32f103 sobre SPI, donde stm es un esclavo.
Realmente no me gusta SPL y también encontré controladores de cmsis impresionantes Para periféricos de Keil, así que decidí usarlos.
Bueno, el problema es que no puedo enviar ningún dato a RPi. La lectura funciona bien: todo lo que envío desde RPi lo captura STM, pero no hay nada en la línea MISO.
Aquí está mi inicialización SPI y algunas definiciones utilizadas:
#define FRAME_START_POS 0
#define FRAME_TYPE_POS 1
#define FRAME_DATA_POS 2
#define FRAME_START_BYTE 0x1B
#define FRAME_TYPE_START 0x01
#define FRAME_TYPE_DATA 0x02
#define FRAME_HEADER_SIZE 2
#define RPI_SPI Driver_SPI2
void SpiInit(void)
{
out_data[FRAME_START_POS] = FRAME_START_BYTE;
out_data[FRAME_TYPE_POS] = FRAME_TYPE_DATA;
if(RPI_SPI.Initialize(RpiSpiCb) != 0)
{
LOGGING_Error("Can not initialize SPI");
}
if(RPI_SPI.PowerControl(ARM_POWER_FULL) != 0)
{
LOGGING_Error("Can't set SPI power");
}
int status = RPI_SPI.Control(ARM_SPI_MODE_SLAVE |
ARM_SPI_SS_SLAVE_HW |
ARM_SPI_CPOL0_CPHA0 |
ARM_SPI_DATA_BITS(8U) |
ARM_SPI_MSB_LSB, RPI_SPI_BUS_SPEED);
if(status == -1)
{
System_ErrorLedOn();
LOGGING_Error("Can't set SPI control");
}
}
static void transfer_headers(void)
{
/*
* out_data[0] and out_data[1] are never seen
* on the MISO line but in_data is filled.
*/
if(RPI_SPI.Transfer((void*)out_data, (void*)in_data, FRAME_HEADER_SIZE) != 0)
{
LOGGING_Error("Can't transfer data over SPI");
}
state = READ_HEADER;
}
No puedo encontrar lo que me estoy perdiendo aquí. Tal vez el envío de datos cuando eres un esclavo es complicado, pero no he encontrado nada al respecto.
P.S. El uso de RPI_SPI.Send()
en lugar de Transfer()
tampoco funciona.
ACTUALIZAR
Aquí está la función que se usa para enviar datos desde RPi:
def __send_data(self, data):
ans = self.stm.xfer2(data)
if ((ans[FRAME_START_POS] != FRAME_START_BYTE) or
(ans[FRAME_TYPE_POS] != FRAME_TYPE_DATA)):
raise IOError("Wrong bytes in header from stm: 0x%02x 0x%02x" %
(ans[FRAME_START_POS], ans[FRAME_TYPE_POS]))
if len(ans) > FRAME_HEADER_SIZE:
return ans[FRAME_HEADER_SIZE:]
return []