Свежие обсуждения
Микроконтроллеры

TEX учится

1 3 7

Можно не использовать метод сдвигов.
Просто проверять(опрашивать) состояние битов регистров. Методов проверки тоже, больше одного))) По маске например.
Но, это все будет работать намного медленнее. К сожалению, с командами 8051 и атмегами не знаком. Но принцип везде одинаков. Программа выполняется по кольцу, и что Вы в это кольцо напичкаете(может еще какие то колечки), то и будет происходить.

Суть, передать бит по шине данных.
На приемном конце, по шине тактирования (синхронизации), этот бит записывается в приемный регистр.

Не могу понять, в чем у Вас загвоздка.
Растяните время передачи бита на одну секунду например. И у Вашего контроллера появится куча времени, которое нужно будет кудато девать. Вот его и используйте для проверки битов регистра с данными, и записи в порт вывода состояний этих проверяемых битов.

 

Есть непонятный момент, прошу заранее прощения за непомерную тупость сего вопроса.

Данные передаются и принимаются одновременно? например, мы поместили в ACC (считаем просто регистром) передаваемый байт, сдвинули его влево, чтоб "голова" (MSB) выдвинулась в бит переноса (С). Далее, скопировали С в ногу, назначенную MOSI (к ведомому) , дали тактовый импульс на SCK (с CPHA и полярностью я сам разберусь). Дальше что:
1) я как-то должен копировать состояние MISO (от ведомого) в С, и каким-то образом вдвинуть в ACC, повторить 8 раз, пока передаваемый байт не вылезет наружу, а принимаемый - окажется в ACC.
2) Я выталкиваю через MOSI передаваемый байт пока он весь не выйдет, после чего втягиваю через MISO принимаемый. Вот тута нет понимания.

 

TEX: Есть непонятный момент, прошу заранее прощения за непомерную тупость сего вопроса

Не комплексуйте, мне например еще не приходилось общаться с людьми, знающими абсолютно все)))

Если Вам нужно еще и принимать по шине MISO, то после передачи тактового импульса(по спаду), читаем состояние порта на шине MISO. Результат записывается в рабочий регистр приема.
Т.е. ведомый принимает бит по шине MOSI по фронту SCK, а передает по шине MISO по спаду на шине SCK.
Время тактирования зависит от Вашего МК (мастера).

Прочитали первый бит байта данных для передачи.
Скопировали его в шину(вывод порта) MOSI
Сделали клок по шине SCK
Прочитали состояние шины MISO
Скопировали его в регистр приема первый бит.

Прочитали второй бит байта данных для передачи.
Скопировали его в шину(вывод порта) MOSI
Сделали клок по шине SCK
Прочитали состояние шины MISO
Скопировали его в регистр приема второй бит.
-----

Прочитали восьмой бит байта данных для передачи.
Скопировали его в шину(вывод порта) MOSI
Сделали клок по шине SCK
Прочитали состояние шины MISO
Скопировали его в регистр приема восьмой бит.
Все, один байт передан ведомому, и один байт принят от ведомого.
Перезагружаем регистр для передачи новыми данными.
Регистр приема копируем в куда нужно, иначе данные по приему перезапишутся новыми.

 

Попался документик, вроде по Вашим МК.
На 226 странице пример программного SPI.
http://venec.ulstu.ru/lib/disk/2005/91.pdf

 

vintik: На 226 странице пример программного SPI.

А вот и решение в лоб. Воспользовались тем, что ACC - бит-адресуемый регистр. Ну и я тоже воспользуюсь.

 

Частенько такое бывает, что решение совсем рядом

 

TEX: Данные передаются и принимаются одновременно?

Да, SPI так работает. По сигналу CLOCK идет взаимный обмен данными. Но не вся приферрия это использует. Чаще передается команда, а потом принимается ответ (т.е. тот, кто передает не обращает внимание на принимаемые биты считает только CLOCK).

Кстати, не забывайте, что в SPI бывают режимы 0,1, 2... отличаются они тем, в каком состоянии находится линия CLOCK во время ожидания (0/1), и по какому фронту (или его середине) выполняется изменение уровня на линии D_out и считывание результата на D_in.

 

vintik: Т.е. ведомый принимает бит по шине MOSI по фронту SCK, а передает по шине MISO по спаду на шине SCK.

Ага, тут ошибочка, у ведомого по шине MISO и MOSI перезапись происходит по одному фронту или спаду, на шине SCK.

 

Читал нечто относящееся к программированию, и там встретил некую двоичную систему счисления, под названием "серый код". По-русски про этот серый код не нашел ничего путного. Что это такое?

 

Gray code + горе-переводчик = серый код.
Код Грея оно называется.