+1, у меня это самый АЦП вот так конда-то был заговнокожен:
/******************************************************************************* Adc_WREG *******************************************************************************/ void Adc_WREG(uint8_t reg, uint8_t val) { uint8_t atx[3], arx[3]; atx[0] = 0x40 | reg; // reg address atx[1] = 0x00; // data byte qty -1 (1 byte) atx[2] = val; ADC_CS_0; HAL_SPI_TransmitReceive_DMA(&hspi1, atx, arx, 3); TimeOutStart(200); while(!ADC_CS_G && TimeOutGetTimeLeft()){}; } /******************************************************************************* Adc_RREG *******************************************************************************/ uint8_t Adc_RREG(uint8_t reg) { uint8_t atx[3], arx[3]; atx[0] = 0x20 | reg; // reg address atx[1] = 0x00; // data byte qty -1 (1 byte) atx[2] = 0x00; ADC_CS_0; HAL_SPI_TransmitReceive_DMA(&hspi1, atx, arx, 3); TimeOutStart(200); while(!ADC_CS_G && TimeOutGetTimeLeft()){}; return arx[2]; }
так же и данные выгребаются по DMA
/******************************************************************************* Adc_GPIO_EXTI *******************************************************************************/ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { ADC_CS_0; atxx[0]=0x12; HAL_SPI_TransmitReceive_DMA(&hspi1, atxx, arxx, 4); } /******************************************************************************* HAL_SPI_TxRxCpltCallback *******************************************************************************/ void HAL_SPI_TxRxCpltCallback(SPI_HandleTypeDef *hspi) { ADC_CS_1; if(atxx[0]==0x12) { atxx[0]=0; adc_last_value = (arxx[1]<<16) | (arxx[2]<<8) | arxx[3]; if(adc_last_value & 0x00800000)//sign
adc_last_value |= 0xFF000000;
}
}