Configuración de SPI entre una placa de descubrimiento STM32F4 y una olla digital MCP4151

0

Actualmente estoy trabajando en un proyecto en el que estoy intentando conectar un potenciómetro digital MCP4151 con el STM32F4-Discovery Board utilizando el IDE de Eclipse de Marte. He descargado e incluido el STM32F4xx HAL pero estoy luchando para obtener todos los pines y la configuración correcta.

De la hoja de datos del STM32F407 (página 49) pude deducir que quiero usar PA5 y PA7 como pines para SPI_SCK y SPI_MOSI. Así que modifiqué el código de este proyecto para habilitar estos pines:

void SPI_Init(){
   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.FirstBit = SPI_FIRSTBIT_MSB;
   hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
   hspi1.Init.NSS = SPI_NSS_SOFT;
   hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;

   HAL_SPI_Init(&hspi1);
   /* Peripheral clock enable */
   __SPI1_CLK_ENABLE();

   GPIO_InitTypeDef GPIO_InitStruct;
   /**SPI1 GPIO Configuration
   PA5 ------> SPI1_SCK
   PA7 ------> SPI1_MOSI
   */
   GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_7;
   GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
   GPIO_InitStruct.Pull = GPIO_NOPULL;
   HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

   GPIO_InitStruct.Pin = GPIO_PIN_0;                //Chip Select
   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
   GPIO_InitStruct.Pull = GPIO_PULLDOWN;
   HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); 

   __HAL_SPI_ENABLE(&hspi1);
}

Con eso trato de inicializar los valores en el potenciómetro usando:

void SPI_SendData(uint8_t* adress, uint8_t* data, uint16_t size, uint32_t timeout){

   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_SET);

   HAL_SPI_Transmit(&hspi1, adress, size, timeout);
   while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY);

   HAL_SPI_Transmit(&hspi1, data, size, timeout);
   while(HAL_SPI_GetState(&hspi1) == HAL_SPI_STATE_BUSY);

   HAL_GPIO_WritePin(GPIOC, GPIO_PIN_0, GPIO_PIN_RESET);
}

Y luego escribe:

void POT_Init(){
  uint8_t data = 0x00;
  SPI_SendData(&STATUS_REGISTER_ADDRESS, &data, 8, 100); //Set SREG bit 1 to 0. Device is NOT in shutdown.
  data = 0x0F;
  SPI_SendData(&TCON_BIT_REGISTER_ADDRESS, &data, 8, 100); //Connect Wiper 0
  data = 0x08;
  SPI_SendData(&WIPER_0_REGISTER_ADDRESS, &data, 8, 100);
}

El problema es que estoy probando SCK y SDI / PA5 y PA7 y no veo nada que se mueva a través de la línea. Los dos dispositivos están conectados de la siguiente manera:

Entonces, ¿por qué no estoy viendo nada? Supongo que falta algo en mi función de inicio, pero no puedo identificarlo y apreciaría una segunda mirada.

    
pregunta Jan Bartels

4 respuestas

2

No estoy seguro de que esto ayude más, dado la antigüedad de esta publicación. Sin embargo, me di cuenta de que está configurando PA5 y PA7 como función alternativa, pero en realidad no está especificando qué función alternativa a través de una asignación de GPIO_InitStruct.Alternate.

    
respondido por el user2382598
1

En primer lugar, debe habilitar el reloj para el periférico SPI antes de intentar inicializarlo. En segundo lugar, ¿también ha habilitado el reloj para los periféricos GPIO?

(Solo he usado STM32F103, lo cual es cierto que podría ser un poco diferente, pero lo dudo)

    
respondido por el William Brodie-Tyrrell
0

Encontré esta publicación mientras buscaba una publicación similar y vi que no tiene una respuesta aceptada, así que decidí escribir una respuesta (para que cualquier persona con un problema similar pueda encontrar una solución).

Antes de usar SPI hay algunas cosas que debes considerar:

  • La frecuencia máxima del SCLK con el que su dispositivo (MCP4151) puede funcionar.
  • El modo SPI en el que su dispositivo (MCP4151) puede funcionar
  • Los requisitos de tiempo de su dispositivo (MCP4151)

Habiendo dicho que hay algunas cosas que quiero mencionar.

En primer lugar, veo que en su función void SPI_SendData(uint8_t* adress, uint8_t* data, uint16_t size, uint32_t timeout) usted establece el pin de Selección de Chip, envía la dirección, envía los datos y luego los restablece. Por lo general, el Pin de selección de chip está activo bajo , por lo que para que SPI funcione, debe restablecer el pin y, una vez que haya terminado, configúrelo nuevamente.

Además, debe verificar la frecuencia del reloj SPI. Si su dispositivo (stm32f4) tiene una velocidad de reloj de 168 MHz y ha seleccionado SPI_BAUDRATEPRESCALER_2 , significa que su SPI tiene una velocidad de reloj de 42 MHz, que es bastante alta y estoy bastante seguro de que el MCP4151 no puede funcionar a una frecuencia tan alta. Para encontrar la frecuencia máxima que su dispositivo puede funcionar, debe consultar la hoja de datos.

Por último, pero no menos importante, en su hoja de datos debe verificar en qué modo SPI funciona el MCP4151. Hay 4 modos SPI diferentes, por lo que el modo que seleccionó puede estar equivocado.

P.S muchos dispositivos tienen estrictos requisitos de tiempo entre los comandos de lectura y escritura entre los comandos de escritura o lectura consecutivos.

    
respondido por el NikSotir
0

Tuve un problema con SPI en STM32H7. El problema era que faltaban los pulsos del reloj. El último byte tenía 4-7 pulsos de reloj en lugar de 8. El número de pulsos era diferente en cada ciclo de transmisión. Después de la investigación, descubrí que solo si los pines SPI están configurados con GPIO_SPEED_FREQ_LOW, este problema existe. Incluso con la frecuencia SPI hasta 7 kHz. Tan pronto como cambio la configuración de frecuencia de GPIO a otra (media, alta, muy alta), el problema desaparece. Todavía no he encontrado la explicación del problema.

    
respondido por el Taras

Lea otras preguntas en las etiquetas