Яrik 0 24 марта, 2007 Опубликовано 24 марта, 2007 · Жалоба Помогите пожалуйста написать на СИ код необходимый для седующей операции. Имеется МК и ЦАП, связь по SPI. ЦАП 12-ти разрядный по этому запись данных производится за два раза. Как произвести запись в регистр SPI сначало четыре страшх бита, а потом остальные восемь из переменной? К тому же с первывми четирмя битами требуется записывать биты ныстройки ЦАП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Robot_Bender 0 24 марта, 2007 Опубликовано 24 марта, 2007 · Жалоба Эм... а если не секрет, что за ЦАП? а то скажет кто нибудь, что сначало да, надо старшие записать... а потом выясниться то наоборот... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Яrik 0 24 марта, 2007 Опубликовано 24 марта, 2007 (изменено) · Жалоба Эм... а если не секрет, что за ЦАП? MCP4921 Передача должна существяться в следующем порядке: Биты 15-12 настройка, 11-0 - данные. Изменено 24 марта, 2007 пользователем Яrik Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 24 марта, 2007 Опубликовано 24 марта, 2007 · Жалоба И какие проблемы?! Если у Вас аппаратный SPI то передайте за два раза. Если программный, то вообще какие проблемы непонятно. Уточните задачу, а то совсем непонятно что у вас вызывает трудности а) Упаковка данных в два слова б) передача Если передача, то что именно? Если у вас программный SPI, то посмотрите соседнюю веточку. Как раз просили пример как реализовать. На самом деле реализовать просто. 1) На MOSI выставить передаваемый бит 2) На SCK подать строб 3) С MISO считать бит слэйва (если он нужен) Короче посмотреть диаграмму на ваш АЦП и реализовать её. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Яrik 0 24 марта, 2007 Опубликовано 24 марта, 2007 · Жалоба Да вопрос выразел неочень :) Интересует как раз упаковка данных в два слова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
beer_warrior 0 25 марта, 2007 Опубликовано 25 марта, 2007 · Жалоба Что нибудь наподобие (пишу из головы возможны ошибки): SET_CS_LO; data = (full_data >> 8) |(1 << AB)|(1 << SHTDN); SPDR = data; data = (BYTE)full_data; SPDR = data; SET_CS_HI; Очень грубо, но идея должна быть понятна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 25 марта, 2007 Опубликовано 25 марта, 2007 · Жалоба Да вопрос выразел неочень :) Интересует как раз упаковка данных в два слова. Примерно так // 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 0 25 марта, 2007 Опубликовано 25 марта, 2007 · Жалоба Старший байт = zzz >> 8; Младший = zzz & 0xFF; где zzz - unsigned short Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Яrik 0 25 марта, 2007 Опубликовано 25 марта, 2007 · Жалоба Всем спасибо, разобрался! Интересует момент - зачем производится побитное И: utSPI8(DAC_Data & 0xff); Я думаю так переменная DAC_Data приводится к 8-ми битному виду. Правильно или нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Artem_Petrik 0 25 марта, 2007 Опубликовано 25 марта, 2007 · Жалоба Я думаю так переменная DAC_Data приводится к 8-ми битному виду. Правильно или нет? Да. В некоторых случаях можно и просто поставить DAC_Data без &0xFF, но тогда компилятор начнет варнинги генерить, мол "data truncated" и все такое, А warning-ов лучше не оставлять, даже если точно знаеш, что все в порядке - между теми что "в порядке" могут затеряться и приводящие к ошибкам. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться