Связь с МК PIC18F4320 по SPI. Добился чтения и записи регистров АЦП. НУжна помощь в стартовой инициализации..калибровке..
GetSmart
Feb 1 2012, 07:19
Стартовая инициализация и есть прописывание всех 16-ти (или 10-ти первых) регистров. Для калибровки нужно просто отправить команду как указано в даташите (проще, чем читать/писать регистры). Важно!! Не убирать ~CS до передачи последнего бита любой посылки с паузой хотя бы в пару таких же бит, иначе последний байт может не прописаться.
Чтобы стартануть синхронно с чем-то нужно передать команду DSYNC, а за ней любую другую, например RREG (без чтения регистров вообще для большей скорости). Далее АЦП будет работать в безостановочном режиме, периодически выдавая ~DRDY. Если стоит фильтр Sinc3, то корректные данные появятся через 3 (идеально чистые данные через 4, если канал сменился) строба DRDY. При каждом сигнале ~DRDY нужно давать команду RDATA на чтение 24 бит данных (хз обязательно или нет, но у меня так делается).
После команды DSYNC возможен досрочный строб ~DRDY в течение 1 мс после команды. Его нужно пропускать не засчитывая в те 3.
Спасибо за ответ. Калибровку смещения и усиления (6 последних регистов) я так и делал, как Вы и сказали, командой самокалибровки SELFCAL. но после проведения калибровки сигнал DRDY так и висит в 1...хотя в даташите пишут что при окончании калибровки должен упасть в 0. Может я что то упустил, непойму.
PS. Даташит написан коряво, обнаружил несколько косяков..в частности про чтении 1 регистра, АЦП выплевывает 2 байта вместо одного, где 1ый байт - мусор..а 2ой - данные читаемого регистра...
GetSmart
Feb 1 2012, 08:38
Я делал всё согласно даташиту и у меня всё работает так как описано.
Сразу после команды SELFCAL DRDY Установится в 1. Далее, через 7 периодов оцифровки (у меня период = 20 мс (50 гц)) появится 0-строб на DRDY. Всегда (!) при появлении строба DRDY нужно вычитывать RDAT. Далее нужно ничего не делать. Через ещё 7 периодов появится второй строб DRDY. Аппаратно обновятся последние 6 регистров и АЦП начнёт само оцифровывать заданный канал в непрерывном режиме, периодически выдавая строб на DRDY. Главное - установить правильно делитель модулятора (DEC0 & M/DEC1) - регистры 8 и 9.
В том то и дело, что 0 строб на DRDY не появляется после автокалибровки, висит в 1 после калибровки. Не сказал..я включил встроенный темп. датчик ( WrReg(1,0xFF), хотел с него данные почитать для начала.. регистры вот что пишу:
WrReg(0,0x0C);
WrReg(1,0xFF);
WrReg(0x02,0x00);
WrReg(0x03,0x00);
WrReg(0x04,0x00);
WrReg(0x05,0x00);
WrReg(0x06,0x00);
WrReg(0x07,0x00);
WrReg(0x08,0x3b);
WrReg(0x09,0x31); //sinc3 фильтр
WrByte(0xF0); // автокалибровка
GetSmart
Feb 1 2012, 09:17
~CS-ом дёргаете после каждой команды?
Попробуйте перед командой калибровки передать команду DSYNC (0xFC)
Да, конечно. а Вы делали автокалибровку после записи первых регистров (SETUP, MUX) или перед записью первых..?
Cs=1;
delay_ms(1);
// LCDClear();
cs=0;
delay_us(15);
WrReg(0,0x0C);
WrReg(1,0xFF);
WrReg(0x02,0x00);
WrReg(0x03,0x00);
WrReg(0x04,0x00);
WrReg(0x05,0x00);
WrReg(0x06,0x00);
WrReg(0x07,0x00);
WrReg(0x08,0x3b);
WrReg(0x09,0x31); //
//delay_us(10);
WrByte(0xF0); //
delay_ms(500);
Cs=1;
GetSmart
Feb 1 2012, 09:32
Всё понятно.
~CS нужно дрыгать перед передачей команды. SELFCAL - команда. Где там дрыг CS ?
Если я правильно понимаю, каждая строка WrReg(...) тоже отправляет команду 0x50. И перед ней тоже нужно дрыгать CS.
Код
delay_ms(500);
Cs=1;
- это что, пауза в пару бит?

Я точно не уверен, но имхо команда будет принята/активирована только после перехода CS в 1.
Косяяяяяк!!

спасибо, щас попробую..а про паузу..да я уж не знал что делать, думал времени ему маловато мб на автокалибр
какой Вы кварц использовали для АЦП?
GetSmart
Feb 1 2012, 10:37
4,9 mHz
Все равно не получается. У вас остался фрагмент кода инициализации АЦП..взглянуть бы..
GetSmart
Feb 1 2012, 12:17
У меня на LPC213x
Начальное состояние регистров, которые я прописываю
Код
0x18,0x00,0x01,0x00,0x00,0x00,0xff,0xff,0x80,0x21
На самом деле прописываются регистры или нет можно выяснить прописыванием регистра DOUT (толи 6 то ли 7) предворительно установив DIR.
Я регистры прописываю все разом (10 или 16) за одну команду.
все перепроверил..регистры пишутся нормально, читаются тоже. Ощущение, что калибровка вообще не работает..из FSR1,2,3 (регистры 14-16) читаются дефолтные значения..
GetSmart
Feb 1 2012, 12:27
Типичная функция обмена с ADS1216
Код
static void WRITE_ADS1218(uInt cmd, uInt cnt, const u08 *ptr)
{
ON_CS_ADS1218;
txByteSPI(cmd);
if (cnt)
{ rxtxByteSPI(cnt-1);
while (cnt--)
rxtxByteSPI(*ptr++);
}
rxtxByteSPI(-1); // ожидание конца передачи байта
WAIT(_16Tosc);
OFF_CS_ADS1218;
if (cmd != ads_RREG) WAIT(_16Tosc); // ads_RREG = холостая команда
}
...
WRITE_ADS1218(ads_WREG+0, len, &ADS_buf[0]);
WRITE_ADS1218(ads_DSYNC,0,0);
READ_ADS1218(ads_RREG+0, len, &ADS_readed[0]);
if (cmd != ads_RREG) WRITE_ADS1218(cmd,0,0); // здесь может быть команда калибровки
Но функции работы с SPI у меня в каком-то смысле нестандартные. rxtxByteSPI - сначала ждёт готовности, потом читает принятый байт из SPDR, потом передаёт новый байт и выходит. Если аргумент -1, то всё то же, но без передачи байта. Так я выжимал максимум быстродействия без пауз между передачей байт.
Цитата(Dimk @ Feb 1 2012, 17:20)

все перепроверил..регистры пишутся нормально, читаются тоже. Ощущение, что калибровка вообще не работает..из FSR1,2,3 (регистры 14-16) читаются дефолтные значения..
ИМХО косяк в проге или схеме. У меня за время общения с этой штукой были косяки в которых я подозревал чип, но в итоге оказывалось косяки были в другом месте.
ADS1216 и ADS1218 почти одно и то же. Протокол одинаковый.
Запись работает нормально у меня,пользуюсь встроенной в компилятор библиотекой SPI и SPI ногами МК, АЦП команды понимает..все, кроме автокалибровки))) а что если принудительно записать в регистры калибровки что-нибудь..
А про косяк, благодарю..Сейчас еще перепроверю и погрызу даташит..
GetSmart
Feb 1 2012, 12:34
Цитата(Dimk @ Feb 1 2012, 17:30)

