Типичная функция обмена с 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 почти одно и то же. Протокол одинаковый.
Сообщение отредактировал GetSmart - Feb 1 2012, 12:58