Даташит читал. Сначала иницилизирую АЦП. Включаю буфер. Мне надо шесть каналов три на ферозонды три на акселерометры. опора внешняя на 2,5В. использую внутренний генератор.
код инициализации АЦП
Код
void ADC_Configuration(void){
int i=0b0000000000110000;
GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET); // выбор АЦП CS_AD7794
SPI_I2S_SendData(SPI2, 0b0000000000101000); //в буферный регистр (к регистру IO)
SPI_I2S_SendData(SPI2, 0b0000000000000000); //настройка выводов АЦП
while (i<=0b0000000000110101){ // здесь циклически калибрую каждый канал ацп по нулю и полной шкале
SPI_I2S_SendData(SPI2, 0b0000000000010000); //comunic reg
SPI_I2S_SendData(SPI2,i); //config reg ADC - конфигурирую АЦП
SPI_I2S_SendData(SPI2, 0b0000000000001000); //comunic reg
SPI_I2S_SendData(SPI2,0b1000001000001111); //mode reg ADC IZC-call калибровка нуля
while (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)!=0){} //проверка окончания преобразования (вывод DOUT/RDY)
SPI_I2S_SendData(SPI2, 0b0000000000001000); //comunic reg
SPI_I2S_SendData(SPI2, 0b1010001000001111); //mode reg ADC IFC-call калибровка полной шкалы
while (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)!=0){} //проверка окончания преобразования
GPIO_WriteBit(GPIOB, GPIO_Pin_12, Bit_RESET);
i++;
}
SPI_I2S_SendData(SPI2, 0b0000000000001000); //comunic reg после окончания калибровки каждого канала
SPI_I2S_SendData(SPI2,0b0000001000000110); //mode reg ADC default mode перевожу АЦП в режим непрерыного преобразования
}
В ходе выполнения программы мне необходимы данные со всех каналов. Кусок получения данных из АЦП для двух каналов представлен ниже
Код
SPI_I2S_SendData(SPI2, 0b0000000000010000); //комуникац регистр. выбираю регистр конфигурации
SPI_I2S_SendData(SPI2, (0b0000000000010000)); //в котором выбираю канал 0 (буфер включён)
SPI_I2S_SendData(SPI2, 0b0000000001011100); //в комуникац регистр запрос на получение данны х с АЦП
while (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)!=0){} // есть ли готовые данные в ацп
AX = SPI_I2S_ReceiveData(SPI2); // считываем старшие 16 бит с АЦП - информативные данные
Delay(0xaf);
SPI_DataSizeConfig(SPI2, SPI_DataSize_8b); // переводим SPi в 8-битный режим
hrn = SPI_I2S_ReceiveData(SPI2); // ситываю оставшиеся 8 бит, в этом байте мусор который я не использую
SPI_DataSizeConfig(SPI2, SPI_DataSize_16b);
SPI_I2S_SendData(SPI2, 0b0000000000010000); //комуникац регистр.
SPI_I2S_SendData(SPI2, 0b0000000000010001); //регистр конфигурации выбираю канал 1
Delay(0xfff); // задержка после выбора канала для разрядки конденсатора АЦП, какое бы значение не ставил не помогает
SPI_I2S_SendData(SPI2, 0b0000000001011100); //режим постоянного преобр.
while (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)!=0){} // есть ли готовые данные в ацп
AY = SPI_I2S_ReceiveData(SPI2); // считываем старшие 16 бит с АЦП - информативные данные
Delay(0xaf);
SPI_DataSizeConfig(SPI2, SPI_DataSize_8b);
hrn = SPI_I2S_ReceiveData(SPI2);
SPI_DataSizeConfig(SPI2, SPI_DataSize_16b);
при считывании данных по USART получаю следующее
Код
Test_AX032934_AY065535_AZ032255_FX032255_FY065535_FZ065535_
Test_AX032932_AY065535_AZ065535_FX065535_FY065535_FZ065535_
Test_AX032932_AY065535_AZ065535_FX065535_FY065535_FZ065535_
Test_AX032932_AY065535_AZ065535_FX065535_FY065535_FZ065535_
Test_AX032930_AY065535_AZ065535_FX065535_FY065535_FZ065535_
Test_AX032930_AY065535_AZ065535_FX065535_FY065535_FZ065535_
Test_AX032930_AY065535_AZ065535_FX065535_FY065535_FZ065535_
Test_AX032932_AY065535_AZ065535_FX065535_FY065535_FZ065535_
Test_AX032930_AY065535_AZ065535_FX065535_FY065535_FZ065535_
По отдельности каждый канал работает нормально. Но вот при переключении каналов получается такая каша. Микроконтроллер STM32f103. Где я мог ошибиться?