|
Реально достижимая скорость по SPI, Программно-аппаратные трюки для достижения максимальной скорости перед |
|
|
|
Jul 12 2006, 13:34
|

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

|
Тема была навеяна $ilent, но она была закрыта прежде, чем я успел в ней поучаствовать :-). Интересует, прежде всего, потенциально достижимая скорость как в аппаратном исполнении, так и в программном. Какие требования в "железном" исполнении? Необходимо передать по SPI nByte байт из буфера txBuffer (ОЗУ МК) и одновременно принять массив байт такой же длины в rxBuffer (ОЗУ МК). Моя программа выполняется за 8МЦ, т.е. ровно один такт на 1 бит. Интересно, можно ли добиться большего? Что скажут эксперты? Программа $ilent работает в полудуплексе, следовательно можно снизить требования к программной реализации SPI, а именно, необходимо программно формировать только биты данных и синхронизацию на передачу ИЛИ принимать биты данных по положительным фронтам импульсов синхронизации на прием. Моя программа передает один байт за 36МЦ, т.е. за 4,5 такта на 1 бит. Как добиться большего? Народ, не воспринимайте топик слишком сурово, это мой первый на этом сайте...
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
 |
Ответов
|
Jul 13 2006, 15:57
|
Частый гость
 
Группа: Свой
Сообщений: 185
Регистрация: 5-05-06
Из: Ekaterinburg, Russia
Пользователь №: 16 821

|
А какие ограничения на использование регистров? Обязательно два буфера? Можно ли использовать прерывание SPI? Цитата 2) отправить его в регистр SPDR на передачу, 3) прочитать из SPDR принятый по SPI байт, хм, а не наоборот?
Сообщение отредактировал Yura_K - Jul 13 2006, 16:13
--------------------
Чудес не бывает - бывает мало знаний и опыта!
|
|
|
|
|
Jul 14 2006, 07:00
|
Частый гость
 
Группа: Участник
Сообщений: 177
Регистрация: 25-08-05
Из: Ставрополь
Пользователь №: 7 964

|
Цитата(Yura_K @ Jul 13 2006, 19:57)  2) отправить его в регистр SPDR на передачу, 3) прочитать из SPDR принятый по SPI байт, хм, а не наоборот? А что вы собственно читать из SPDR собрались до записи в него? Результат предыдущего сдвига? Принцип работы SPI - кольцевой регистр сдвига, пока мастер не инициировал передачу, слэйв ничего сам не отдаст. Поэтому все правильно - сначала пишем в SPDR, потом читаем.
|
|
|
|
|
Jul 14 2006, 11:59
|

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 ;повторяем цикл
Как вы видите, ничего страшного и сложного. Ну вот, весь огонь принимаю на себя(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
=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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|