sensor de lectura múltiple DMA HAL SPI STM32

0

Me gustaría leer un sensor sobre SPI usando el DMA. Como el sensor tiene algo de ruido, me gustaría tomar el promedio y, por lo tanto, necesito leer el sensor varias veces. Para esto decidí usar la función HAL_SPI_TransmitReceive_DMA (), pero parece que solo se lee el sensor una vez. Creo que el problema es, debido al Pin SS, que solo se activa una vez en todo el proceso de lectura. ¿Cómo puedo leer este sensor con el DMA, de modo que solo se interrumpa al final del proceso de lectura?

Sensor AS5048a: ( enlace ),

( enlace )

Mi código hasta ahora:

transfer_init:

void spi_getData(SPI_HandleTypeDef *hspi, uint8_t *tx, uint8_t *rx) {
    //tx containts the data after spi_prepare_tx_data and spi_get_tx_data
    if(spi_dma_complete==1) {
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_RESET);
        HAL_SPI_TransmitReceive_DMA(hspi,tx,rx,SPI_SIZE);
        spi_dma_complete=0;
    }
}
void spi_prepare_tx_data() {
    uint16_t data16=SPI_CMD_READ | SPI_REG_DATA;
    data16 |= spiCalcEvenParity(data16) << 15;

    tx_data[1]=data16;//(uint16_t)SPI_CMD_READ | (uint16_t)SPI_REG_DATA; 
    tx_data[0]=(data16>>2);
}

void spi_get_tx_data(uint8_t *tx) {
    for(uint8_t i=0;i<SPI_SIZE;i=i+2) {
        tx[i]=tx_data[0];
        tx[i+1]=tx_data[1];
    }
}

Rx DMA Interrupt:

void DMA1_Channel6_IRQHandler(void)
{
  /* USER CODE BEGIN DMA1_Channel6_IRQn 0 */
  spi_dma_complete=1;
  HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_SET);
  //spi_getData(&hspi1,spi_tx_buff,spi_rx_buff);
  /* USER CODE END DMA1_Channel6_IRQn 0 */
  HAL_DMA_IRQHandler(&hdma_spi1_rx);
  /* USER CODE BEGIN DMA1_Channel6_IRQn 1 */

  /* USER CODE END DMA1_Channel6_IRQn 1 */
}
    
pregunta HansPeterLoft

0 respuestas

Lea otras preguntas en las etiquetas