Перейти к содержанию
    

вопрос по SPI.

Здравствуйте!Уважаемые знатоки.

Помогите определиться со следующими вопросами по интерфейсу SPI.

На графиках передачи данных можно заметить, что Master и Slave могут осуществлять передачу данных одновременно.

т.е и Master и Slave передают данные друг другу.

В связи с этим возникли следующие вопросы :

- Как сделать одновременно прием и передачу? Ведь регистр данных один и адрес у него один.

- Что будет если прочитать регистр данных Slave если передача от Master еще не закончена?Ведь флаг SPIF устанавливается для передатчика, а не приемника.

 

- Что будет если во время приема байта от мастера я буду записывать в регистр данных байт который я хочу передать мастеру.

- Как убедиться,в том, что мастер закончил прием байта от slave?

- Не получится ли так, что придется самому придумывать протокол обмена м\у устройствами. Я имею в виду пересылать флаги окончания передачи, готовности и т.д.?

- Какое максимальное расстояние м/у приемником и передатчиком?

Большое спасибо.

PS MK - ATMega8.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хоть регистр и один, но данные на передачу выдвигаются с одного конца регистра, а принимаемые данные заходят в регистр с другого конца

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ведь регистр данных один и адрес у него один.

Скорей всего тут ситуация как с регистром данных UART - их РЕАЛЬНО два !

 

Лучше всего прочитать в даташите и примеры там посмотреть с исходниками. Если с английским напряг, то есть перевод даташита ATmega доступный в он-лайн.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Здравствуйте!Уважаемые знатоки.

Помогите определиться со следующими вопросами по интерфейсу SPI.

На графиках передачи данных можно заметить, что Master и Slave могут осуществлять передачу данных одновременно.

т.е и Master и Slave передают данные друг другу.

В связи с этим возникли следующие вопросы :

- Как сделать одновременно прием и передачу? Ведь регистр данных один и адрес у него один.

- Что будет если прочитать регистр данных Slave если передача от Master еще не закончена?Ведь флаг SPIF устанавливается для передатчика, а не приемника.

 

- Что будет если во время приема байта от мастера я буду записывать в регистр данных байт который я хочу передать мастеру.

- Как убедиться,в том, что мастер закончил прием байта от slave?

- Не получится ли так, что придется самому придумывать протокол обмена м\у устройствами. Я имею в виду пересылать флаги окончания передачи, готовности и т.д.?

- Какое максимальное расстояние м/у приемником и передатчиком?

Большое спасибо.

PS MK - ATMega8.

Регистр действительно один, но данные заходят с другой стороны, посему следует их забирать после окончания передачи кроме того для чтения присутствует буфер. про расстояние однозначно сказать нельзя это зависит от скорости обмена от разводки платы и т д. У меня например работает до 50 см, при тактовой 1 МГц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Скорей всего тут ситуация как с регистром данных UART - их РЕАЛЬНО два !

 

Регистр действительно один, но данные заходят с другой стороны, посему следует их забирать после окончания передачи кроме того для чтения присутствует буфер.
В документации об этом написано смутно... Предполагаю, что в действительности в SPI два регистра с одним и тем же адресом: по записи в него - данные попадают в сдвиговый регистр и передаются, принятые данные из сдвигового регистра попадают в буферный регистр, откуда читаются командой чтения регистра SPDR. Однако, это - следует проверить в эксперименте...

 

По поводу Ваших вопросов:

 

1. Приемник и передатчик работают строго одновременно, поэтому окончание приема = окончанию передачи.

2. Если верно моё предположение, изложенное выше, при чтении регистра данных при незавершенном приёме - прочитаете предыдущий байт.

3. Что будет, если в момент обмена записать байт - в документации не оговорено. Следует проверить экспериментально.

4. Мастер закончит приём от Slave, когда закончит свою передачу (см. 1). Если Slave - не положил ничего в регистр для передачи - попавший в регистр сдвига байт от мастера при предыдущем приёме - уйдёт от Slave мастеру.

5. Что-то, хотя бы элементарное, но придумывать прийтется...

6. Этот интерфейс - для устройств, расположенных на одной плате, или на соседних.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В даташите в режме slave при приеме байта ждут 1 во флаге SPIF. ОН ЧТО ПРИ ПРИЕМЕ УСТАНАВЛИВАЕТЯ В 0 ???.

 

while(!(SPSR & (1<<SPIF)))

Изменено пользователем Metallist64

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В даташите в режме slave при приеме байта ждут 1 во флаге SPIF. ОН ЧТО ПРИ ПРИЕМЕ УСТАНАВЛИВАЕТЯ В 0 ???.
Цитата из DS
When 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо!

