Pic: слитный прием данных по SPI.
05.03.2013, 14:52
|
|
|
Частый гость
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Pic: слитный прием данных по SPI.
Всем привет!
Порылся на форуме, но не нашел похожей ветки.
Столкнулся с проблемой приема данных по SPI, когда они идут практически слитно друг за другом.
Используемый камень - PIC18F44K22.
Задача состоит в следующем:
Время от времени, возникает порционная передача 3х байт данных. Необходимо эти 3 байта принять, и поместить их в буфер, где они будут обработаны в свободное от передачи время. Таких посылок может быть несколько, но не более 5-7 порций по 3 байта (между посылками конечно есть время, по длительности чуть дольше чем передача одного байта).
Вот график передачи:

Для приема, я использовал прерывание от MSSP модуля о завершении приема данных, и как только оно возникает, считываю буфер SSP и записываю данные в буфер FIFO для обработки. Проблема в том, что процедура записи в FIFO не успевает произвести обработку, до приема следующего байта. Таким образом, 1 байт из посылки не доходит.
Для организации FIFO я использовал код написанный на дефайнах от сюда: http://mainloop.ru/c-language/simple-fifo.html.
Привожу дизассемблинг процедуры FIFO_PUSH:
|
Код:
|
52: FIFO_PUSH(buffer, SSP1BUF);
0012 C012 MOVFF 0x12, 0x13
0014 F013 NOP
0016 0E0F MOVLW 0xF
0018 1613 ANDWF 0x13, F, ACCESS
001A 5013 MOVF 0x13, W, ACCESS
001C 0F01 ADDLW 0x1
001E 6ED9 MOVWF FSR2L, ACCESS
0020 6ADA CLRF FSR2H, ACCESS
0022 CFC9 MOVFF SSP1BUF, INDF2
0024 FFDF NOP
0026 2A12 INCF 0x12, F, ACCESS |
В попытках оптимизировать этот код, я пытался убрать функцию sizeof, рассчитывая что она кушает много кода, но никакого прироста не оказалось вообще.
Подскажите, как более грамотно организовать FIFO буфер для приема слитно идущих байт? Исходя их того, что время между передачей байт не увеличиваем. Есть еще возможность сгенерировать прерывание на любой ноге INT0 непосредственно перед началом передачи, но я пока не вижу применения этому.
Последний раз редактировалось JekaKey; 05.03.2013 в 14:54.
|
|
|
|
05.03.2013, 15:43
|
|
|
Супер-модератор
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,394
Сказал спасибо: 2,016
Сказали Спасибо 1,356 раз(а) в 591 сообщении(ях)
|
Re: Pic: слитный прием данных по SPI.
sizeof() никакого кода не кушает - компилятор просто подставит туда число
С какой скоростью передача SPI идет?
ЗЫ Упс. Если верить картинке, ~100 us на 3 байта... ~30 uS байт. И чтобы за 30 uS программа не успела байт в буфер положить? Не верю. Не знаю как в ПИКах, в АВРках при 8 МГц тактовой это было бы 240 тактов.
__________________
[ жизнь приятна и красива, если выпить литр пива ]
Последний раз редактировалось nml; 05.03.2013 в 15:50.
|
|
|
|
05.03.2013, 16:00
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 20.06.2006
Адрес: Украина, Запорожье
Сообщений: 8,009
Сказал спасибо: 0
Сказали Спасибо 4,955 раз(а) в 2,379 сообщении(ях)
|
Re: Pic: слитный прием данных по SPI.
при 8 МГц тактовой это было бы 240 тактов - для пиков в 4 раза меньше (относительно команд)
|
|
|
|
05.03.2013, 16:24
|
|
|
Частый гость
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Pic: слитный прием данных по SPI.
Сообщение от nml
|
С какой скоростью передача SPI идет?
ЗЫ Упс. Если верить картинке, ~100 us на 3 байта... ~30 uS байт. И чтобы за 30 uS программа не успела байт в буфер положить? Не верю. Не знаю как в ПИКах, в АВРках при 8 МГц тактовой это было бы 240 тактов.
|
Да, все верно, 30uS на байт. Тут расчет приведен для тактовой частоты процессора в 1МГц, максимальная скорость передачи 1/4я от тактовой скорости.
Как верно заметил jump, у Pic16/18 на каждую команду 4 такта процессора уходит, соответственно максимальная производительность в 4 раза меньше.
Да, забыл написать, что оба процессора на одинаковой частоте работают...
|
|
|
|
05.03.2013, 17:29
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 13.10.2007
Адрес: Беларусь
Сообщений: 8,026
Сказал спасибо: 60
Сказали Спасибо 3,941 раз(а) в 2,302 сообщении(ях)
|
Re: Pic: слитный прием данных по SPI.
После первого прерывания отключить глобально прерывания, сбросить флаг и сидеть в обработчике прерывания до тех пор, пока не примется 3-байт, складывая их (мониторя флаг запроса прерывания) в буфер и программно сбрасывая флаг запроса, после 3-го байта включить прерывания и выйти. Экономится время на вход-выход в прерывание. 60 машинных циклов должно хватить
|
|
|
|
06.03.2013, 09:58
|
|
|
Частый гость
Регистрация: 12.10.2012
Сообщений: 33
Сказал спасибо: 8
Сказали Спасибо 3 раз(а) в 3 сообщении(ях)
|
Re: Pic: слитный прием данных по SPI.
niXto, спасибо за совет, буду пробовать поступить так, о результатах сообщу.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 16:09.
|
|