Запись работает нормально у меня,пользуюсь встроенной в компилятор библиотекой SPI и SPI ногами МК, АЦП команды понимает..все, кроме автокалибровки))) а что если принудительно записать в регистры калибровки что-нибудь..
Они доступны для записи, без проблем. Я их в определённые моменты и считываю, запоминая, и потом переписываю при смене PGA. На работу АЦП и проблемы с калибровкой запись/чтение этих регистров влиять не должно.
Кстати, автокалибровка обновляет 6 регистров и эти значения жёстко привязаны к значению PGA. Канал можно дрыгать без проблем не переделывая калибровку, а PGA если сменить, то без перекалибровки АЦП будет врать. И при смене внутренней/внешней опоры то же.
ага, это я в даташите тоже видел..мне б сейчас хотябы получить хоть что-нибудь на выходе АЦП..про правильность показаний пока молчу)
GetSmart
Feb 1 2012, 12:45
А как на счёт стробов DRDY без калибровки? То есть сразу после записи 16/10 регистров DRDY дёргается?
На всякий случай предлагаю поставить команду DSYNC и следом за ней RREG (без чтения регистров) после перезаписи регистров.
я вот чего тревогу и забил то..DRDY всегда в 1..что бы я не делал.
Цитата
На всякий случай предлагаю поставить команду DSYNC и следом за ней RREG (без чтения регистров) после перезаписи регистров.
щас попробую
С DI/O проверил..получил +5 В на всех выходах DIO.пробовал DSYNC посылать и RREG. DRDY все равно в 1. сейчас попробую DSYNC с ноги МК завести и прогнать еще раз.
GetSmart
Feb 1 2012, 13:33
PWDN и RESET в состоянии лог 1 ?
Кварц точно генерит?
И ещё. DRDY попробуйте читать программно из 9-ого регистра.
Еще раз перепроверил схему..оказалось, что я ранее завел DSYNC на ногу МК, но не придал этому значения..после того, как после калибровки сделал сброс DSYNC ногой МК, DRDY упал и пошли байты данных. Я очень рад, спасибо тебе за помощь!!
PS теперь чтение регистров и данных идет без мусора..как описано в даташите..
GetSmart
Feb 2 2012, 13:07
Цитата(Dimk @ Feb 2 2012, 17:35)

Еще раз перепроверил схему..оказалось, что я ранее завел DSYNC на ногу МК, но не придал этому значения..
Я так понимаю, ранее на этой ноге проц держал всегда 0 ?
да. теперь другой вопрос стоит. DRDY падает, все нормально..читаю данные периодически по готовности DRDY, читается одно значение..какието единицы в мл. разрядах..и не меняется это значение..в чем дело, непойму)
GetSmart
Feb 2 2012, 15:39
Ну судя по тем значениям регистров там мультиплексор настроен на измерение внутреннего температурного диода. Либо греть чип, либо ставить мультиплексор на внешний вход, на который подавать напругу.
то было давно. я отключил этот темп. датчик, подавал на вход мультиплексора REF( предварительно настроив регистр MUX на нужные мне ноги)..не видит он ничего..
после тщательной проверки печатной платы выяснилось, что нога REF+ АЦП не пропаялась...вот это косяк, блин. исправили и все заработало. Большое спасибо за оказанную помощь! моя первая тема на форуме и сразу ответ! Отличный форум!!
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.