Jump to content

    
Sign in to follow this  
Яrik

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
Эм... а если не секрет, что за ЦАП?

MCP4921

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

post-24216-1174772570_thumb.jpg

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

Edited by Яrik

Share this post


Link to post
Share on other sites

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

 

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

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

 

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

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

б) передача

 

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

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

 

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

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

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

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

 

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

Share this post


Link to post
Share on other sites

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

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

 

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

Share this post


Link to post
Share on other sites
Да вопрос выразел неочень :)

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

 

Примерно так

 

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

Share this post


Link to post
Share on other sites

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

utSPI8(DAC_Data & 0xff);

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

Share this post


Link to post
Share on other sites
Я думаю так переменная DAC_Data приводится к 8-ми битному виду. Правильно или нет?

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this