Здравствуйте!
Столкнулся с проблемой. Есть мега и 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 из "тела программы" запрещать, а потом разрешать прерывания... Но это вообще бред.
Посоветуйте что нибудь... Спасибо.