реклама на сайте
подробности

 
 
> ATmega slave передаёт по SPI, Нужно как принимать данные от ведущего так и передавать данные в ведущ
maksimp
сообщение May 8 2012, 20:44
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Рассматривается возможность ипользования контроллеров ATmega как ведомых (slave) по SPI. Нужно как принимать данные от ведущего так и передавать данные в ведущий. Про передачу данных по SPI там написано такое:
Цитата
The system is single buffered in the transmit direction and double buffered in the receive direc-
tion. This means that bytes to be transmitted cannot be written to the SPI Data Register before
the entire shift cycle is completed.

То есть следующий байт нужно писать в регистр данных только после того как предыдущее значение полностью передано. На ведущем это может привести к лишним паузам между байтами. Но в ведомом тактовые импульсы продолжают поступать от ведущего, и чтобы следующий байт от ведомого был передан правильный, его нужно успеть положить в регистр за время до следующего синхроиспульса SCK, то есть за время передачи одного бита?

Приём данных ведомым заметно легче, так как там есть дополнительный буфер.
Цитата
When receiving data, however, a received character must be
read from the SPI Data Register before the next character has been completely shifted in. Oth-
erwise, the first byte is lost.

То есть, для такого обмена наверное ATmega лучше не использовать?
Как сделано это в ATxmega не понятно из даташита. А вот в AT91SAM7X например есть дополнительный буфер передачи, и есть бит TDRE который показывает что он свободен.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Артём_
сообщение May 8 2012, 21:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(maksimp @ May 8 2012, 23:44) *
Рассматривается возможность ипользования контроллеров ATmega как ведомых (slave) по SPI.
То есть, для такого обмена наверное ATmega лучше не использовать?

Почему не использовать, если скорость позволяет (F_CPU/4 - максимум)?
Нужно задействовать прерывания от SPI:
первое прерывание по переходу SS в 0, затем по окончании передачи байта.
Чему тут тормозить:
Код
#pragma vector=SPI_STC_vect
__interrupt void SpiComplete()
{
SPDR=*TxData++;
*RxData++=SPDR;
}

?

Цитата(maksimp @ May 8 2012, 23:44) *
Как сделано это в ATxmega не понятно из даташита.

Непонятно потому, что они что-то скрывают.

Там кроме даташита есть ещё и апнота с примерами кода в master и slave-режиме (AVR1309: Using the XMEGA SPI).

И что там может быть непонятного? SPI - наверное самый простой интерфейс для обмена.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 23:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.03145 секунд с 7
ELECTRONIX ©2004-2016