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

 
 
 
Reply to this topicStart new topic
> Передача данных от МК к 12-ти раз-му ЦАП по 8 битному SPI, Помогите сделать на СИ...
Яrik
сообщение Mar 24 2007, 21:34
Сообщение #1


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Помогите пожалуйста написать на СИ код необходимый для седующей операции. Имеется МК и ЦАП, связь по SPI. ЦАП 12-ти разрядный по этому запись данных производится за два раза. Как произвести запись в регистр SPI сначало четыре страшх бита, а потом остальные восемь из переменной? К тому же с первывми четирмя битами требуется записывать биты ныстройки ЦАП.
Go to the top of the page
 
+Quote Post
Robot_Bender
сообщение Mar 24 2007, 21:36
Сообщение #2


Участник
*

Группа: Новичок
Сообщений: 22
Регистрация: 15-03-07
Пользователь №: 26 189



Эм... а если не секрет, что за ЦАП? а то скажет кто нибудь, что сначало да, надо старшие записать... а потом выясниться то наоборот...
Go to the top of the page
 
+Quote Post
Яrik
сообщение Mar 24 2007, 21:43
Сообщение #3


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Цитата
Эм... а если не секрет, что за ЦАП?

MCP4921
Передача должна существяться в следующем порядке:
Прикрепленное изображение

Биты 15-12 настройка, 11-0 - данные.

Сообщение отредактировал Яrik - Mar 24 2007, 21:51
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 24 2007, 21:55
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



И какие проблемы?!

Если у Вас аппаратный SPI то передайте за два раза.
Если программный, то вообще какие проблемы непонятно.

Уточните задачу, а то совсем непонятно что у вас вызывает трудности
а) Упаковка данных в два слова
б) передача

Если передача, то что именно?
Если у вас программный SPI, то посмотрите соседнюю веточку. Как раз просили пример как реализовать.

На самом деле реализовать просто.
1) На MOSI выставить передаваемый бит
2) На SCK подать строб
3) С MISO считать бит слэйва (если он нужен)

Короче посмотреть диаграмму на ваш АЦП и реализовать её.
Go to the top of the page
 
+Quote Post
Яrik
сообщение Mar 24 2007, 22:01
Сообщение #5


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Да вопрос выразел неочень smile.gif
Интересует как раз упаковка данных в два слова.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Mar 25 2007, 00:41
Сообщение #6


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

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Что нибудь наподобие (пишу из головы возможны ошибки):
Код
SET_CS_LO;
data = (full_data >> 8) |(1 << AB)|(1 << SHTDN);
SPDR = data;
data = (BYTE)full_data;
SPDR = data;
SET_CS_HI;


Очень грубо, но идея должна быть понятна.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Mar 25 2007, 01:24
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Цитата(Яrik @ Mar 24 2007, 23:01) *
Да вопрос выразел неочень smile.gif
Интересует как раз упаковка данных в два слова.


Примерно так

Код
// void    OutSPI8(uint8_t    byte_data);                        // вывод на    SPI    8    бит    для    примера

#define    CH_A     0                                        // Канал А ЦАП
#define    CH_B     0x80                                    // Канал B ЦАП


struct
{
uint8_t            Buf            :    1,                    // VREF Input Buffer Control bit: 1 = Buffered
                    Ga            :    1,                    // GA: Output Gain Select bit: 1 = 1x (VOUT = VREF * D/4096), 0 = 2x (VOUT = 2 * VREF * D/4096)
                    SHDN        :    1;                    // SHDN: Output Power Down Control bit: 1 = Output Power Down Control bit, 0 = Output buffer disabled, Output is high impedance
} Status_DAC;                                            // биты    статуса ЦАПа

uint16_t            DAC_Data;                            // Выходные данные выводимые на ЦАП




void    OutDAC_ChanB(uint16_t data);                    // пример
{
    uint8_t        i;
    
    CS_On;                                                // Выбрать ЦАП
    i = ((DAC_Data >> 8) & 0xf)|CH_B|Status_DAC.Buf>>6|Status_DAC.Ga>>5|Status_DAC.SHDN>>4; // формируем старший байт
    OutSPI8(i);                                            // выводим ст. байт SPI
    OutSPI8(DAC_Data & 0xff);                            // выводим мл. байт SPI
    CS_Off;
    LDAC_On;
    LDAC_Off;                                            // выдать напряжение
}
Go to the top of the page
 
+Quote Post
defunct
сообщение Mar 25 2007, 03:23
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Старший байт = zzz >> 8;
Младший = zzz & 0xFF;

где zzz - unsigned short
Go to the top of the page
 
+Quote Post
Яrik
сообщение Mar 25 2007, 10:23
Сообщение #9


Частый гость
**

Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216



Всем спасибо, разобрался! Интересует момент - зачем производится побитное И:
Цитата
utSPI8(DAC_Data & 0xff);

Я думаю так переменная DAC_Data приводится к 8-ми битному виду. Правильно или нет?
Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Mar 25 2007, 22:46
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006



Цитата
Я думаю так переменная DAC_Data приводится к 8-ми битному виду. Правильно или нет?

Да. В некоторых случаях можно и просто поставить DAC_Data без &0xFF, но тогда компилятор начнет варнинги генерить, мол "data truncated" и все такое, А warning-ов лучше не оставлять, даже если точно знаеш, что все в порядке - между теми что "в порядке" могут затеряться и приводящие к ошибкам.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 16:25
Рейтинг@Mail.ru


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