[an error occurred while processing this directive]
|
Питание - обычное, от системного 5В через ферритовую бусину на DVDD и керамика 1 мкф на AGND. Дальше резистор 4.7 Ом на AVDD и такой же кондер на AGND. Reset заведен на ногу МК, которую дергаю перед инициализацией или по таймауту DRDY, но это не обязательно.
Запись, чтение, и инициализация такие (не знаю, для какого МК и на каком языке ты пишешь, поэтому опишу С-подобными словами):
Процедур записи две - одна 16-битная, другая 24-битная. Назовем их write_AD_16 и write_AD_24. Первая передает 16-, вторая - 24-битное слово. При аппаратном SPI это 2 или 3 байта соответственно. Принятые по SPI данные игнорируются. Обмен идет старшим битом вперед.
Процедура чтения read_AD(command,data) состоит из передачи одного байта (0х11 - команда чтения регистра данных) и приема трех байт. В первом из трех принятых байт нужно инвертировать старший бит, т.к. в этих ADшных АЦП знак перевернут. Других особенностей не имеет.
Инициализация у меня сделана так:
//Передаю подряд 32 единицы - это сброс интерфейса
write_AD_16(0xFF);
write_AD_16(0xFF);
//Настраиваю фильтр - максимальная скорость, без chop/skip/fast
//Первый байт (0x03) - команда записи в FILTREG
//Второй и третий байты (filtmax*16) - сдвинутое влево на 4 требуемое значение FILTREG (filtmax=176)
write_AD_24(0x03,filtmax*16);
//Запускаю калибровку шкалы первой пары каналов
//Первый байт (0x02) - команда записи в MODEREG
//Второй и третий байты (0xA170) - инструкция "начать калибровку шкалы"
write_AD_24(0x02,0xA170);
//Жду 30 миллисекунд (по паспорту - 28)
delayMS(30);
//Запускаю калибровку нуля первой пары каналов
//Первый байт (0x02) - команда записи в MODEREG
//Второй и третий байты (0x8170) - инструкция "начать калибровку нуля"
write_AD_24(0x02,0x8170);
//Жду 30 миллисекунд (по паспорту - 28)
delayMS(30);
//Запускаю калибровку шкалы второй пары каналов
//Первый байт (0x02) - команда записи в MODEREG
//Второй и третий байты (0xA171) - инструкция "начать калибровку шкалы"
write_AD_24(0x02,0xA171);
//Жду 30 миллисекунд (по паспорту - 28)
delayMS(30);
//Запускаю калибровку нуля второй пары каналов
//Первый байт (0x02) - команда записи в MODEREG
//Второй и третий байты (0x8171) - инструкция "начать калибровку нуля"
write_AD_24(0x02,0x8171);
//Жду 30 миллисекунд (по паспорту - 28)
delayMS(30);
//Запускаю калибровку шкалы третьй пары каналов
//Первый байт (0x02) - команда записи в MODEREG
//Второй и третий байты (0xA172) - инструкция "начать калибровку шкалы"
write_AD_24(0x02,0xA172);
//Жду 30 миллисекунд (по паспорту - 28)
delayMS(30);
//Запускаю калибровку нуля третьей пары каналов
//Первый байт (0x02) - команда записи в MODEREG
//Второй и третий байты (0x8172) - инструкция "начать калибровку нуля"
write_AD_24(0x02,0x8172);
//Жду 30 миллисекунд (по паспорту - 28)
delayMS(30);
//Перенастраиваю фильтр на нужную скорость и варианты chop/skip/fast
//Первый байт (0x03) - команда записи в FILTREG
//Второй и третий байты (filt*16+chop*4+skip*2+fast) - требуемое значение фильтра, chop/skip/fast соответственно
write_AD_24(0x03,filt*16+chop*4+skip*2+fast);
//Запускаю первое преобразование нулевого канала
//Первый байт (0x02) - команда записи в MODEREG
//Второй и третий байты (0x4170) - инструкция "начать преобразование нулевого канала"
write_AD_24(0x02,0x4170);
Вот, собственно, и вся инициализация. Чтение результатов преобразования произвожу по прерыванию от вывода DRDY следующим образом:
//Запускаю преобразование следующего канала
//Первый байт (0x02) - команда записи в MODEREG
//Второй и третий байты (0x4170+N) - инструкция "начать преобразование N-го канала", 0 <= N <= 5
write_AD_24(0x02,0x4170+N);
//Читаю регистр данных АЦП в свой буфер ADCbuf
//Передаваемый байт (0x02) - команда чтения из DATAREG
read_AD(0x11,ADCbuf);
Работает безупречно