Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATmega16 и ЦАП по SPI
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
pev
Мне нужно подключить к ATmega16 ЦАП AD7303 по SPI интерфейсу.
Схему включения взял из datasheet на AD7303.
Код для МК писал в WinAVR.
Проблема возникла в том, что на выходе ЦАП появляется только первое значение, занесенное в ЦАП.
А последующие значение ничего не изменяют.
Может у кого-нибудь есть пример кода на С. Помогите пожалуйста.
SS85
Пример работы с MAX522, у неё шестнадцетиразрядный формат данных.

Код
//Запись байта информации в ЦАП
void DataToDAC(unsigned char Data)
{
  PORTB |= DAC_CS;     //Разрешаем работу ЦАП

  SPI(0x23);                  //Передаем настройки ЦАП
  SPI(Data);                  //Передаем данные для ЦАП

  PORTB &= ~DAC_CS;  //Запрещаем работу ЦАП
}
pev
Цитата(SS85 @ Jul 11 2006, 17:34) *
Пример работы с MAX522, у неё шестнадцетиразрядный формат данных.

Код
//Запись байта информации в ЦАП
void DataToDAC(unsigned char Data)
{
  PORTB |= DAC_CS;     //Разрешаем работу ЦАП

  SPI(0x23);                  //Передаем настройки ЦАП
  SPI(Data);                  //Передаем данные для ЦАП

  PORTB &= ~DAC_CS;  //Запрещаем работу ЦАП
}


У AD7303 тоже шестнадцатиразрядный формат данных. Я использую такой же код, но не работает.
Может проблема в том, что вместо CS у AD7303 SYNC, который нужен, как я понимаю, для синхронизации. Пробовал не просто переключать его, а вырабатывал импульс. Эффект тотже самый.
Yura_K
В datasheet на DAC сказано, что вовремя передачи по SPI данных сигнал SYNC, держать в низком состоянии (GND). Если у Вас точно такой же код:
Код
  PORTB |= DAC_CS;     //Разрешаем работу ЦАП
  .....
  PORTB &= ~DAC_CS;     //Разрешаем работу ЦАП

то это неверно, т.к. PORTB |= DAC_CS устанавливает высокий уровень на SYNC во время передачи, а надо наоборот:
Код
  PORTB &= ~DAC_CS;  //Синхронизация записи в ЦАП (SYNC='0')

  SPI(HI_byte);                  //Передаем настройки ЦАП
  SPI(LO_byte);                  //Передаем данные для ЦАП

  PORTB |= DAC_CS;    // (SYNC='1')
SpiritDance
Сигнал ChipSelect(sync в даташите AD) в SPI на время предачи должен находится в низком состоянии. В неактивном состоянии - высокий уровень. Не забудьте с самого начала при инициализации SPI поставить его высокий уровень

Сам программил давно ЦАП от AD(щас уже не вспомню точно какой) на asm51. Диаграмму крутил ручками, так вот обнаружил одну особенность - ЦАП не воспринимал несколько старших бит. Мне пришлось выдавать несколько тактов до начала предачи информации , чтобы микросхема так сказать зацепилась. И на временной диаграмме даная фича была отрисована, при ближаешем рассмотрении. Так что смотрите очень внимательно на временные диаграммы и тщательно сверяйте с тем, что есть на самом деле.
Например какое у вас sync hold time?
pev
Цитата(Yura_K @ Jul 11 2006, 21:49) *
В datasheet на DAC сказано, что вовремя передачи по SPI данных сигнал SYNC, держать в низком состоянии (GND). Если у Вас точно такой же код:
Код
  PORTB |= DAC_CS;     //Разрешаем работу ЦАП
  .....
  PORTB &= ~DAC_CS;     //Разрешаем работу ЦАП

то это неверно, т.к. PORTB |= DAC_CS устанавливает высокий уровень на SYNC во время передачи, а надо наоборот:
Код
  PORTB &= ~DAC_CS;  //Синхронизация записи в ЦАП (SYNC='0')

  SPI(HI_byte);                  //Передаем настройки ЦАП
  SPI(LO_byte);                  //Передаем данные для ЦАП

  PORTB |= DAC_CS;    // (SYNC='1')

Спасибо. Значения стали меняться, но возникло новая проблема. Все значения с кодом до 0xdf на выходе ЦАП 0В. А значения с кодом после 0xf0 дают на выходе ЦАП 4В. Но я думаю это из-за настройки ЦАП. (Для настройки ЦАП я передаю 0x31) Верно или нет?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.