Полная версия этой страницы:
atmega 168 аппаратный SPI
имею необходимость читать нестандартные данные, т.е. 4 бита, 30 бит, 12 бит....
второй день читаю даташит, уже сам почти все понял
пока у меня мнение, аппаратно вычитать такие данные нельзя, т.к. регистр сдвига 8и битный?
т.е. нужно писать свою либу или функцию?
mempfis_
Jul 13 2010, 04:06
Цитата((vS) @ Jul 13 2010, 05:05)

т.е. нужно писать свою либу или функцию?
Soft-SPI - элементарная вещь.
Снизу пример на 16 бит. Легко можно модифицировать к любому кол-ву бит.
Функция одна т.к. чтение из SPI это та же самая запись с использованием возвращаемого функций результата.
Код
#define HI(x) SPI_PORT |= (1<<(x))
#define LO(x) SPI_PORT &= ~(1<<(x))
unsigned int SPIWriteWord(unsigned int cmd) {
unsigned char i;
unsigned int recv;
recv = 0;
LO(SCK);
LO(nSS);
for(i=0; i<16; i++) {
if(cmd&0x8000) HI(SDI); else LO(SDI);
HI(SCK);
recv<<=1;
if( SPI_PIN&(1<<SDO) ) {
recv|=0x0001;
}
LO(SCK);
cmd<<=1;
}
HI(nSS);
return recv;
}
дак я знаю, что элементарная

если честно, то с софтового варианта и начал.... но чот наверно на солнце перегрелся на выходных, решил сделать на аппаратном, раз он есть... и уперся
спасибо за пример

кстати, в вашем варианте МАСТЕР, а у меня СЛЭЙВ

собственно вопрос, можно ли аппаратным SPI считать МЕНЬШЕ 8 бит?
mempfis_
Jul 13 2010, 05:35
То что у Вас слейв Вы не уточнили...
Но если подумать то можно легко реализовать отслеживая состояние SS и SCK.
Аппаратный SPI у atmeg ориентирован на байтовые посылки. Так что можете принимать только 8/16/24/.... бит.
Большая часть микросхем с которыми я работал имели 8/16-битный интерфейс. Не встречал SPI с разрядностью не кратной 8 бит....
я тоже его недавно встретил

драйвер клавиатуры и дисплея от OKI
MASTER uPD 78какойта
defunct
Jul 13 2010, 17:07
Цитата((vS) @ Jul 13 2010, 13:05)

пока у меня мнение, аппаратно вычитать такие данные нельзя, т.к. регистр сдвига 8и битный?
совершенно верно.
fmdost
Jul 13 2010, 17:56
у тиней есть USI. Там помоему счётчик принятых бит програмно доступен. А нет ли USI на меге? Если есть, то можно даже по прерыванию.
да
копаю в сторону USI, на аппаратным ни софтовым ни чего хорошего пока не вышло. аппаратным 30бит приходят один раз 4мя байтами, другой 5ю, 4мя, потом 5ю...
нашел дома attiny26, USI присутствует, буду копать...
Пришла в голову идея, как ведомому МК аппаратно принять любое количество бит. Надо просто досчитывать импульсы до состояния, кратного 8-ми. Скажем, надо принять 12 бит, принимаем 8 бит, как обычно, после записи следующих 4-х бит клок мастера остановится, а МК выработает оставшиеся 4 импульса, дальше думаю, всё ясно. Принимать клоки от мастера и МК можно, скажем, через схему 2-И или 2-ИЛИ, вариантов много.
QUOTE
Принимать клоки от мастера и МК можно, скажем, через схему 2-И или 2-ИЛИ, вариантов много.
Есть способ проще - после остановки клока мастера пощелкать полярностью клока в соответствующем регистре нужное количество раз. И готово.
1) Интересно, но фича не документирована. Сами пользовались?
2) Ваш вариант на большие скорости, скажем, больше 1 Мбита/с не потянет, а на меньшие скорости лучше делать через INT0 или INT1. Мой вариант будет работать и на 10 Мбит/с.
QUOTE
Сами пользовались?
В режиме мастера точно работает. В слейве, как мне помнится, биты досылает. Проверить не долго.
QUOTE
Ваш вариант на большие скорости, скажем, больше 1 Мбита/с не потянет
Это почему?
1) Как принять 9 бит на скорости 10 Мбод?
2) Фича документирована?
смотрю я не одинок в своих "нестандартных" пакетах

а дослать клок это мысль...
Это ещё что. Мне вот надо поставить МК, чтобы разгрузить DSP, посылка 37 бит на скорости 5 Мбод, причём протокол I2C-подобный и очень жёсткие требования к фронтам. Т.е. меняем бит данных, ждём 50 нс, выставляем клок, ждём 100 нс, снимаем клок, ждём 50 нс, новый бит данных, и т.д...
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.