Metallist64 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Здравствуйте!Уважаемые знатоки. Помогите определиться со следующими вопросами по интерфейсу SPI. На графиках передачи данных можно заметить, что Master и Slave могут осуществлять передачу данных одновременно. т.е и Master и Slave передают данные друг другу. В связи с этим возникли следующие вопросы : - Как сделать одновременно прием и передачу? Ведь регистр данных один и адрес у него один. - Что будет если прочитать регистр данных Slave если передача от Master еще не закончена?Ведь флаг SPIF устанавливается для передатчика, а не приемника. - Что будет если во время приема байта от мастера я буду записывать в регистр данных байт который я хочу передать мастеру. - Как убедиться,в том, что мастер закончил прием байта от slave? - Не получится ли так, что придется самому придумывать протокол обмена м\у устройствами. Я имею в виду пересылать флаги окончания передачи, готовности и т.д.? - Какое максимальное расстояние м/у приемником и передатчиком? Большое спасибо. PS MK - ATMega8. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kamil_yaminov 1 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Хоть регистр и один, но данные на передачу выдвигаются с одного конца регистра, а принимаемые данные заходят в регистр с другого конца Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
garbuz 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Ведь регистр данных один и адрес у него один. Скорей всего тут ситуация как с регистром данных UART - их РЕАЛЬНО два ! Лучше всего прочитать в даташите и примеры там посмотреть с исходниками. Если с английским напряг, то есть перевод даташита ATmega доступный в он-лайн. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stanislav_S 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Здравствуйте!Уважаемые знатоки. Помогите определиться со следующими вопросами по интерфейсу SPI. На графиках передачи данных можно заметить, что Master и Slave могут осуществлять передачу данных одновременно. т.е и Master и Slave передают данные друг другу. В связи с этим возникли следующие вопросы : - Как сделать одновременно прием и передачу? Ведь регистр данных один и адрес у него один. - Что будет если прочитать регистр данных Slave если передача от Master еще не закончена?Ведь флаг SPIF устанавливается для передатчика, а не приемника. - Что будет если во время приема байта от мастера я буду записывать в регистр данных байт который я хочу передать мастеру. - Как убедиться,в том, что мастер закончил прием байта от slave? - Не получится ли так, что придется самому придумывать протокол обмена м\у устройствами. Я имею в виду пересылать флаги окончания передачи, готовности и т.д.? - Какое максимальное расстояние м/у приемником и передатчиком? Большое спасибо. PS MK - ATMega8. Регистр действительно один, но данные заходят с другой стороны, посему следует их забирать после окончания передачи кроме того для чтения присутствует буфер. про расстояние однозначно сказать нельзя это зависит от скорости обмена от разводки платы и т д. У меня например работает до 50 см, при тактовой 1 МГц. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Скорей всего тут ситуация как с регистром данных UART - их РЕАЛЬНО два ! Регистр действительно один, но данные заходят с другой стороны, посему следует их забирать после окончания передачи кроме того для чтения присутствует буфер. В документации об этом написано смутно... Предполагаю, что в действительности в SPI два регистра с одним и тем же адресом: по записи в него - данные попадают в сдвиговый регистр и передаются, принятые данные из сдвигового регистра попадают в буферный регистр, откуда читаются командой чтения регистра SPDR. Однако, это - следует проверить в эксперименте... По поводу Ваших вопросов: 1. Приемник и передатчик работают строго одновременно, поэтому окончание приема = окончанию передачи. 2. Если верно моё предположение, изложенное выше, при чтении регистра данных при незавершенном приёме - прочитаете предыдущий байт. 3. Что будет, если в момент обмена записать байт - в документации не оговорено. Следует проверить экспериментально. 4. Мастер закончит приём от Slave, когда закончит свою передачу (см. 1). Если Slave - не положил ничего в регистр для передачи - попавший в регистр сдвига байт от мастера при предыдущем приёме - уйдёт от Slave мастеру. 5. Что-то, хотя бы элементарное, но придумывать прийтется... 6. Этот интерфейс - для устройств, расположенных на одной плате, или на соседних. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Metallist64 0 15 октября, 2008 Опубликовано 15 октября, 2008 (изменено) · Жалоба В даташите в режме slave при приеме байта ждут 1 во флаге SPIF. ОН ЧТО ПРИ ПРИЕМЕ УСТАНАВЛИВАЕТЯ В 0 ???. while(!(SPSR & (1<<SPIF))) Изменено 15 октября, 2008 пользователем Metallist64 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба В даташите в режме slave при приеме байта ждут 1 во флаге SPIF. ОН ЧТО ПРИ ПРИЕМЕ УСТАНАВЛИВАЕТЯ В 0 ???. Цитата из DSWhen a serial transfer is complete, the SPIF flag is set. An interrupt is generated if SPIE in SPCR is set and global interrupts are enabled. If SS is an input and is driven low when the SPI is in Master mode, this will also set the SPIF flag. SPIF is cleared by hardware when executing the corresponding interrupt handling vector. Alternatively, the SPIF bit is cleared by first reading the SPI Status Register with SPIF set, then accessing the SPI Data Register (SPDR).По окончанию приёма (и передачи, раз они идут одновременно) этот бит будет поднят в 1. Сбросится в ноль аппаратно 1) при прерывании или 2) чтении SPSR, а затем SPDR. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Metallist64 0 15 октября, 2008 Опубликовано 15 октября, 2008 (изменено) · Жалоба Большое спасибо! Смутило отсутствие "по окончании приема SPIF уст. в 1." :-), хотя конечно напрашивалось само собой. Еще один небольшой вопрос к Палычу. Немного не ясна фраза: "Если Slave - не положил ничего в регистр для передачи - попавший в регистр сдвига байт от мастера при предыдущем приёме - уйдёт от Slave мастеру." Нельзя ли немного перефразировать? Что будет если Slave ничего не отправит?То что получит master? И если slave не успел так сказать "до конца" положить байт в регистр, то это равносильно, что он ничего не положил? Изменено 15 октября, 2008 пользователем Metallist64 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stanislav_S 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Большое спасибо! Смутило отсутствие "по окончании приема SPIF уст. в 1." :-), хотя конечно напрашивалось само собой. Еще один небольшой вопрос к Палычу. Немного не ясна фраза: "Если Slave - не положил ничего в регистр для передачи - попавший в регистр сдвига байт от мастера при предыдущем приёме - уйдёт от Slave мастеру." Нельзя ли немного перефразировать? Что будет если Slave ничего не отправит?То что получит master? И если slave не успел так сказать "до конца" положить байт в регистр, то это равносильно, что он ничего не положил? Очевидно в таком случае, слэйв передаст последний принятый от мастера байт. Что значит не положил до конца? Не забывайте что есть еще сигнал CS. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Что будет если Slave ничего не отправит?То что получит master? И если slave не успел так сказать "до конца" положить байт в регистр, то это равносильно, что он ничего не положил? Если Slave ничего не будет класть в SPDR, а мастер передаёт последовательность байт A, B, C..., то при приёме (который, как мы помним, идет одновременно с передачей) получит: X, A, B..., где Х - содержимое сдвигового регистра Slave в начале обмена в момент передачи мастером байта А. Что такое "до конца" - мне не понятно... По-моему (требует проверки), если Slave не успел положить ничего до начала обмена - равносильно, что ничего не положил. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Metallist64 0 15 октября, 2008 Опубликовано 15 октября, 2008 (изменено) · Жалоба Всем участникам ОГРОМНОЕ спасибо! Но прошу добить меня до конца. Вот следующий вопрос: - допустим мастер решил передать данные( slave`а он не спрашивает готов ли тот передавать или нет). Выставляет лог.0 на SS. и процесс пошел. НО как определить слейву когда можно выставлять свой байт, ведь во время выставления может начаться передача и тогда со slave придет мусор. Или мастер все-таки подождет пока slave выставит свой байт? Помогите, никак не могу понять данный вопрос. Изменено 15 октября, 2008 пользователем Metallist64 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Рассмотрите два варианта: 1. Прерывание при переходе SS в 0 загружает данные от slave (не пробовал) 2. Master передает служебный один или два байта (например, адрес регистра для считывания), после этого Slave отдает данные Master'у, при этом Master передает Slav'у 0xFF. Подобный алгоритм используется в модулях ZigBee и NanoNet, где трансивер всегда Slave. Описания трансиверов для изучения подробностей протокола есть в соответствующей докуметнации (Atmel, Freescale, Nanotron) (рабочие конструкции). С NanoNet использовал и SPI, и USART в режиме SPI. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 9 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба НО как определить слейву когда можно выставлять свой байт, ведь во время выставления может начаться передача и тогда со slave придет мусор. Или мастер все-таки подождет пока slave выставит свой байт? Помогите, никак не могу понять данный вопрос. Когда я говорил выше: нужно придумать протокол обмена - имелось в виду, что Вы и определитесь: как Ваши устройства будут обмениваться информацией... Когда слейву выставлять и какие данные для передачи и должно быть определено в протоколе. Послольку, всем рулит мастер - инициатива обмена байтами по SPI будет исходить только от него. Может быть, Вам посмотреть для примера на что-нибудь из памяти с интерфейсом SPI? Скорость "работы" с SPI должна быть выше у слейва по сравнению с мастером (возможно, на мастере нужно предусмотреть задержки, для того, чтобы слейв успел положить нужный байт в регистр данных). Если слейв - не успел положить данные до обмена байтов с мастером - мастер может это узнать по принятому байту (он тот же, что и был передан мастером при предыдущем обмене байтами), слейв узнает это (что не успел положить) по биту WCOL... В протоколе д.б. предусмотрено: как этого по-возможности избежать и что делать, если это все-таки случилось. P.S. Кстати, программирование по SPI AVR, которое описано в DS - можно взять как пример, и, переработав под свои нужды, придумать свой протокол... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mdmitry 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Может не придумывать свой, а взять идеи из готовых изделий, в которых устройство как slave SPI выступает (трансиверы). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Metallist64 0 15 октября, 2008 Опубликовано 15 октября, 2008 · Жалоба Большое спасибо за оказанную помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться