Баян про DP1203

Дисплеи, датчики и прочие функциональные узлы, управляемые МК.
Ответить
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Сообщение Denkot »

Мау!
Прошу прощения у админов за дубль, но, видимо, предыдущая версия темы была создана не в том разделе форума.

Собираюсь работать с сабжевым модулем (DP1203 от Anylink).
Даташит говорит, что режим работы прием/передача можно переключать как через SPI, так и специально для этого придуманной ногой SWITCH модуля DP1203. Но есть еще ноги TX/RX антенного переключателя, что с ними делать, тоже дергать?

1) Кто-нибудь работал с этим модулем? Есть готовые примеры?
2) Правильно ли я понял даташит, что если рулить модулем по SPI, то SWITCH, TX, RX можно не трогать?
3) Можно ли все делать по SPI (и управлять, и данные передавать/принимать) или SPI только для управления?

Я, конечно, буду грызть даташиты до победного.
Но может у кого уже есть отработанная схема общения с модулем.

UPD.: погрызя даташиты, получается что SPI к девайсу прикручено только для управления. И данные через него не идут, только регистры статуса и управления.
Поэтому возникает закономерный вопрос
4) можно ли вообще отказаться от SPI и рулить модулем напрямую через SWITCH, TX, RX и DATA ?
хвостом чую, что наверное нельзя :(
Реклама
Встал на лапы
Сообщения: 82
Зарегистрирован: Вт дек 14, 2010 16:07:50

Сообщение Denkot »

Интересно, модули достаточно популярны, но - то ли я не в том разделе форума, то ли погода не та...
Поэтому дело подвигается медленно крадучись.
Итак, без SPI не обойтись. Возьмем весьма недорогую мегу48, в ней он есть.
Инициализацию веду так:

Код: Выделить всё

InitSPI:
	ldi r17, 0b00101000 ; MOSI (PB3) and SCK (PB5) is out
	out DDRB, r17        ; 
	ldi r17, 0b01010101 ; SPIE=0 SPE=1 DORD=0 (MSB first) MSTR=1 (Master)
   out SPCR, r17         ; CPOL=0 CPHA=1 SPR10=01 (/16)
   ret
Расшифровка битов приведена в комментах, надеюсь ничего не напутал.

Пока что модуль только тихо жужжит CLKOUT'ом несколько секунд после подачи питания, и при отсутствии команд по SPI быстренько засыпает. Нормальное такое кошастое поведение (пожрал и спать).
Хотя наличие этого самого CLKOUT'а заставляет серьезно задуматься о синхронизации МК и модуля - то ли аппаратно тактировать модулем микроконтроллер, то ли забить на это, разогнать атмегу пошустрее и отлавливать фронты программно? Ведь если у SPI свой клок шерсти, то как быть с DATA и PATTERN'ом?
Хз, пока не решил. Но чую тут скрытые грабли.

UPD.: ну вот, SPI на меге я успешно завел, это нетрудно

Код: Выделить всё

main_cycle:
       ldi r16, 0b10101010  ; передаваемый байт, от фонаря
	   rcall SPI_M_Tx     ; вызываем процедуру передачи
	   rcall Delay           ; отдыхаем


	rjmp main_cycle


InitSPI:
    nop
	ldi r17, 0b00101100 ; MOSI (PB3) and SCK (PB5) is out
	out DDRB, r17       ; SS (PB2) is out
	ldi r17, 0b01010111 ; SPIE=0 SPE=1 DORD=0 (MSB first) MSTR=1 (Master)
    out SPCR, r17       ; CPOL=0 CPHA=1 SPR10=01 (/128) - клок SPI замедлен до osc/128
    ret

SPI_M_Tx:
    out SPDR,r16  ; Start transmission of data (r16)

Wait_Transmit: ; Wait for transmission complete
    in r16, SPSR
    sbrs r16, SPIF
    rjmp Wait_Transmit
    ret
Код практически весь из даташита :)

Все прекрасно работает, выскакивает восемь стробов на SCK и биты на MOSI.
Но тут возникла очередная котоловка!!! Засада в том, что передается регистр = восемь бит. Т.е. таким нехитрым кодом передавать я могу последовательности, кратные 8 битам, а разрядность адреса модуля DP1203 - 5 (прописью - пять(!) бит).
И чо мне с этим делать? Выкидывать штатный SPI и лепить свой программный с произвольной разрядностью?
Ну, мяяау....

UPD2.:
Коты могут проводить много времени, уставившись в норку в надежде подкараулить жирную мышь. Роль норки в данном случае исполняет даташит, а именно раздел где расписаны тайминги SPI. А роль мыши - те самые недостающие три бита (до восьми). И вот они показались! Цепляем когтем. Итак:
Мудрая книга даташит утверждает, что модуль начнет хавать данные только после того, как на SI повисит ноль в течение одного периода SCK. А это все равно что передать бит, равный нулю. И вот один недостающий бит мы выхватили. Следующий не заставил себя долго ждать и идет сразу за ним. Это бит указателя запись/чтение. Он указывает, что мы делаем с модулем, слушаем его робкий писк или диктуем ему свою кошачью волю. И.. и - все. Больше "лишних" битов нету, дальше идет адрес и данные. А нужен еще один, чтобы составить полный байт и запихнуть его в SPI. Что делать? Правильно, надо делать бит. Если его нет, мы его просто поставим, хай стоит вначале. Все равно ведь модуль будет слушать команду только после нулевого бита? Так вот и сделаем "ненужный" бит единицей. Не слушай его, модуль. Он тут для красоты стоит.

итого получаем шапку из трех бит
на запись 100[5 бит адреса]
на чтение 101[5 бит адреса]

проверять это в железе буду уже завтра
надеюсь, все получится
Реклама
Ответить

Вернуться в «Периферия»