Перейти к содержанию
    

Глючит SPI у Philipsa

Передается большой массив информации через SPI.

SPI работает по прерыванию. Если в передаваемом байте есть хотя бы одна 1 все работает нормально. Если все 0, то заходит в прерывание раньше чем кончилась передача предыдущего байта, без установленного бита SPIF, приходится ждать пока он установится. Время передачи массива 0 получается на 15-20% короче. Кто-нибудь сталкивался?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В чудеса что-то не верится, поэтому посмотрите согласование параметров SPI мастера и ведомого, а именно настройки SPI Control Register (SPCR): полярность клока, по какому фронту цеплять и т.п.

Была похожая беда с приемеом потока символов, глотались огромные куски, согласовали настройки мастера и ведомого, все встало на свои места.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В чудеса что-то не верится, поэтому посмотрите согласование параметров SPI мастера и ведомого, а именно настройки SPI Control Register (SPCR): полярность клока, по какому фронту цеплять и т.п.

Была похожая беда с приемеом потока символов, глотались огромные куски, согласовали настройки мастера и ведомого, все встало на свои места.

 

О приеме речь не идет (он нормальный) смотрю только длительность передачи от содержимого буфера у мастера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фрагмент кода прицепите, пожалуйста. Только, если он большой, лучше в виде вложения файла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Фрагмент кода прицепите, пожалуйста. Только, если он большой, лучше в виде вложения файла.

 

S1SPCR=0xB0;

void SPI1Interrupt()

{ while ( ~S1SPSR & 0x80 ) ;

S1SPDR = Peredacha[Adres_PRD++];

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь действительно криминала нет. Может весь код целиком нужно оценить? Может кто и заметит проблемку или опечатку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здесь действительно криминала нет. Может весь код целиком нужно оценить? Может кто и заметит проблемку или опечатку.

 

Я посмотрел повнимательнее. Эта зараза при передаче 0 заходит в прерывание сразу, не ждет совсем. Проверил на 2 железках 2124 и 2129 на обоих портах, от скорости и PLL не зависит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Написал телегу на Филипс. Проблема решена. Оказалось что у меня процессор ревизии А, у которого ошибка в SPI. Надо для очиски флага прерывания записывать в SPINT 1, а у меня он очищался сам из-за ошибки в процессоре при записи информации. Правильный код.

 

void SPI1Interrupt()

{ int tt;

S1SPINT = 0x1 ;

tt=S1SPSR ; // SPI1 redy?

S1SPDR = Peredacha[Adres_PRD++]; //

}

2114.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хотел сказать раньше, но и сейчас, я думаю, не поздно будет.

Ещё со времён работы с ранними (надо сказать весьма "эрратными") AVRами у меня выработалась стойкая привычка сразу закачивать все эрраты, да и в процессе работы время от времени туда (на сайт за свежими эрратами) заглядывать.

Вот и сейчасвижу, что подобная привычка только на пользу. ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...