jenya7 0 16 марта, 2016 Опубликовано 16 марта, 2016 (изменено) · Жалоба у меня есть драйвер на Mega168. мне понадобилось связать две платы вместе. из свободных имеющихся интерфейсов есть только SPI. думаю сделать Master-Slave. с мастером все понятно а как организовать слейв на SPI? интересно такой пример будет работать со стороны слейва? ISR(SPI_vect) { uint8_t command, reply; command = SPDR; // Slave has received switch(command) { case 1: reply = 101; break; case 2: reply = 102; break; case 3: reply = 103; break; } SPDR = reply; // Slave sends on next SPI } Изменено 16 марта, 2016 пользователем Jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба с мастером все понятно а как организовать слейв на SPI? интересно такой пример будет работать со стороны слейва? Начну со второго вопроса: да, теоретически будет работать. Теперь об организации ПО мастера и подчиненного устройства. Подозреваю, что с мастером Вам не все понятно, раз возникли вопросы с режимом slave. Например, в Вашем примере: 1) устройство-мастер передаёт по SPI первый байт (байт команды) 2) подчиненное устройство приняв по SPI байт через некоторое время запустит программу обработки прерывания от SPI; 3) программа обработки прерывания считает принятый байт с регистра, определит его значение и положит на регистр байт ответа; на всё это (шаг 2-3) потребуется время - Вы должны определит максимальное время на ответ подчиненного устройства, при этом учесть время работы других более приоритетных процедур обработки прерывания. 4) устройство-мастер выждав после передачи время, необходимое для гарантированной реакции подчиненного устройства на первый байт, производит считывание байта ответа. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба SS - в помощь Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lerk 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба И обратите внимание, что обрабатывать данные в прерывании - моветон. Обработчик прерывания должен срабатывать максимально быстро, вся обработка данных - в теле программы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба Начну со второго вопроса: да, теоретически будет работать. Теперь об организации ПО мастера и подчиненного устройства. Подозреваю, что с мастером Вам не все понятно, раз возникли вопросы с режимом slave. Например, в Вашем примере: 1) устройство-мастер передаёт по SPI первый байт (байт команды) 2) подчиненное устройство приняв по SPI байт через некоторое время запустит программу обработки прерывания от SPI; 3) программа обработки прерывания считает принятый байт с регистра, определит его значение и положит на регистр байт ответа; на всё это (шаг 2-3) потребуется время - Вы должны определит максимальное время на ответ подчиненного устройства, при этом учесть время работы других более приоритетных процедур обработки прерывания. 4) устройство-мастер выждав после передачи время, необходимое для гарантированной реакции подчиненного устройства на первый байт, производит считывание байта ответа. попробую. спасибо. SS - в помощь кстати да. а как слейв знает что выбрали его? реализовать какой нибудь пин интерапт? И обратите внимание, что обрабатывать данные в прерывании - моветон. Обработчик прерывания должен срабатывать максимально быстро, вся обработка данных - в теле программы. да. я обычно только флаг подымаю в прерывании. хотя тут нужно максимально быстрый ответ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба SS - в помощь IMHO, ждать помощи от SS в данном случае нецелесообразно. Его использование, конечно же, упростит ПО на мaster'е, но формирование этого сигнала на подчиненном устройстве программным способом - неосуществимо, аппаратным способом - слишком громозко... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба А зачем Slave формировать SS - это дело мастера Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба это дело мастера Нужно дать понять мастеру, что подчиненное устройство произвело операции необходимые для обмена, а до той поры приостановить обмен. Поскольку инициатором обмена по SPI всегда выступает мастер, то задействовать SS нужно именно мастера. В этом случае сигнал на SS мастера формирует, естественно, подчиненное устройство. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lerk 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба Нужно дать понять мастеру, что подчиненное устройство произвело операции необходимые для обмена, а до той поры приостановить обмен. Поскольку инициатором обмена по SPI всегда выступает мастер, то задействовать SS нужно именно мастера. В этом случае сигнал на SS мастера формирует, естественно, подчиненное устройство. Зачем называть сигнал о готовности ведомого - SS? Назовите его, например, DR - data ready, и никто не будет путаться о чем, собственно, идет речь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба Нужно дать понять мастеру, что подчиненное устройство произвело операции необходимые для обмена, а до той поры приостановить обмен. Поскольку инициатором обмена по SPI всегда выступает мастер, то задействовать SS нужно именно мастера. В этом случае сигнал на SS мастера формирует, естественно, подчиненное устройство. MISO - нет овета (нуного) не принял.(Повтор) Есть принял. Кстати пока мастер обрабатывает ответ , Slave успеет "спрятать" данные Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба Зачем называть сигнал о готовности ведомого - SS? Так сигнал обозначен в документации от производителя МК: сигнал о готовности ведомого устройства заводится на SPI, работающего в режиме master, на ту из ног, которая обозначается SS. MISO - нет овета (нуного) не принял.(Повтор) Есть принял. Подчиненное устройство может правильно принять команду, а вот мастер нужный ответ на команду может не получить никогда... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 16 марта, 2016 Опубликовано 16 марта, 2016 · Жалоба SPI - Это дуплекс , если Slave положил правильный ответ в SDR , то мастер его получит - даже если не захочет Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
501-й 0 17 марта, 2016 Опубликовано 17 марта, 2016 (изменено) · Жалоба Приветствую! Так сигнал обозначен в документации от производителя МК: сигнал о готовности ведомого устройства заводится на SPI, работающего в режиме master, на ту из ног, которая обозначается SS. Ну зачем же так?! Обычно активный сигнал SS на входе мастера переводит его узел SPI в режим ведомого (Master становится Slave'ом). SS -- это сокращение от Slave Select. Сигнал о готовности ведомого устройства в шине SPI отсутствует, его нужно отдельно выдумывать. Я делал подтягиванием различных линий к определённым уровням (подойдут SCK, MOSI): мастер настраивает эти линии на вход без подтяжки, а слейв -- с подтяжкой. После включения SPI мастером у слейва эти линии остаются входами. Но выделение отдельной сигнальной линии -- правильнее. Илья Изменено 17 марта, 2016 пользователем 501-q Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Палыч 10 17 марта, 2016 Опубликовано 17 марта, 2016 · Жалоба SPI - Это дуплекс , если Slave положил правильный ответ в SDR , то мастер его получит - даже если не захочет Ключевое слово в Вашем утверждении - "если". Если подчиненное устройство успело положить правильный ответ до того, как мастер начал процесс обмена, то - да, мастер получит его. Но, если не успел, то и не получит. Я и говорю: мастер должен предусмотреть достаточную задержку между своей посылкой и приемом ответа для того, чтобы подчиненное устройство гарантированно успело положить ответную информацию. Обычно активный сигнал SS на входе мастера переводит его узел SPI в режим ведомого ... В AVR активный сигнал на входе SS (на ноге SS, настроенной как ввод) разрешает работу сдвигового регистра SPI. И не важно в каком режиме работает SPI - master или slave. Для мастера низкий (активный) сигнал на входе SS фактически означает готовность подчиненного устройства. Этот сигнал теоретически можно было бы использовать при обмене между двумя МК, если бы в AVR была бы некая аппаратная реализация готовности подчиненного устройства, поскольку мастеру необходимо дождаться неких действий подчиненного устройства при передаче ответа. Наличие сигнала готовности подчиненного упростило бы ПО мастера. Поскольку готовность подчиненного устройства аппаратно не поддерживается в AVR, то мастер либо должен сделать необходимой длины паузу при приёме ответа, либо (что я считаю нерациональным) получить информацию о готовности подчиненного другим путем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ILYAUL 0 17 марта, 2016 Опубликовано 17 марта, 2016 · Жалоба Ключевое слово в Вашем утверждении - "если". Да но там есть и описание , как сим бороться , элементарный повтор - сие таже задержка . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться