Полная версия этой страницы:
Глючит SPI у Philipsa
konoval1
Feb 5 2005, 08:48
Передается большой массив информации через SPI.
SPI работает по прерыванию. Если в передаваемом байте есть хотя бы одна 1 все работает нормально. Если все 0, то заходит в прерывание раньше чем кончилась передача предыдущего байта, без установленного бита SPIF, приходится ждать пока он установится. Время передачи массива 0 получается на 15-20% короче. Кто-нибудь сталкивался?
one_man_show
Feb 5 2005, 12:09
В чудеса что-то не верится, поэтому посмотрите согласование параметров SPI мастера и ведомого, а именно настройки SPI Control Register (SPCR): полярность клока, по какому фронту цеплять и т.п.
Была похожая беда с приемеом потока символов, глотались огромные куски, согласовали настройки мастера и ведомого, все встало на свои места.
konoval1
Feb 5 2005, 12:46
Цитата(one_man_show @ Feb 5 2005, 15:09)
В чудеса что-то не верится, поэтому посмотрите согласование параметров SPI мастера и ведомого, а именно настройки SPI Control Register (SPCR): полярность клока, по какому фронту цеплять и т.п.
Была похожая беда с приемеом потока символов, глотались огромные куски, согласовали настройки мастера и ведомого, все встало на свои места.
О приеме речь не идет (он нормальный) смотрю только длительность передачи от содержимого буфера у мастера.
one_man_show
Feb 5 2005, 12:57
Фрагмент кода прицепите, пожалуйста. Только, если он большой, лучше в виде вложения файла.
konoval1
Feb 5 2005, 13:40
Цитата(one_man_show @ Feb 5 2005, 15:57)
Фрагмент кода прицепите, пожалуйста. Только, если он большой, лучше в виде вложения файла.
S1SPCR=0xB0;
void SPI1Interrupt()
{ while ( ~S1SPSR & 0x80 ) ;
S1SPDR = Peredacha[Adres_PRD++];
}
one_man_show
Feb 5 2005, 15:26
Здесь действительно криминала нет. Может весь код целиком нужно оценить? Может кто и заметит проблемку или опечатку.
konoval1
Feb 6 2005, 10:25
Цитата(one_man_show @ Feb 5 2005, 18:26)
Здесь действительно криминала нет. Может весь код целиком нужно оценить? Может кто и заметит проблемку или опечатку.
Я посмотрел повнимательнее. Эта зараза при передаче 0 заходит в прерывание сразу, не ждет совсем. Проверил на 2 железках 2124 и 2129 на обоих портах, от скорости и PLL не зависит.
konoval1
Feb 11 2005, 06:08
Написал телегу на Филипс. Проблема решена. Оказалось что у меня процессор ревизии А, у которого ошибка в SPI. Надо для очиски флага прерывания записывать в SPINT 1, а у меня он очищался сам из-за ошибки в процессоре при записи информации. Правильный код.
void SPI1Interrupt()
{ int tt;
S1SPINT = 0x1 ;
tt=S1SPSR ; // SPI1 redy?
S1SPDR = Peredacha[Adres_PRD++]; //
}
IgorKossak
Feb 11 2005, 07:55
Хотел сказать раньше, но и сейчас, я думаю, не поздно будет.
Ещё со времён работы с ранними (надо сказать весьма "эрратными") AVRами у меня выработалась стойкая привычка сразу закачивать все эрраты, да и в процессе работы время от времени туда (на сайт за свежими эрратами) заглядывать.
Вот и сейчасвижу, что подобная привычка только на пользу.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.