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

ATmega slave передаёт по SPI

Рассматривается возможность ипользования контроллеров 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 который показывает что он свободен.

 

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


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

Рассматривается возможность ипользования контроллеров ATmega как ведомых (slave) по SPI.

То есть, для такого обмена наверное ATmega лучше не использовать?

Почему не использовать, если скорость позволяет (F_CPU/4 - максимум)?

Нужно задействовать прерывания от SPI:

первое прерывание по переходу SS в 0, затем по окончании передачи байта.

Чему тут тормозить:

#pragma vector=SPI_STC_vect
__interrupt void SpiComplete()
{
SPDR=*TxData++;
*RxData++=SPDR;
}

?

 

Как сделано это в ATxmega не понятно из даташита.

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

 

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

 

И что там может быть непонятного? SPI - наверное самый простой интерфейс для обмена.

 

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


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

В xmege, по-моему, двойной буфер на передачу при работе USART в режиме SPI. Но как слэйв не использую.

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


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

... то есть за время передачи одного бита?
Нет, за время передачи одного байта.

 

Работаю в xmege мастером SPI на скорости (CLKper/2).

 

В xmege, по-моему, двойной буфер на передачу при работе USART в режиме SPI. Но как слэйв не использую.

Пишут что есть:

The Transmitter USART in Master SPI mode includes buffering. The XMEGA SPI has no transmit buffer.

 

 

На ведущем это может привести к лишним паузам между байтами.
100%

Чтоб без пауз, думаю, нужна xmega, USART в режиме мастер SPI и DMA.

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


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

Почему не использовать, если скорость позволяет (F_CPU/4 - максимум)?

Нужно задействовать прерывания от SPI:

первое прерывание по переходу SS в 0, затем по окончании передачи байта.

Чему тут тормозить:

#pragma vector=SPI_STC_vect
__interrupt void SpiComplete()
{
SPDR=*TxData++;
*RxData++=SPDR;
}

?

Тормозить будет если поступают прерывания также и из других источников. Если прерывание от SPI придёт во время того как обрабатывается другое прерывание, то выполнить SPDR=*TxData++; вовремя она может и не успеть.

 

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

Спасибо, посмотрел, в xmega это устроено так же как и в простой mega - двойного буфера нет. Может быть только можно с DMA сделать.

 

Чтоб без пауз, думаю, нужна xmega, USART в режиме мастер SPI и DMA.

Речь идёт про slave. USART в режиме slave SPI не умеет работать.

 

Так что во избежание, видимо лучше сразу иметь в виду какой-нибудь ARM для такого применения.

 

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


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

Тормозить будет если поступают прерывания также и из других источников. Если прерывание от SPI придёт во время того как обрабатывается другое прерывание, то выполнить SPDR=*TxData++; вовремя она может и не успеть.

Нужно в другом прерывании разрешить прерывания.

#pragma vector=INT_vect
__interrupt void AnyInterrupt()
{
__enable_interrupt();
// остальные действия
}

 

Речь идёт про slave. USART в режиме slave SPI не умеет работать.

У xmega SPI slave может работать совместно с DMA.

 

Так что во избежание, видимо лучше сразу иметь в виду какой-нибудь ARM для такого применения.

Лучше суперкомпьютер тогда сразу.

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


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

Тормозить будет если поступают прерывания также и из других источников. Если прерывание от SPI придёт во время того как обрабатывается другое прерывание, то выполнить SPDR=*TxData++; вовремя она может и не успеть.

В таком случае целесообразно в программе ведущего предусмотреть паузу перед выдачей следующего байта.

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

 

 

В развитие этой темы.

О протоколах передачи данных для подобных задач.

Для организации передачи данных по SPI между одним ведущим и несколькими ведомыми

существуют какие либо стандартные протоколы?

Или каждый разработчик пишет свой протокол?

Особенностью задачи является то, что сигнал SS один для всех ведомых,

т.е. ведущий задаёт адрес ведомого в протоколе.

 

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


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

Особенностью задачи является то, что сигнал SS один для всех ведомых,

т.е. ведущий задаёт адрес ведомого в протоколе.

Обычно SS у каждого slave свой - соответственно адрес в протоколе не нужен.

Это и есть стандартное использование SPI.

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


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

Обычно SS у каждого slave свой - соответственно адрес в протоколе не нужен.

Это и есть стандартное использование SPI.

 

Да, я понимаю что стандартное использование SPI именно такое, но у меня в шине SPI только 4 провода, и больше просто нет.

Поэтому придётся адрес slave передавать в посылке.

 

А что на счёт стандартных протоколов, они существуют?

 

 

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


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

А что на счёт стандартных протоколов, они существуют?

Стандартен принцип SPI.

А дальше каждый делает свой стандарт какой захочет.

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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