|
Реально достижимая скорость по 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 ;повторяем цикл
Как вы видите, ничего страшного и сложного. Ну вот, весь огонь принимаю на себя(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 14 2006, 12:30
|

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

|
Цитата(zltigo @ Jul 14 2006, 11:12)  Цитата(=GM= @ Jul 14 2006, 14:59)  Как я уже сказал, не имеет значения, читать до записи или после, хотя после записи читать надо немедленно иначе данные могут быть переписаны.
как Вам уже сказали, Вы элементарноь не понимаете элементарнейший принцип работы SPI :-( Могу это еще раз подтвердить. Ой, кто это(:-)? Кто же мне это сказал, и когда? Чего я там элементарного не понимаю? Всё я понимаю(:-). Но, учтите, задача стоит - достичь максимально возможной скорости передачи по SPI. Приведите внятное видение вами данной проблемы. Подтверждать не надо, надо доказывать, цифрами, программками, ссылками на документы...А так написать, я считаю, это просто гнилой наезд. Цитата(rezident @ Jul 14 2006, 11:19)  Цитата(=GM= @ Jul 14 2006, 17:59)  Поскольку эксперты не хотят делиться своими тайными приемами и трюками(:-), публикую первый вариант программы для аппаратного скоростного 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 ;повторяем цикл
Как вы видите, ничего страшного и сложного. Ну вот, весь огонь принимаю на себя(:-). В вашем примере отсутствует проверка готовности буферов приемника и передатчика. Нельзя записывать байт в буфер SPI до того как он освободится и/или не имеет смысла читать байт до того как он запишется в буфер SPI. Я привел фрагмент программы, основной цикл, который выполняется точно за то время, как передается (и принимается) байт по SPI. Зачем я его буду проверять на готовность, если я и так знаю, что он готов к приему следующего байта! и терять при этом драгоценные такты. Я НЕ записываю байт до того, как он освободится, я записываю в тот момент, когда он только что стал пустым. Точно также и с принятым байтом.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
Jul 14 2006, 13:01
|
Гуру
     
Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882

|
Цитата(=GM= @ Jul 14 2006, 18:30)  Я привел фрагмент программы, основной цикл, который выполняется точно за то время, как передается (и принимается) байт по SPI. Зачем я его буду проверять на готовность, если я и так знаю, что он готов к приему следующего байта! и терять при этом драгоценные такты. Я НЕ записываю байт до того, как он освободится, я записываю в тот момент, когда он только что стал пустым. Точно также и с принятым байтом. Тады, ой! Я не обратил на этот факт внимание. Хотя все равно это чисто теоретический кусок кода, не имеющий практического применения. В реальности нужны еще кое-какие проверки, хотя бы на окончание буфера, выделенного для приемоперадачи или на количество байт заданных для чтения/записи.
|
|
|
|
|
Jul 14 2006, 13:40
|

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

|
Цитата(rezident @ Jul 14 2006, 12:01)  Цитата(=GM= @ Jul 14 2006, 18:30)  Я привел фрагмент программы, основной цикл, который выполняется точно за то время, как передается (и принимается) байт по SPI. Зачем я его буду проверять на готовность, если я и так знаю, что он готов к приему следующего байта! и терять при этом драгоценные такты. Я НЕ записываю байт до того, как он освободится, я записываю в тот момент, когда он только что стал пустым. Точно также и с принятым байтом.
Тады, ой! Я не обратил на этот факт внимание. Хотя все равно это чисто теоретический кусок кода, не имеющий практического применения. В реальности нужны еще кое-какие проверки, хотя бы на окончание буфера, выделенного для приемоперадачи или на количество байт заданных для чтения/записи. Принято. Что касается проверок. Код приведен практически реальный. Можно было бы, конечно, поставить декремент счетчика байт (но считать можно было бы только до 256, а если мне надо передать 300?) и переход по условию, но тогда было бы 9 МЦ, а у меня 8! Кто может написать быстрее(:-)? Ну ладно, это у меня отпускные настроения разыгрались(:-). А по делу так. Устанавливаете таймер на прерывание точно после последнего переданного байта, вот вам и будет выход из цикла, останется только подчистить верхушку стека...Зато 8 МЦ! Кому они нужны, право? Ну скажем, можно сделать хороший джейтаг для отладки, на АВР с тактовой 20 МГц скорость может достигать 10 мбит/с.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Сообщений в этой теме
=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   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
|
|
|