реклама на сайте
подробности

 
 
> SPI Slave ошибки чтения, помогите разобраться, SPI slave чтение, 1.25Мгц 16бит слово
DEHiCKA
сообщение Aug 16 2011, 13:31
Сообщение #1





Группа: Участник
Сообщений: 7
Регистрация: 29-05-11
Пользователь №: 65 341



Имеем поток 16-ти битных слова от мастера:
Прикрепленное изображение

3.3v TTL. Клок 1.25Мгц. Слова идут непрерывно, паузы между пакетами в 1Tc.
Непрерывно весь поток читать не нужно, только переодически отслеживать изменение значения слова.

Пытаюсь отладить чтение в SPI-slave режиме на Atmega328p (платка arduino nano v3), 5В питалово. Т.к slave ничего не пердаёт, подключен напрямую без шифтера 3.3-5в.

В итоге, всё читается, но где-то один из 200-300 пакетов в среднем, читается неправильно.
Все тайминги по даташиту проходят с запасом.

В основном путается порядок байт в слове, но иногда неверно читаются и сами байты.
Прогнал на логанализаторе с длинной памятью c порогами для 5v TTL - никаких ошибок в передаче нет.
Пробовал читать с прерываним по SS и просто в цикле с предварительным опросом ноги SS, без разницы.
В итоге упростил код до:
Код
  
  while (!(PINB & 0x4) ); // wait until SlaveSelect goes High
  while(!(SPSR & (1<<SPIF))); // SPIF bit set when 8 bits received
  w.c[0] = SPDR;              
  while(!(SPSR & (1<<SPIF))); // SPIF bit set when 8 bits received
  w.c[1] = SPDR;

никаких прерываний, только чтение и вывод на serial. Всё по прежнему.

Но, если вставить задержку порядка 1мс в основном цикле до или после вышеприведённого кода, то ошибки чтения пропадают полностью. Оставлял на час, ни одной ошибки. Если менять задержку как в большую, так и в меньшую сторону, ошибки снова возникают с разной частотой в зависимости от задержки.

Сообщение отредактировал DEHiCKA - Aug 16 2011, 13:31
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
GDI
сообщение Mar 2 2012, 12:43
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Вы бы подробнее описали что Вы хотите получить, а то из кода ничего не понятно.
К самой программе хоть она и короткая есть много претензий:
1. зачем 2 раза объявлена IOReg? И зачем она volatile?
2. А вот count как раз должна быть volatile, раз она меняется в прерывании.
3. Зачем ind[4], если у Вас 3 байта на прием? Наверное, потому что Вы в прерывании инкрементируете count перед тем как сделать запись в массив?
4. Зачем обнуляете ind[2]? Смысла в этом не вижу, надо либо весь массив обнулять, либо вообще ничего не обнулять.
5. Почему count никогда не обнуляете, или ждете только одного прохода программы?
6. Почему читаете SPDR и в основном цикле, и в прерывании?

Не слишком ли много вопросов для программы из 20 строк? В этом разделе есть прикрепленная тема "Исходники программ и бибилиотек" Там есть несколько реализаций работы с SPI, да и на сайте Атмела есть апноуты про это. Почитайте.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 23:15
Рейтинг@Mail.ru


Страница сгенерированна за 0.04785 секунд с 7
ELECTRONIX ©2004-2016