Здравствуйте, у меня проблема с АЦП MAX1229 фирмы MAXIM. АЦП MAX1229 подключено к МК LPC2134 по SPI. Для начала работы с АЦП настраиваю его внутренние регистры: // конфигурирование АЦП, с помощью инициализации его управляющих регистров CS_ADC_S (0); // выставить сигнал выбора микросхемы АЦП в CS=0 S0SPDR_bit.DATA = 0x10; // записать байт в регистр АЦП RESET для сброса всех остальных регистров while (S0SPSR_bit.SPIF == 0){} // ожидание окончания записи по SPI CS_ADC_S (1); // убрать сигнал выбора микросхемы АЦП CS=1 CS_ADC_S (0); // выставить сигнал выбора микросхемы АЦП в CS=0 S0SPDR_bit.DATA = 0x66; // записать байт в регистр АЦП SETUP (код выбора регистра,режим внутреннего тактирования 10, внешний ИОН 01,разрешить запись в регистр UNIPOLAR) while (S0SPSR_bit.SPIF == 0){} // ожидание окончания записи по SPI CS_ADC_S (1); // убрать сигнал выбора микросхемы АЦП CS=1 CS_ADC_S (0); // выставить сигнал выбора микросхемы АЦП в CS=0 S0SPDR_bit.DATA = 0xFC; // write UNIPOLAR- настроить все входы АЦП в режим измерения синфазного напряжения while (S0SPSR_bit.SPIF == 0){} // ожидание окончания записи по SPI CS_ADC_S (1); // убрать сигнал выбора микросхемы АЦП CS=1
После чего произвожу запись управляющего слова в регистр CONVECTION АЦП, отвечающий за выбор канала АЦП(биты 3-6), режима преобразования(биты 1-2). CS_ADC_S (0); S0SPDR_bit.DATA = 0x86; // запись упрвляющего регистра CONVECTION(выбор регистра,номер преобразуемого канала 0000 (можно от 0 до 12), режим сканирования-11 как одиночное преобразование,не мерить температу 0) while (S0SPSR_bit.SPIF == 0){} CS_ADC_S (1); __delay_cycles(500*ADC_SPEED); // задержка как в datasheet
Далее типа должны следовать результаты преобразования, считывать которые можно по 0 значению сигнала EOC( end of convection) на АЦП , следовательно делаю циклический опрос данной линии нанеравенство 0: while ((IO0PIN&adc_eoc) != 0) { } // пока EOC не равно 0 , то находиться в теле цикла Следовательно по окончанию цикла можно считывать данные , но проблема в том , что цикл не заканчивается!!!!!!!!!!!!! Следовательно сигнал окончания преобразования не приходит!!! А ПОЧЕМУ???
Пытаюсь считывать данные, не дожидаясь сигнала окончания преобразования EOC(для этого просто комментирую предыдущий цикл) и выполняю следующие строки: CS_ADC_S (0); S0SPDR_bit.DATA = 0x00; //записываем левый байт, для того , чтобы считать данные с ацп по спадающему фронту тактового сигнала SPI while (S0SPSR_bit.SPIF == 0){} adc_data_low=S0SPDR_bit.DATA; // сохраняем первый считанный с АЦП байт, являющийся младшей частью значения преобразования. CS_ADC_S (1); __delay_cycles(5*ADC_SPEED); CS_ADC_S (0); S0SPDR_bit.DATA = 0x00; //write while (S0SPSR_bit.SPIF == 0){} adc_data_hing=S0SPDR_bit.DATA; // сохраняем второй считанный с АЦП байт, являющийся старшей частью значения преобразования. CS_ADC_S (1); Данные приходят, порой даже правильные, но вот есть проблема с непонятными выбросами непредсказуемых и неправдоподоподобных значений(с питанием всё впорядке). Я считаю , что проблема заключается в отсутствии сигнала окончания преобразования EOC от АЦП. Если кто сталкивался с данной проблемой или хочет высказать свои идеи по данному поводу, то пожалуйста напишите , а то у меня уже мозги кипят.
|