¿Por qué HAL_SPI_Receive () no leerá el giro L3GD20H en mi placa de descubrimiento STM32F303?

0

Tengo una placa de descubrimiento STM32F303 para la cual el mems gyro L3GD20H está conectado al periférico SPI1 por defecto, es decir, Sclk, MISO y MOSI están conectados a los pines PA5, PA6 y PA7 respectivamente. El chip habilitado está conectado a PE3. Necesito entender las funciones de alto nivel de la biblioteca HAL para el microcontrolador STM32F3. Por lo tanto, para la experimentación, trato de comunicarme con el giroscopio usando HAL_SPI_Transmit () y HAL_SPI_Receive () .

Uso CubeMX para inicializar todos los periféricos. La configuración para el SPI1 se muestra a continuación

ComoCubeMXseencargadelcódigodeinicialización,solomostraréelcódigoadicionalquehabilitaelregistrodecontrolctrlReg1con0x0f(verfigura)

No me importan las configuraciones, solo deseo obtener algunos datos en el modo de sondeo. El registro XDataOut_L (0x28) es el que trato de leer

Uso CubeMX y AC6, que es System Workbench (basado en Eclipse), para compilar / compilar y ejecutar / depurar el proyecto. El código definido por el usuario es el siguiente

uint8_t data_ctrl1, address_ctrl1;
uint8_t data_out1, address_out1;

HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3, GPIO_PIN_RESET);
address_ctrl1 = 0x20;
data_ctrl1 = 0x0f;
HAL_SPI_Transmit(&hspi1, &address_ctrl1, 1, 50);
HAL_SPI_Transmit(&hspi1, &data_ctrl1, 1, 50);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3, GPIO_PIN_SET);

while(1)
{
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_RESET);
    address_out1 = 0x28 | 0x80;  // MSB bit = 1 to read
    HAL_SPI_Transmit(&hspi1, &address_out1, 1, 50);
    HAL_SPI_Receive(&hspi1, &data_out1, 1, 50);
    HAL_GPIO_WritePin(GPIOE, GPIO_PIN_3, GPIO_PIN_SET);
    HAL_Delay(100);
 }

El código se basa en un ejemplo en YouTube (MohamedYaqoobSTM) donde Mohamed lee con éxito su LIS302DL en su tablero de descubrimiento STM32F4.

Mi pregunta es ¿por qué no funcionará SPI_HAL_Receive () como se esperaba? Siempre obtengo el resultado 255 en el búfer data_out1 ...

    
pregunta Ronny Landsverk

1 respuesta

0

No se preocupe, es posible que esté obteniendo los datos correctos. Podría o debería ser 255, dependiendo de cómo lo esté leyendo a través del software. Lo primero que debe hacer para ver si puede comunicarse correctamente con el L3GD20 es intentar leer su nombre leyendo del registro WhoAmI. Debe devolver un valor establecido para el L3GD20 y puede verificarlo rápidamente.

Los datos en los registros estarán en un formato de 16 bits firmado , que se realiza mediante el envío de la mitad de los datos en el primer registro y la mitad en el segundo, y debe tener ambos para ver si hay un negativo o si debe tener cuidado al interpretar sus datos.

Aquí está lo que quiero decir. Si recibe un número con signo positivo, los dos registros podrían tener este aspecto: SUPERIOR INFERIOR 00000000 00010100 Pero si el mismo número es negativo, se verá así: SUPERIOR INFERIOR 11111111 11101100 Este dato está en complemento a dos. Ahora, si lee los datos como un bit sin signo de 8 (uint8_t), tanto el valor dirá una cosa como si lee en un bit de 8 firmado, ambos datos se leerán de manera muy diferente. Un 255 probablemente significa un número más pequeño para la mitad superior del registro leído como uint8_t o tal vez algunas otras combinaciones. Si intenta leer como un entero enteros con o sin signo, probablemente obtendrá los mismos datos que los 8 bits sin firmar.

Para poner ambos juntos, tendrás que hacer algunos trucos con los bits. En esencia, lea ambos en, cambie de bit uno de ellos, concatene, asegúrese de verificar y eliminar el bit negativo, y convierta de dos en compo si es necesario. También hay formas de solucionar este problema con el casting, pero no puedo decir de qué manera.

Puede ver esto en mi biblioteca para el L3GD20 que se encuentra en un repositorio git ubicado aquí: enlace Puede ser molesto, cuando solo quieres que algo funcione y te das cuenta de que hay más cosas que debes considerar. La biblioteca L3GD20.h es solo un riff en el encabezado Discovery de ST. Acabo de hacerlo más práctico, sin depender tanto.

Hazme saber si tienes problemas, es tarde, pero cuando miro, estoy seguro de que hay muchos detalles disponibles que puedo señalar. Buena suerte.

Sam

    
respondido por el Sam Gallagher

Lea otras preguntas en las etiquetas