ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 апреля
473564
BaRaGoZ (15.12.2013 19:14, просмотров: 1907)
Есть МК Atmega64 к нему подсоединены 2 внешних АЦП AD7858. Настраиваю SPI на МК, по которому он общается с АЦП(МК в режиме мастер): #define SET_B(x) |= (1<<x) #define CLR_B(x) &=~(1<<x) #define ADC_BUSY0 PIND.1 //занятость АЦП void strob_CNV0 (void) { PORTE CLR_B (6); delay_us (delay_ADC); PORTE SET_B (6); } // SPI1 initialization // SPI1 Type: Master // SPI1 Clock Rate: 4000,000 kHz // SPI1 Clock Phase: Cycle Half // SPI1 Clock Polarity: Low // SPI1 Data Order: MSB First SPCR=0x50; //51 - 1 MHz; 50 - 4MHz SPSR=0x00; Затем начинается самое интересное, пытаюсь настроить control register на AD7858 и считать из него данные по всем каналам: 1 способ: void AD7858_0_Init1(unsigned char ch/*,unsigned char* ADC_IR_data*/) { PORTE CLR_B (7); //sync нога РЕ.7 заведен на !SYNC АЦП delay_us(delay_ADC); spi(0x03); //адрес 11 - регистр настройки /* Send the data that will be written into the device (MSB First) */ spi(0b00100000&(ch<<2)); spi(0x10); //пытался и просто spi(0x00); PORTE SET_B (7); strob_CNV0();//PE.6 МК заведен на сигнал !CONVST АЦП AD7858 while (ADC_BUSY0 == 1) ; //PD.1 заведен на BUSY АЦП AD7858 } и затем ф-ия считывания: unsigned char AD7858_0_Read(){ unsigned char data=66; PORTE CLR_B (7); //sync data = spi(0x00); PORTE SET_B (7); strob_CNV0(); while (ADC_BUSY0 == 1) ; return data; } в цикле while(1) пытаюсь опросить последовательно все 8 каналов АЦП: ............... while(1){ ............... AD7858_0_Init1(0); ADC_IR_data [1] = AD7858_0_Read(); ADC_IR_data [0] = AD7858_0_Read(); ............................................. AD7858_0_Init1(7); ADC_IR_data [15] = AD7858_0_Read(); ADC_IR_data [14] = AD7858_0_Read(); ............................................. } Пытался инициализировать АЦП еще по-другому, 2мя байтами: void AD7858_0_Init1(unsigned char ch/*,unsigned char* ADC_IR_data*/) { PORTE CLR_B (7); //sync нога РЕ.7 заведен на !SYNC АЦП delay_us(delay_ADC); /* Send the data that will be written into the device (MSB First) */ spi(0b11100000&(ch<<2)); spi(0x10); //пробовал spi(0x00); PORTE SET_B (7); strob_CNV0();//PE.6 МК заведен на сигнал !CONVST АЦП AD7858 while (ADC_BUSY0 == 1) ; //PD.1 заведен на BUSY АЦП AD7858 } 2 способа обусловлены тем, что по описанию АЦП в контрольный регистр пишется 14бит, а выбирается регистр нужный(куда пишем) 2 битами ADDR0 и ADDR1,вроде по описанию 14 и 15 биты как раз выбирают регистр для записи(6 и 7 - регистр для считки, там всегда пишу 0-ли, получается регистр данных), поэтому пробовал 2 способа, передавать номер регистра отдельным байтом и 2м способом-включать адрес записи в 2 последних бита старшего байта посылки. ПРОБЛЕМА В ТОМ, ЧТО ВО ВСЕХ СЛУЧАЯХ ПРИХОДЯТ 0-ЛИ ПО ВСЕМ КАНАЛАМ!!! ПРОБОВАЛ ЧИТАТЬ ИНФОРМАЦИЮ ВО ВРЕМЯ НАСТРОЙКИ РЕГИСТРОВ АЦП, ПРОБОВАЛ ПОДАВАТЬ НА АЦП КАКОЙ ТО ПОСТОЯННЫЙ СТАБИЛЬНЫЙ УРОВЕНЬ НАПРЯЖЕНИЯ НА ВХОД АЦП, ТОЖЕ САМОЕ... УЖЕ НЕ ЗНАЮ, ЧТО ДЕЛАТЬ!!! ПОМОГИТЕ ПЛИЗ...ОЧЕНЬ НАДО... PS:Единственное, не совсем пойму, как АЦП понимает когда в него пишут, когда читают, просто обе прцедуры схожи: 1)скидываем сигнал SYNC 2)Пишем адрес куда/откуда писать/читать 3)и одинаковой библиотечной процедурой( unsigned char spi(unsigned char data) ) пишем /читаем информацию. 4)Устанавливаем SYNC На всякий случай прилагаю архив с 2мя файлами(файл с main(),и файл с ф-ми инициализации АЦП и считки из него). Заранее спасибо!