+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;
}
}