extraño comportamiento del SPI RFM95 con STM32L4 [cerrado]

0

Estoy usando CubeMX y HAL para programar un STM32L4. Estoy tratando de comunicarme con el módulo RFM96 usando SPI, pero estoy obteniendo resultados sin sentido.

De acuerdo con el documento RFM96 hoja de datos , para leer un byte de una dirección , Tengo que enviar 1 byte, MSB configurado a 0 (que indica el modo de lectura), los otros 7 bits indican la dirección. En la captura de pantalla a continuación verá que estoy intentando leer el valor del registro 0x03, que se supone que devuelve el valor 0x0B (predeterminado). El problema es que en lugar de recibir solo 0x0B, recibo lo que parece ser TODOS los valores de registro de RFM95. Verás que 0x0B también está presente.

Hedejadoqueelrelojavance8bytesmásdelonecesario,soloparademostrarelproblema.Además,soloexperimentoesteresultadosielLSBdelprimerbytees1.Sisolicitolosdatosenladirección0x02,obtendríaunarespuestacero(imagenacontinuación).Recibolamismarespuestasienvío0x00.

Este es el código que utilizo para generar las muestras del analizador lógico anterior.

uint8_t data[10];
data[0] = 0b00000011;//sent first
data[1] = 0b00000000;
data[2] = 0b00000000;
data[3] = 0b00000000;
data[4] = 0b00000000;
data[5] = 0b00000000;
data[6] = 0b00000000;
data[7] = 0b00000000;
data[8] = 0b00000000;
data[9] = 0b00000000;

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
HAL_SPI_Receive(&hspi1, (uint8_t *)data, 10, 100);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_SET);

Esta es mi función de inicio SPI:

  hspi1.Instance = SPI1;
  hspi1.Init.Mode = SPI_MODE_MASTER;
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
  hspi1.Init.NSS = SPI_NSS_SOFT;
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_256;
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
  hspi1.Init.CRCPolynomial = 7;
  hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE;
  hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;

Este código es rudimentario; Estoy usando un analizador lógico para depurar. ¿Alguien puede detectar lo que estoy haciendo mal? Por lo que sé, le estoy dando al RFM95 todos los requisitos que necesita en términos de MOSI, SCK y NSS.

    
pregunta jbird

1 respuesta

1

No reinicié manualmente (tire del pin 6 bajo) el RFM antes de realizar las operaciones anteriores. Simplemente confié en el reinicio del dispositivo después de que se aplicara la alimentación. La página 108 en la hoja de datos indica que el chip requiere una espera de 10 ms después de emitirse un restablecimiento en el pin 6. Decidí implementar un restablecimiento manual al inicio y esperar 10 ms. La comunicación SPI funcionó como debería después. La alimentación no siempre se cicla durante la programación, por lo que es necesario el restablecimiento manual.

    
respondido por el jbird

Lea otras preguntas en las etiquetas