Уважаемые,
Я тут наткнулся на следующие грабли - запускаю СПИ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)
мож кто сталкивался с подобным?
Заранее благодарствую
|