SPI Transfer con la placa STM32F4 se atasca en SPI_WaitTX

1

Soy nuevo en todo lo relacionado con el hardware integrado, y me estoy atascando al intentar conectar mi tarjeta de descubrimiento STM32F4 a una unidad IMU de Bosch BMX_055.

Aquí hay un fragmento del código que estoy intentando ejecutar:

bool testConnection() {
    SPI_ResetCS(&IMUSpi);
    SPI_Transfer8(&IMUSpi, 0x0);
    int chipId = SPI_Transfer8(&IMUSpi, 0x0);
    printf("Chip Id: %d\n", chipId);
    SPI_SetCS(&IMUSpi);
    return true;
}

Mi código luego se cuelga aquí:

inline uint8_t SPI_Transfer8(Spi* spi, uint8_t value) {
    *(uint8_t *)(&spi->spiPeriph->DR) = value;
    SPI_WaitTX(spi->spiPeriph);
    SPI_WaitRX(spi->spiPeriph);
    //SPI_WaitBSY(spi->spiPeriph);
    return *(uint8_t *)(&spi->spiPeriph->DR);
}

en la función SPI_WaitTX.

¡Cualquier idea sobre por qué está bloqueada / cómo solucionarlo sería muy apreciada!

    
pregunta Yousef Hindy

2 respuestas

4

Hay un montón de código que no nos has dado , pero como eres nuevo en la familia STM32, explicaré la "causa clásica" para este tipo de problema, ya que este es un problema. probablemente la causa para ti también.

  • En muchos núcleos STM32, incluido el STM32F4 en su placa, los diversos relojes de bloqueo periféricos están desactivados de forma predeterminada, para ahorrar energía. Si su código intenta acceder a un bloque periférico no bloqueado, se activa un "fallo de bus" en el núcleo.

  • Un "bloqueo" en dispositivos con ARM Cortex-M3 & Los núcleos M4, generalmente son causados por un código que tiene:

    a) activó un tipo de "Fallo" que no es un "Fallo difícil", pero no tiene un manejador de fallos registrado para ese tipo específico de Fallo; esto entonces hace que sea escalado para convertirse en una "Falla dura"; o

    b) desencadenó directamente una "Falla dura".

    El "controlador de falla de disco duro" predeterminado para muchos Cortex-M3 & Las cadenas de herramientas M4 son un simple bucle infinito, p. Ej. %código%. Puede instalar su propio código de controlador de fallas, pero a menos que lo haga, entonces la activación de cualquier tipo de falla generalmente se convierte en un bloqueo en un controlador de fallas. Para investigaciones simples, puede usar su depurador adjunto SWD / JTAG para obtener más información sobre el estado del núcleo y leer los registros relevantes para encontrar más información.

Ahora puede ver que coloca esas dos situaciones juntas y es probable que se produzca un bloqueo que se produce en el primer acceso a un bloque periférico (en su caso, SPI) porque no habilitó el reloj a ese periférico bloquear. Ese intento de acceso desencadena un fallo de bus. El controlador predeterminado de fallas de bus en su cadena de herramientas es un bucle infinito, fue habilitado (por ejemplo, en el código de inicio de su cadena de herramientas) y su núcleo se encuentra en el bucle that , o no se habilitó ningún controlador de fallas de bus, por lo que La falla se escaló para convertirse en una falla dura, y estás sentado en el bucle infinito del controlador de la falla dura.

Si mi hipótesis es correcta para su caso, al menos parte de la solución sería habilitar el módulo de reloj periférico SPI antes de intentar acceder a él, usando algo como esta línea, si ha incluido los encabezados CMSIS:

while (1) {}

No prometo que esta línea sea exactamente correcta para su MCU (actualmente es demasiado tarde para que vea las hojas de datos aquí) pero le da una pista del tipo de cosa que necesita investigar. Nota: también deberá habilitar los relojes periféricos para los módulos GPIO que esté utilizando para los diversos pines relacionados con SPI.

P.S. En el futuro, intente incluir un MCVE (Ejemplo Verificado Mínimo Completo) de su código, es decir, el más pequeño completo Ejemplo de código que aún muestra cualquier problema con el que está solicitando ayuda. De esa manera, no tenemos que adivinar qué podría incluir (o no incluir) el código faltante. Gracias!

    
respondido por el SamGibson
1

AFAICT, su código no llega lo suficientemente lejos como para demostrar que está recuperando nada del BMX_055. Por lo tanto, no hay pruebas de que el circuito sea correcto, así que considere que puede estar roto.

Hay varios modos SPI diferentes (combinación de reloj y estado MOSI de datos), y otras combinaciones de señales de habilitación. Puede ser difícil ver qué funciona, si es que funciona, si intenta utilizar el periférico SPI. Si tiene acceso a un osciloscopio, puede verificar que la IMU de Bosch BMX_055 está devolviendo los datos sin tener todo el código correcto (observando el pin MISO). Si no tiene acceso a un osciloscopio o analizador lógico (y sabe cómo usarlo), creo que su mejor táctica es ignorar el hardware periférico SPI al principio y usar "bit banging".

Cuando un periférico de hardware SPI 'correcto' no funciona la primera vez, o muy fácilmente, entonces conduzca las señales utilizando pines y software GPIO (la técnica llamada 'Bit Banging' y aparecerá en un buscador web).

Entonces conduzca el reloj, MOSI y Habilitar (posiblemente sea necesario) con el equivalente de digitalWrite, y obtenga la señal MISO con el equivalente de digitalRead. Intenta mantenerlo lo más simple posible.

Encontrará varios ejemplos en la web si busca 'SPI Bit-Banging'.

Encontré software de codificación SPI
SPI de software para PIC
y una pregunta de intercambio de pila ¿Qué es el bit banging?

Aquí hay una copia del pseudocódigo de la respuesta de pila de electrónica :

Make Slave Select low  
Short delay
Do 8 times
  Make the SCK (Serial Clock) pin low 
  Make the MOSI (Master-Out-Slave-In) pin high or low depending on bit 7 of the data  
  Add brief delay  
  Make the SCK output high
  Read MISO (Master-In-Slave-Out) pin
  Shift received data left, and shift the bit just read in as bit 0   
  Add brief delay  
  Shift the data byte 1 bit left
Make Slave Select high again  

Deberá leer y comprender la hoja de datos de la IMU Bosch BMX_055 para asegurarse de que está hablando correctamente porque hay varios "modos" de SPI diferentes. Los modos dependen del dispositivo esclavo y son la relación entre el estado del reloj y los datos.

Una vez que haya funcionado la electrónica y las señales, intente hacer funcionar el periférico SPI.

    
respondido por el gbulmer

Lea otras preguntas en las etiquetas