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

 
 
> spi mega - мастер, 2 ведомых. есть больной вопрос
Budek
сообщение Oct 11 2010, 06:59
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 132
Регистрация: 17-02-08
Из: Уфа
Пользователь №: 35 116



Здравствуйте!
Столкнулся с проблемой. Есть мега и 2 ведомых (акселерометр и трансивер). Все сидят на одной шине spi.
CS1 - выбор первого, CS2 - выбор второго ведомого.
Функция передачи/приема байта:
unsigned char send_byte_spi (unsigned char byte) { SPDR=byte; while ((SPSR&(1<<7))==0x00) return SPDR; }
Отпрака байта первому: CS1=0; send_byte_spi(0x00); CS1=1; второму: CS2=0; send_byte_spi(0x00); CS2=1;
Все хорошо до того момента, пока не приходится отправлять/принимать байты одному из них (для примера-первому) еще и в прерывании (например прерывании таймера). Что получается: идет "общение" со вторым (CS2=0) и тут возникает прерывание (выбираем CS1=0). В результате - на шине оказываются сразу 2 ведомых - последствия гарантированно плачевные. Можно, конечно, функции отправки привести к виду:
Отпрака байта первому: CS2=1; CS1=0; send_byte_spi(0x00); CS1=1; второму: CS1=1; CS2=0; send_byte_spi(0x00); CS2=1;
но в этом случае прервется "общение" со вторым ведомым (во время передачи ему байта выставляем ему CS2=1;) что тоже не есть хорошо (из опыта общения с флешем помню, что прерывание "диалога" довольно часто приводит к зависанию флеша и необходимостью ее последующего ресета).
Еще думал перед каждым вызовом функции send_byte_spi из "тела программы" запрещать, а потом разрешать прерывания... Но это вообще бред.
Посоветуйте что нибудь... Спасибо.

Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 03:30
Рейтинг@Mail.ru


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