|
|
  |
Передача данных от МК к 12-ти раз-му ЦАП по 8 битному SPI, Помогите сделать на СИ... |
|
|
|
Mar 24 2007, 21:36
|
Участник

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

|
Эм... а если не секрет, что за ЦАП? а то скажет кто нибудь, что сначало да, надо старшие записать... а потом выясниться то наоборот...
|
|
|
|
|
Mar 24 2007, 21:43
|
Частый гость
 
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216

|
Цитата Эм... а если не секрет, что за ЦАП? MCP4921 Передача должна существяться в следующем порядке:
Биты 15-12 настройка, 11-0 - данные.
Сообщение отредактировал Яrik - Mar 24 2007, 21:51
|
|
|
|
|
Mar 25 2007, 00:41
|

Профессионал
    
Группа: Свой
Сообщений: 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; Очень грубо, но идея должна быть понятна.
--------------------
Вони шукають те, чого нема, Щоб довести, що його не існує.
|
|
|
|
|
Mar 25 2007, 01:24
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(Яrik @ Mar 24 2007, 23:01)  Да вопрос выразел неочень Интересует как раз упаковка данных в два слова. Примерно так Код // 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; // выдать напряжение }
|
|
|
|
|
Mar 25 2007, 10:23
|
Частый гость
 
Группа: Новичок
Сообщений: 110
Регистрация: 8-01-07
Из: Украина
Пользователь №: 24 216

|
Всем спасибо, разобрался! Интересует момент - зачем производится побитное И: Цитата utSPI8(DAC_Data & 0xff); Я думаю так переменная DAC_Data приводится к 8-ми битному виду. Правильно или нет?
|
|
|
|
|
Mar 25 2007, 22:46
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Цитата Я думаю так переменная DAC_Data приводится к 8-ми битному виду. Правильно или нет? Да. В некоторых случаях можно и просто поставить DAC_Data без &0xFF, но тогда компилятор начнет варнинги генерить, мол "data truncated" и все такое, А warning-ов лучше не оставлять, даже если точно знаеш, что все в порядке - между теми что "в порядке" могут затеряться и приводящие к ошибкам.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|