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

 
 
> Реально достижимая скорость по SPI, Программно-аппаратные трюки для достижения максимальной скорости перед
=GM=
сообщение Jul 12 2006, 13:34
Сообщение #1


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Тема была навеяна $ilent, но она была закрыта прежде, чем я успел в ней поучаствовать :-).

Интересует, прежде всего, потенциально достижимая скорость как в аппаратном исполнении, так и в программном.

Какие требования в "железном" исполнении? Необходимо передать по SPI nByte байт из буфера txBuffer (ОЗУ МК) и одновременно принять массив байт такой же длины в rxBuffer (ОЗУ МК). Моя программа выполняется за 8МЦ, т.е. ровно один такт на 1 бит. Интересно, можно ли добиться большего? Что скажут эксперты?

Программа $ilent работает в полудуплексе, следовательно можно снизить требования к программной реализации SPI, а именно, необходимо программно формировать только биты данных и синхронизацию на передачу ИЛИ принимать биты данных по положительным фронтам импульсов синхронизации на прием. Моя программа передает один байт за 36МЦ, т.е. за 4,5 такта на 1 бит. Как добиться большего?

Народ, не воспринимайте топик слишком сурово, это мой первый на этом сайте...


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Yura_K
сообщение Jul 13 2006, 15:57
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 185
Регистрация: 5-05-06
Из: Ekaterinburg, Russia
Пользователь №: 16 821



А какие ограничения на использование регистров? Обязательно два буфера? Можно ли использовать прерывание SPI?
Цитата
2) отправить его в регистр SPDR на передачу,
3) прочитать из SPDR принятый по SPI байт,

хм, а не наоборот?

Сообщение отредактировал Yura_K - Jul 13 2006, 16:13


--------------------
Чудес не бывает - бывает мало знаний и опыта!
Go to the top of the page
 
+Quote Post
ksv198
сообщение Jul 14 2006, 07:00
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 177
Регистрация: 25-08-05
Из: Ставрополь
Пользователь №: 7 964



Цитата(Yura_K @ Jul 13 2006, 19:57) *
2) отправить его в регистр SPDR на передачу,
3) прочитать из SPDR принятый по SPI байт,
хм, а не наоборот?

А что вы собственно читать из SPDR собрались до записи в него? Результат предыдущего сдвига?
Принцип работы SPI - кольцевой регистр сдвига, пока мастер не инициировал передачу, слэйв ничего сам не отдаст. Поэтому все правильно - сначала пишем в SPDR, потом читаем.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Jul 14 2006, 11:59
Сообщение #4


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(ksv198 @ Jul 14 2006, 06:00) *
Цитата(Yura_K @ Jul 13 2006, 19:57) *

2) отправить его в регистр SPDR на передачу,
3) прочитать из SPDR принятый по SPI байт,
хм, а не наоборот?

А что вы собственно читать из SPDR собрались до записи в него? Результат предыдущего сдвига?
Принцип работы SPI - кольцевой регистр сдвига, пока мастер не инициировал передачу, слэйв ничего сам не отдаст. Поэтому все правильно - сначала пишем в SPDR, потом читаем.

Как я уже сказал, не имеет значения, читать до записи или после, хотя после записи читать надо немедленно иначе данные могут быть переписаны. При чтении до записи самое первое чтение будет пустым, ну сделайте буфер на 1 байт больше и все.

Поскольку эксперты не хотят делиться своими тайными приемами и трюками(:-), публикую первый вариант программы для аппаратного скоростного SPI, передача идет на предельно достижимой скорости fCLK/2, fCLK-тактовая частота процессора, один байт передается за 16 машинных циклов (МЦ). Регистровая пара Х указывает на начало передающего буфера, пара Y указывает на байт ПЕРЕД приемным буфером, txByte, rxByte - верхние регистры, скажем r16, r17.

Код
spiLoop:   <nop x 8 раз или другая задача на 8МЦ>
               ld      txByte,X+    ;подготавливаем байт на передачу
               in      rxByte,SPDR  ;читаем принятый байт (первый байт-фиктивный)
               out     SPDR,txByte  ;запускаем байт на передачу
               st      Y+,rxByte    ;сохраняем принятый байт в приемном буфере
               rjmp    spiLoop      ;повторяем цикл



