У AD7792/3 много регистров, они нормально описаны в дейташите. Сначала АЦП конфигурируется
под задачу (какой ИОН, генератор, усиление и т.д.).
Код
void ad7793_init(void)
{
int8_t i;
/* Настройка порта */
DDRSPI |= (_BV(SPISS)|_BV(SPIMO)|_BV(SPISCK));
spi_ss_clear();
SPCR = _BV(SPE)|_BV(MSTR)|_BV(CPOL)|_BV(CPHA); /* MSB первый, mode 3, f/4 */
for (i = 0; i < 4;i++) spi_rw(0xFF);
/* настройка АЦП */
spi_rw(AD_CR_CON_W);
spi_rw(high(AD_CON));
spi_rw(low(AD_CON));
spi_rw(AD_CR_IO_W);
spi_rw(AD_IO);
/* Калибровка */
spi_rw(AD_CR_MD_W);
spi_rw(high(AD_MR_INT_ZSC));
spi_rw(low(AD_MR_INT_ZSC));
_delay_ms(10);
loop_until_bit_is_clear(PINSPI,PINRDY);
spi_rw(AD_CR_MD_W);
spi_rw(high(AD_MR_INT_FSC));
spi_rw(low(AD_MR_INT_FSC));
_delay_ms(10);
loop_until_bit_is_clear(PINSPI,PINRDY);
}
Потом устанавливается режим.
Код
void ad7793_mode_set(uint16_t mode)
{
spi_rw(AD_CR_MD_W);
spi_rw(high(mode));
spi_rw(low(mode));
}
Есть три режима работы (которые также описаны в дейташите), если не ошибаюсь. В одном из них действительно достаточно посылать один байт.
Код
uint32_t ad7793_data_get(void)
{
uint32_t t = 0;
loop_until_bit_is_clear(PINSPI,PINRDY);
spi_rw(AD_CR_DR_R);
*((uint8_t *)(&t) + 2) = spi_rw(0xFF);
*((uint8_t *)(&t) + 1) = spi_rw(0xFF);
*((uint8_t *)(&t)) = spi_rw(0xFF);
return t;
}
Удачи!