реклама на сайте
подробности

 
 
> STM32_SPI_AD7794, Принимаю из АЦП подряд 3 байта, они абсолютно одинаковые.
nx6310
сообщение Jul 7 2010, 04:19
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174



Связь STM32 c АЦП AD7794 через SPI. Использую стандартные библиотеки от производителя.Прога на Atomic TrueStudio (аналог Eclipse ). Для чтения из АЦП 24 битных данных использую псоледовательно прием 3 байтов. При этом они получаются абсолютно одинаковыми по значению. Кто нибудь сталкивался с этим?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
nx6310
сообщение Jul 12 2010, 11:28
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 72
Регистрация: 28-06-10
Пользователь №: 58 174



Даташит читал. Сначала иницилизирую АЦП. Включаю буфер. Мне надо шесть каналов три на ферозонды три на акселерометры. опора внешняя на 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. Где я мог ошибиться?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jul 12 2010, 16:53
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(nx6310 @ Jul 12 2010, 17:28) *
Код
    while (GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_6)!=0){} // есть ли готовые данные в ацп
    AY = SPI_I2S_ReceiveData(SPI2);  // считываем старшие 16 бит с АЦП - информативные данные

cranky.gif
А где запись в SPI, которая так необходима для считывания?! Ведь я уже два раза выше это написал, пример привёл. Потом ещё demiurg_spb разъяснил...


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- nx6310   STM32_SPI_AD7794   Jul 7 2010, 04:19
- - AHTOXA   Чтобы прочитать байт из SPI, надо записать туда ка...   Jul 7 2010, 10:59
- - nx6310   Я пользуюсь стандартной библиотечной функцией. АЦП...   Jul 7 2010, 11:08
|- - AHTOXA   Давайте код, посмотрим.   Jul 7 2010, 12:04
- - nx6310   Вот код. АЦП в режиме постоянного преобразования. ...   Jul 8 2010, 02:38
|- - AHTOXA   Цитата(nx6310 @ Jul 8 2010, 08:38) Код w...   Jul 8 2010, 07:22
|- - demiurg_spb   Да. Стандартная наколка spi-нубов:-) Чем SPI хорош...   Jul 9 2010, 17:50
- - nx6310   А как переключать каналы в АЦП. Я выбираю канал, п...   Jul 12 2010, 03:04
|- - demiurg_spb   Вы datasheet вообще-то открывали? Уж больно странн...   Jul 12 2010, 11:03
- - nx6310   Она в нутри функции SPI_I2S_ReceiveData(SPI2) в би...   Jul 12 2010, 18:05
|- - AHTOXA   Цитата(nx6310 @ Jul 13 2010, 00:05) Она в...   Jul 12 2010, 18:50
- - nx6310   функцию GPIO_ReadInputDataBit() поменял. Длительно...   Jul 13 2010, 04:23
|- - AHTOXA   Цитата(nx6310 @ Jul 13 2010, 10:23) функц...   Jul 13 2010, 08:30
- - nx6310   Косяк был всё таки в SPI. Я думал что библиотечные...   Jul 20 2010, 04:52


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 02:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016