Как вы видите, ничего страшного и сложного. Ну вот, весь огонь принимаю на себя(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- =GM=   Реально достижимая скорость по SPI   Jul 12 2006, 13:34
- - Yura_K   А что значит программа выполняется за 8МЦ? Передае...   Jul 12 2006, 14:52
- - SpiritDance   Ничего не понял. Толи у меня башка уже не варит то...   Jul 12 2006, 15:15
|- - =GM=   Цитата(SpiritDance @ Jul 12 2006, 14:15) ...   Jul 12 2006, 16:14
- - KRS   Может вы имели ввиду не мегагерцы а такты? т.е про...   Jul 12 2006, 16:08
|- - =GM=   Цитата(KRS @ Jul 12 2006, 15:08) Может вы...   Jul 12 2006, 16:31
|- - =GM=   Цитата(Yura_K @ Jul 13 2006, 14:57) А как...   Jul 13 2006, 21:51
|- - zltigo   Цитата(=GM= @ Jul 14 2006, 14:59) Как я у...   Jul 14 2006, 12:12
||- - =GM=   Цитата(zltigo @ Jul 14 2006, 11:12) Цитат...   Jul 14 2006, 12:30
||- - rezident   Цитата(=GM= @ Jul 14 2006, 18:30) Я приве...   Jul 14 2006, 13:01
||- - =GM=   Цитата(rezident @ Jul 14 2006, 12:01) Цит...   Jul 14 2006, 13:40
|- - rezident   Цитата(=GM= @ Jul 14 2006, 17:59) Посколь...   Jul 14 2006, 12:19
|- - ksv198   Цитата(=GM= @ Jul 14 2006, 15:59) Как я у...   Jul 14 2006, 12:47
|- - ksv198   2'=GM= Пришел домой, подумал внимательно и пон...   Jul 15 2006, 06:02
|- - =GM=   Цитата(ksv198 @ Jul 15 2006, 05:02) 2...   Jul 15 2006, 17:21
- - unichorn   Интересный подход. А остальная программа в момент ...   Jul 14 2006, 12:39
|- - =GM=   Цитата(unichorn @ Jul 14 2006, 11:39) Инт...   Jul 14 2006, 13:25
- - GetSmart   Да врут они все тут. Всё будет работать в тех рамк...   Jul 14 2006, 13:06
- - GetSmart   Код <nop x 8 раз или другая задача на 8МЦ...   Jul 14 2006, 13:53
- - rezident   =GM=, есть несколько нюансов в описываемой вами сх...   Jul 14 2006, 13:55
|- - =GM=   Цитата(rezident @ Jul 14 2006, 12:55) =GM...   Jul 14 2006, 14:50
- - GetSmart   ЦитатаНормально, Григорий(:-). Хотя у вас 10 МЦ, а...   Jul 14 2006, 14:58
|- - =GM=   Цитата(GetSmart @ Jul 14 2006, 13:58) Цит...   Jul 14 2006, 15:16
- - GetSmart   1. А кто тогда Георгий? 2. А когда у вас в цикле ...   Jul 14 2006, 15:32
|- - =GM=   Цитата(GetSmart @ Jul 14 2006, 14:32) 1. ...   Jul 14 2006, 15:57
- - GetSmart   ЦитатаНадеюсь, передается индивидуальная для каждо...   Jul 14 2006, 16:16
|- - =GM=   Цитата(GetSmart @ Jul 14 2006, 15:16) Цит...   Jul 14 2006, 16:27
- - GetSmart   Делитель тока 1/4. Это обычный делитель синхросигн...   Jul 14 2006, 16:40
- - Yura_K   2 ksv198 ЦитатаПоэтому все правильно - сначала пиш...   Jul 14 2006, 17:21
- - GetSmart   Ошибок вроде нету. Этот вариант идеально подходит ...   Jul 14 2006, 17:44


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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 05:54
Рейтинг@Mail.ru


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