Уважаемые,
Я тут наткнулся на следующие грабли -
запускаю СПИ1 в режиме мастера - CPOL = 1, CPHA = 1,
разрешаю прерывания - SSPIMSC = 8 (прерывания, когда очередь на передачу на половину пуста).
Стартую СПИ1 так -
1. очищаю приемную очередь:
while( SSPSR & (1<<2)) __dummy = SSPDR;
2. Записываю 1 байт в очередь
SSPDR = *out_buff++;
3. Разрешаю прерывания.
Осциллом смотрю на все ноги. На ногу MISO подаю данные, которые знаю.
Однако ножку SSEL1 дергаю сам. Вижу следующее -
Посылается один байт. Вызывается обработчик прерывания.
В обработчике прерывания я
1. проверяю - есть ли данные в приемной очереди :
while(SSPSR & (1<<2)) *in_buff++ = SSPDR;
2. Набиваю очередь на передачу
while(SSPSR & (1<<1)) SSPDR = *out_buff++;
3. Естественно, контролирую количество байт, но это не затрагивает обращение к переферийным регистрам.
Теперь собственно ГРАБЛИ:
1. В обработчике прерывания бит RNE (receive FIFO not empty) никогда не бывает установлен в единицу. А это значит, что ничего не принято - а это не понятно почему. Тем не менее, при запуске СПИ1 в приемной очереди есть данные всегда.
2. Передающая очередь никогда не бывает размером больше 2х - т.е. цикл
while(SSPSR & (1<<1)) SSPDR = *out_buff++;
выполняется не более 2х раз!!! (размер очереди - 8)
мож кто сталкивался с подобным?
Заранее благодарствую