реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Mega8 и ЦАП по SPI, нужна помощь
Cpraum
сообщение Nov 5 2009, 10:18
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 5-11-09
Пользователь №: 53 425



Уверен, что для знающих людей - решить данную задачу можно за несколько минут.

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

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

Заранее огромное спасибо!!!!
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Nov 5 2009, 10:50
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Открываете в документации страницы посвящённые SPI - там готовый работающий код инициализации, отсылки и приёма байта по SPI.
Всё остальное зависит от вашего ЦАП название которого вы даже не потрудились привести.
Также вы не уточнили что конкретно не получается.

Сообщение отредактировал mempfis_ - Nov 5 2009, 10:51
Go to the top of the page
 
+Quote Post
Cpraum
сообщение Nov 6 2009, 15:29
Сообщение #3





Группа: Участник
Сообщений: 5
Регистрация: 5-11-09
Пользователь №: 53 425



Цитата(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) {
  
   }
}


Заранее огромное спасибо!
Причина редактирования: Оформление цитаты исходника.

Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Палыч
сообщение Nov 6 2009, 16:27
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(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 импульс нужной длительности.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Nov 6 2009, 19:42
Сообщение #5


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Cpraum @ Nov 5 2009, 13:18) *
Короче нужно соеденить Мегу с ЦАП по интерфейсу SPI.

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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Cpraum
сообщение Nov 7 2009, 10:11
Сообщение #6





Группа: Участник
Сообщений: 5
Регистрация: 5-11-09
Пользователь №: 53 425



Всем большое спасибо!!!

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

Вот функции, которые точно работают (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

}
Причина редактирования: Оформление цитаты исходника.
Go to the top of the page
 
+Quote Post
simer
сообщение Nov 11 2009, 21:53
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 22-01-08
Пользователь №: 34 312



Цитата(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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 04:08
Рейтинг@Mail.ru


Страница сгенерированна за 0.01405 секунд с 7
ELECTRONIX ©2004-2016