Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача данных от МК к 12-ти раз-му ЦАП по 8 битному SPI
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему
Яrik
Помогите пожалуйста написать на СИ код необходимый для седующей операции. Имеется МК и ЦАП, связь по SPI. ЦАП 12-ти разрядный по этому запись данных производится за два раза. Как произвести запись в регистр SPI сначало четыре страшх бита, а потом остальные восемь из переменной? К тому же с первывми четирмя битами требуется записывать биты ныстройки ЦАП.
Robot_Bender
Эм... а если не секрет, что за ЦАП? а то скажет кто нибудь, что сначало да, надо старшие записать... а потом выясниться то наоборот...
Яrik
Цитата
Эм... а если не секрет, что за ЦАП?

MCP4921
Передача должна существяться в следующем порядке:
Нажмите для просмотра прикрепленного файла
Биты 15-12 настройка, 11-0 - данные.
SasaVitebsk
И какие проблемы?!

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

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

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

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

Короче посмотреть диаграмму на ваш АЦП и реализовать её.
Яrik
Да вопрос выразел неочень smile.gif
Интересует как раз упаковка данных в два слова.
beer_warrior
Что нибудь наподобие (пишу из головы возможны ошибки):
Код
SET_CS_LO;
data = (full_data >> 8) |(1 << AB)|(1 << SHTDN);
SPDR = data;
data = (BYTE)full_data;
SPDR = data;
SET_CS_HI;


Очень грубо, но идея должна быть понятна.
SasaVitebsk
Цитата(Я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;                                            // выдать напряжение
}
defunct
Старший байт = zzz >> 8;
Младший = zzz & 0xFF;

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

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

Да. В некоторых случаях можно и просто поставить DAC_Data без &0xFF, но тогда компилятор начнет варнинги генерить, мол "data truncated" и все такое, А warning-ов лучше не оставлять, даже если точно знаеш, что все в порядке - между теми что "в порядке" могут затеряться и приводящие к ошибкам.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.