Добрый вечер. Пишу на PIC18F242. Столкнулся с проблемой, через SPI нужно передать значения на ЦАП. Но SSPBUF 8 разрядный регистр и за 1 раз передается 8 битов сразу. В даташите на цап написано, что DATE BITS находятся по середине, правые 4 бита не важны, потом идут 10 битов данных и потом еще какие-то 2 бита... Суть в том, что я хочу, чтобы ЦАП преобразовывал значения пропорционально, 0 = 0В, 255 = 5В... А так какой-то бред получается. Как реализовать подобную штуку?
т.е. мне нужно передать сначала 4 любых бита, потом 10 битов данных, а потом 2 бита режима питания. Но когда я передаю первые 4 бита, у меня передается сразу 8 бит! Т.к. это SPI, сразу передается слово. Вот в чем проблема.
Нет никакой необходимости писать программный SPI.
Во всех устройствах SPI построен по ЧЕТЫРЕХ или ТРЕХ проводной схеме. Причем одна отсутствующая линия в последнем варианте - это данные к мастеру. Остаются данные, клоки и загрузка. Таким образом, совершенно неважно что передается вначале. Имеют значение лишь последние полезные биты. Из чего следует, что вся эта бодяга передается ДВУМЯ байтами последовательно, где первые лишние переданные разряды не имеют никакого значения. Естественно, что фиксация данных CS (LOAD) должна происходить лишь после завершения второго байта... Недостаток тут лишь в том, что скорость передачи данных будет меньше на балластные разряды. Но всяко гораздо больше, чем в программном варианте.
Ежели это не устраивает, то есть альтернатива в новых МК Микрочипа. В них применен усовершенствованный модуль SPI, который позволяет передавать любое число разрядов от 2 до 32. Естественно, что СНАЧАЛА нужно сформировать слово передачи в буфер и лишь потом слать его в модуль.
Позже напишу решение проблемы
Нужно сдвигать через RRCF в право на 4 бита, смотреть перенос, если он есть, устанавливать биты 4,5,6,7 соответственно. И еще не забыть почистить биты 4,5,6,7 того регистра, который сдвигаем, так как там походу циклический перенос.
ЦАП 10 разрядный, мне нужно было только 8 разрядов. Код ниже: