|
|
  |
Глючит SPI у Philipsa, Глючит SPI у Philipsa |
|
|
|
Feb 5 2005, 08:48
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-02-05
Пользователь №: 2 439

|
Передается большой массив информации через SPI. SPI работает по прерыванию. Если в передаваемом байте есть хотя бы одна 1 все работает нормально. Если все 0, то заходит в прерывание раньше чем кончилась передача предыдущего байта, без установленного бита SPIF, приходится ждать пока он установится. Время передачи массива 0 получается на 15-20% короче. Кто-нибудь сталкивался?
|
|
|
|
|
Feb 5 2005, 12:46
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-02-05
Пользователь №: 2 439

|
Цитата(one_man_show @ Feb 5 2005, 15:09) В чудеса что-то не верится, поэтому посмотрите согласование параметров SPI мастера и ведомого, а именно настройки SPI Control Register (SPCR): полярность клока, по какому фронту цеплять и т.п. Была похожая беда с приемеом потока символов, глотались огромные куски, согласовали настройки мастера и ведомого, все встало на свои места. О приеме речь не идет (он нормальный) смотрю только длительность передачи от содержимого буфера у мастера.
|
|
|
|
|
Feb 5 2005, 13:40
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-02-05
Пользователь №: 2 439

|
Цитата(one_man_show @ Feb 5 2005, 15:57) Фрагмент кода прицепите, пожалуйста. Только, если он большой, лучше в виде вложения файла. S1SPCR=0xB0; void SPI1Interrupt() { while ( ~S1SPSR & 0x80 ) ; S1SPDR = Peredacha[Adres_PRD++]; }
|
|
|
|
|
Feb 6 2005, 10:25
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-02-05
Пользователь №: 2 439

|
Цитата(one_man_show @ Feb 5 2005, 18:26) Здесь действительно криминала нет. Может весь код целиком нужно оценить? Может кто и заметит проблемку или опечатку. Я посмотрел повнимательнее. Эта зараза при передаче 0 заходит в прерывание сразу, не ждет совсем. Проверил на 2 железках 2124 и 2129 на обоих портах, от скорости и PLL не зависит.
|
|
|
|
|
Feb 11 2005, 06:08
|
Участник

Группа: Участник
Сообщений: 60
Регистрация: 5-02-05
Пользователь №: 2 439

|
Написал телегу на Филипс. Проблема решена. Оказалось что у меня процессор ревизии А, у которого ошибка в SPI. Надо для очиски флага прерывания записывать в SPINT 1, а у меня он очищался сам из-за ошибки в процессоре при записи информации. Правильный код. void SPI1Interrupt() { int tt; S1SPINT = 0x1 ; tt=S1SPSR ; // SPI1 redy? S1SPDR = Peredacha[Adres_PRD++]; // }
Прикрепленные файлы
2114.pdf ( 134.74 килобайт )
Кол-во скачиваний: 169
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|