Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Mega8 и ЦАП по SPI
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > MCS51, AVR, PIC, STM8, 8bit
Cpraum
Уверен, что для знающих людей - решить данную задачу можно за несколько минут.

Короче нужно соеденить Мегу с ЦАП по интерфейсу SPI.
Я в этом деле начинающий, уже много в чем разобрался, но вот это - никак не получаеться.

Если не сложно, набрасайте плиз код (желательно на C) и в идеале проект Proteus, ну или хотя бы описание какие ножки Меги с какими (в ЦАП) соеденить...

Заранее огромное спасибо!!!!
mempfis_
Открываете в документации страницы посвящённые SPI - там готовый работающий код инициализации, отсылки и приёма байта по SPI.
Всё остальное зависит от вашего ЦАП название которого вы даже не потрудились привести.
Также вы не уточнили что конкретно не получается.
Cpraum
Цитата(mempfis_ @ Nov 5 2009, 12:50) *
Открываете в документации страницы посвящённые SPI - там готовый работающий код инициализации, отсылки и приёма байта по SPI.
Всё остальное зависит от вашего ЦАП название которого вы даже не потрудились привести.
Также вы не уточнили что конкретно не получается.

Сори за безграмотность...

Хочу соеденить ATMega8 и MCP4821, хотя можно и любой другой DAC.
Для начало хочу задать вопрос: Как их соеденять (См. картинку)...
Вопрос второй: можно ли проверять SPI не подключая DAC, т.е. подключить только осцилограф...

А вот и код по инициализации и передачи по SPI, правельный ли он(Например я хочу передать на DAC байт 0x10101010)?
Код
#include <avr\io.h>
#define DD_MOSI     PINB3
#define DD_SCK     PINB5
#define DDR_SPI    PORTB
void SPI_MasterInit(void)
{
// Set MOSI and SCK output, all others input
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);
// Enable SPI, Master, set clock rate fck/16
SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
}
void SPI_MasterTransmit(char cData)
{
/* Start transmission */
SPDR = cData;
/* Wait for transmission complete */
while(!(SPSR & (1<<SPIF)));
}
int main(void) {
SPI_MasterInit();
SPI_MasterTransmit(0x10101010);
   while(1) {
  
   }
}


Заранее огромное спасибо!
Палыч
Цитата(Cpraum @ Nov 6 2009, 18:29) *
Хочу соеденить ATMega8 и MCP4821, хотя можно и любой другой DAC. Для начало хочу задать вопрос: Как их соеденять (См. картинку)...

MCP4821 - МК
SCK(3) - SCK(19)
CS(2) - какая нибудь нога любого порта (как удобнее)
SDI(4) - MOSI(18)
LDAC(5) - какая нибудь нога любого порта (как удобнее)

Цитата(Cpraum @ Nov 6 2009, 18:29) *
Вопрос второй: можно ли проверять SPI не подключая DAC, т.е. подключить только осцилограф...
Можно

Цитата(Cpraum @ Nov 6 2009, 18:29) *
А вот и код по инициализации и передачи по SPI, правельный ли он(Например я хочу передать на DAC байт 0x10101010)?
Инициализация выполнена, вроде - правильно. Скорость передачи - проверьте по DS на MCP4821.
Байт 0x10101010 Вам передать не получится - это шестнадцатиричное число, а не двоичное. Наверное, нужно записать 0xAA. На ЦАП нужно передавать данные парой байт в соответствии с DS.
Инициализация ног портов подключенных к CS и LDAC ЦАП - высокий уровень.
Передача данных на ЦАП:
1) на ногу подключенную к CS ЦАП выдаём низкий уровень;
2) передаем байт (биты 8-15)
3) перадаём байт (биты 0-7)
4) на ногу подключенную к CS ЦАП выдаём высокий уровень;
5) формируем на LDAC импульс нужной длительности.
demiurg_spb
Цитата(Cpraum @ Nov 5 2009, 13:18) *
Короче нужно соеденить Мегу с ЦАП по интерфейсу SPI.

Вы сравнивали MCP4821 с DAC7513? Для его подключения нужны лишь 3 ноги MCU, но он без встроенного VREF (VREF есть в Mega8)...
Cpraum
Всем большое спасибо!!!

Похоже была ошибка в инициализации

Вот функции, которые точно работают (ATMEGA8):
Код
void InitSPI(void)
{
DDRB = (1<<PB3)|(1<<PB5) | (1<<PB2);    // Set MOSI , SCK , and SS output
SPCR = ( (1<<SPE)|(1<<MSTR) | (1<<SPR1) |(1<<SPR0));   // Enable SPI, Master, set clock rate fck/128  
}

void WriteByteSPI(unsigned char byte)
{
      
SPDR = byte;               //Load byte to Data register
while(!(SPSR & (1<<SPIF)));    // Wait for transmission complete

}
simer
Цитата(Cpraum @ Nov 6 2009, 17:29) *
#define DDR_SPI PORTB
...

// Set MOSI and SCK output, all others input
DDR_SPI = (1<<DD_MOSI)|(1<<DD_SCK);

...


PORTB - регистр для установки уровней на порту, а не режима вход-выход

правильнее так
Код
#define DDR_SPI    DDRB
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.