stm32f10x cmsis spi driver

0

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 []
    
pregunta Long Smith

1 respuesta

1

El concepto de SPI incluye que el esclavo nunca controla el reloj. Esto significa que su RasPi, ya que actúa como el maestro del bus, necesita sacudir el reloj, si quiere recibir algo. Intente llamar periódicamente un "método de recepción" en el RasPi.

    
respondido por el DPF

Lea otras preguntas en las etiquetas