Всем привет!
Порылся на форуме, но не нашел похожей ветки.
Столкнулся с проблемой приема данных по 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 непосредственно перед началом передачи, но я пока не вижу применения этому.