Смутило отсутствие "по окончании приема SPIF уст. в 1." :-), хотя конечно напрашивалось само собой.

Еще один небольшой вопрос к Палычу. Немного не ясна фраза:

 

"Если Slave - не положил ничего в регистр для передачи - попавший в регистр сдвига байт от мастера при предыдущем приёме - уйдёт от Slave мастеру."

Нельзя ли немного перефразировать? Что будет если Slave ничего не отправит?То что получит master?

И если slave не успел так сказать "до конца" положить байт в регистр, то это равносильно, что он ничего не положил?

Изменено пользователем Metallist64

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Большое спасибо!

Смутило отсутствие "по окончании приема SPIF уст. в 1." :-), хотя конечно напрашивалось само собой.

Еще один небольшой вопрос к Палычу. Немного не ясна фраза:

 

"Если Slave - не положил ничего в регистр для передачи - попавший в регистр сдвига байт от мастера при предыдущем приёме - уйдёт от Slave мастеру."

Нельзя ли немного перефразировать? Что будет если Slave ничего не отправит?То что получит master?

И если slave не успел так сказать "до конца" положить байт в регистр, то это равносильно, что он ничего не положил?

Очевидно в таком случае, слэйв передаст последний принятый от мастера байт. Что значит не положил до конца? Не забывайте что есть еще сигнал CS.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что будет если Slave ничего не отправит?То что получит master? И если slave не успел так сказать "до конца" положить байт в регистр, то это равносильно, что он ничего не положил?
Если Slave ничего не будет класть в SPDR, а мастер передаёт последовательность байт A, B, C..., то при приёме (который, как мы помним, идет одновременно с передачей) получит: X, A, B..., где Х - содержимое сдвигового регистра Slave в начале обмена в момент передачи мастером байта А.

Что такое "до конца" - мне не понятно... По-моему (требует проверки), если Slave не успел положить ничего до начала обмена - равносильно, что ничего не положил.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Всем участникам ОГРОМНОЕ спасибо!

Но прошу добить меня до конца.

Вот следующий вопрос:

- допустим мастер решил передать данные( slave`а он не спрашивает готов ли тот передавать или нет). Выставляет лог.0 на SS. и процесс пошел. НО как определить слейву когда можно выставлять свой байт, ведь во время выставления может начаться передача и тогда со slave придет мусор. Или мастер все-таки подождет пока slave выставит свой байт? Помогите, никак не могу понять данный вопрос.

Изменено пользователем Metallist64

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Рассмотрите два варианта:

1. Прерывание при переходе SS в 0 загружает данные от slave (не пробовал)

2. Master передает служебный один или два байта (например, адрес регистра для считывания), после этого Slave отдает данные Master'у, при этом Master передает Slav'у 0xFF. Подобный алгоритм используется в модулях ZigBee и NanoNet, где трансивер всегда Slave. Описания трансиверов для изучения подробностей протокола есть в соответствующей докуметнации (Atmel, Freescale, Nanotron) (рабочие конструкции). С NanoNet использовал и SPI, и USART в режиме SPI.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

НО как определить слейву когда можно выставлять свой байт, ведь во время выставления может начаться передача и тогда со slave придет мусор. Или мастер все-таки подождет пока slave выставит свой байт? Помогите, никак не могу понять данный вопрос.
Когда я говорил выше: нужно придумать протокол обмена - имелось в виду, что Вы и определитесь: как Ваши устройства будут обмениваться информацией... Когда слейву выставлять и какие данные для передачи и должно быть определено в протоколе. Послольку, всем рулит мастер - инициатива обмена байтами по SPI будет исходить только от него. Может быть, Вам посмотреть для примера на что-нибудь из памяти с интерфейсом SPI? Скорость "работы" с SPI должна быть выше у слейва по сравнению с мастером (возможно, на мастере нужно предусмотреть задержки, для того, чтобы слейв успел положить нужный байт в регистр данных). Если слейв - не успел положить данные до обмена байтов с мастером - мастер может это узнать по принятому байту (он тот же, что и был передан мастером при предыдущем обмене байтами), слейв узнает это (что не успел положить) по биту WCOL... В протоколе д.б. предусмотрено: как этого по-возможности избежать и что делать, если это все-таки случилось.

 

P.S. Кстати, программирование по SPI AVR, которое описано в DS - можно взять как пример, и, переработав под свои нужды, придумать свой протокол...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может не придумывать свой, а взять идеи из готовых изделий, в которых устройство как slave SPI выступает (трансиверы).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...