|
вопрос по SPI. |
|
|
|
 |
Ответов
(1 - 14)
|
Oct 15 2008, 07:13
|
Участник

Группа: Новичок
Сообщений: 54
Регистрация: 12-10-08
Пользователь №: 40 892

|
Цитата(Metallist64 @ Oct 15 2008, 10:57)  Ведь регистр данных один и адрес у него один. Скорей всего тут ситуация как с регистром данных UART - их РЕАЛЬНО два ! Лучше всего прочитать в даташите и примеры там посмотреть с исходниками. Если с английским напряг, то есть перевод даташита ATmega доступный в он-лайн.
|
|
|
|
|
Oct 15 2008, 07:19
|

извечный пессимист
    
Группа: Свой
Сообщений: 1 113
Регистрация: 9-10-06
Из: Днепропетровск
Пользователь №: 21 125

|
Цитата(Metallist64 @ Oct 15 2008, 11:57)  Здравствуйте!Уважаемые знатоки. Помогите определиться со следующими вопросами по интерфейсу SPI. На графиках передачи данных можно заметить, что Master и Slave могут осуществлять передачу данных одновременно. т.е и Master и Slave передают данные друг другу. В связи с этим возникли следующие вопросы : - Как сделать одновременно прием и передачу? Ведь регистр данных один и адрес у него один. - Что будет если прочитать регистр данных Slave если передача от Master еще не закончена?Ведь флаг SPIF устанавливается для передатчика, а не приемника.
- Что будет если во время приема байта от мастера я буду записывать в регистр данных байт который я хочу передать мастеру. - Как убедиться,в том, что мастер закончил прием байта от slave? - Не получится ли так, что придется самому придумывать протокол обмена м\у устройствами. Я имею в виду пересылать флаги окончания передачи, готовности и т.д.? - Какое максимальное расстояние м/у приемником и передатчиком? Большое спасибо. PS MK - ATMega8. Регистр действительно один, но данные заходят с другой стороны, посему следует их забирать после окончания передачи кроме того для чтения присутствует буфер. про расстояние однозначно сказать нельзя это зависит от скорости обмена от разводки платы и т д. У меня например работает до 50 см, при тактовой 1 МГц.
--------------------
Slaves are those of this world Given freedom to lay chains upon The Master The wolf is no longer free Release the chains and come for me
|
|
|
|
|
Oct 15 2008, 07:51
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(garbuz @ Oct 15 2008, 10:13)  Скорей всего тут ситуация как с регистром данных UART - их РЕАЛЬНО два ! Цитата(Stanislav_S @ Oct 15 2008, 10:19)  Регистр действительно один, но данные заходят с другой стороны, посему следует их забирать после окончания передачи кроме того для чтения присутствует буфер. В документации об этом написано смутно... Предполагаю, что в действительности в SPI два регистра с одним и тем же адресом: по записи в него - данные попадают в сдвиговый регистр и передаются, принятые данные из сдвигового регистра попадают в буферный регистр, откуда читаются командой чтения регистра SPDR. Однако, это - следует проверить в эксперименте... По поводу Ваших вопросов: 1. Приемник и передатчик работают строго одновременно, поэтому окончание приема = окончанию передачи. 2. Если верно моё предположение, изложенное выше, при чтении регистра данных при незавершенном приёме - прочитаете предыдущий байт. 3. Что будет, если в момент обмена записать байт - в документации не оговорено. Следует проверить экспериментально. 4. Мастер закончит приём от Slave, когда закончит свою передачу (см. 1). Если Slave - не положил ничего в регистр для передачи - попавший в регистр сдвига байт от мастера при предыдущем приёме - уйдёт от Slave мастеру. 5. Что-то, хотя бы элементарное, но придумывать прийтется... 6. Этот интерфейс - для устройств, расположенных на одной плате, или на соседних.
|
|
|
|
|
Oct 15 2008, 08:08
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Metallist64 @ Oct 15 2008, 10:56)  В даташите в режме 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.
|
|
|
|
|
Oct 15 2008, 09:05
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Metallist64 @ Oct 15 2008, 11:14)  Что будет если Slave ничего не отправит?То что получит master? И если slave не успел так сказать "до конца" положить байт в регистр, то это равносильно, что он ничего не положил? Если Slave ничего не будет класть в SPDR, а мастер передаёт последовательность байт A, B, C..., то при приёме (который, как мы помним, идет одновременно с передачей) получит: X, A, B..., где Х - содержимое сдвигового регистра Slave в начале обмена в момент передачи мастером байта А. Что такое "до конца" - мне не понятно... По-моему (требует проверки), если Slave не успел положить ничего до начала обмена - равносильно, что ничего не положил.
|
|
|
|
|
Oct 15 2008, 12:21
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(Metallist64 @ Oct 15 2008, 13:21)  НО как определить слейву когда можно выставлять свой байт, ведь во время выставления может начаться передача и тогда со slave придет мусор. Или мастер все-таки подождет пока slave выставит свой байт? Помогите, никак не могу понять данный вопрос. Когда я говорил выше: нужно придумать протокол обмена - имелось в виду, что Вы и определитесь: как Ваши устройства будут обмениваться информацией... Когда слейву выставлять и какие данные для передачи и должно быть определено в протоколе. Послольку, всем рулит мастер - инициатива обмена байтами по SPI будет исходить только от него. Может быть, Вам посмотреть для примера на что-нибудь из памяти с интерфейсом SPI? Скорость "работы" с SPI должна быть выше у слейва по сравнению с мастером (возможно, на мастере нужно предусмотреть задержки, для того, чтобы слейв успел положить нужный байт в регистр данных). Если слейв - не успел положить данные до обмена байтов с мастером - мастер может это узнать по принятому байту (он тот же, что и был передан мастером при предыдущем обмене байтами), слейв узнает это (что не успел положить) по биту WCOL... В протоколе д.б. предусмотрено: как этого по-возможности избежать и что делать, если это все-таки случилось. P.S. Кстати, программирование по SPI AVR, которое описано в DS - можно взять как пример, и, переработав под свои нужды, придумать свой протокол...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|