Перейти к содержанию
    

Передача данных от МК к 12-ти раз-му ЦАП по 8 битному SPI

Помогите пожалуйста написать на СИ код необходимый для седующей операции. Имеется МК и ЦАП, связь по SPI. ЦАП 12-ти разрядный по этому запись данных производится за два раза. Как произвести запись в регистр SPI сначало четыре страшх бита, а потом остальные восемь из переменной? К тому же с первывми четирмя битами требуется записывать биты ныстройки ЦАП.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эм... а если не секрет, что за ЦАП? а то скажет кто нибудь, что сначало да, надо старшие записать... а потом выясниться то наоборот...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

MCP4921

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

post-24216-1174772570_thumb.jpg

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

Изменено пользователем Яrik

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Если у Вас аппаратный SPI то передайте за два раза.

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

 

Уточните задачу, а то совсем непонятно что у вас вызывает трудности

а) Упаковка данных в два слова

б) передача

 

Если передача, то что именно?

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

 

На самом деле реализовать просто.

1) На MOSI выставить передаваемый бит

2) На SCK подать строб

3) С MISO считать бит слэйва (если он нужен)

 

Короче посмотреть диаграмму на ваш АЦП и реализовать её.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да вопрос выразел неочень :)

Интересует как раз упаковка данных в два слова.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что нибудь наподобие (пишу из головы возможны ошибки):

SET_CS_LO;
data = (full_data >> 8) |(1 << AB)|(1 << SHTDN);
SPDR = data;
data = (BYTE)full_data;
SPDR = data;
SET_CS_HI;

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да вопрос выразел неочень :)

Интересует как раз упаковка данных в два слова.

 

Примерно так

 

// 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;                                            // выдать напряжение
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем спасибо, разобрался! Интересует момент - зачем производится побитное И:

utSPI8(DAC_Data & 0xff);

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...