Модуль ECAN для dsPIC. Типичная сеть ECAN. 16 приемных фильтров для фильтрования сообщения, страница 17

Значение указателя записи бит CiFIFO <FBP> доступно только для чтения. Когда сообщение помещено в буфер, связанный с этим буфером бит RXFUL устанавливается, после чего счётчик буфера FIFO инкрементируется.

Если значение FBP<5:0> указывает на буфер, и бит RXFUL связанный с  этим буфером установлен в «1», то в то время когда фильтр пытается записать сообщение устанавливается связанный с этим буфером бит RXOVL, при этом сообщение теряется. Потеряв сообщение, значение указателя FBP<5:0>  инкрементируется нормально.

Если значение FBP<5:0> указывает на приёмо-передающий буфер который выбран как передающий буфер во время фильтрации и записи сообщения, связанный с этим буфером бит RXOVL устанавливается и сообщение теряется. Потеряв сообщение, значение указателя FBP<5:0> инкрементируется нормально.

Пользователь программно читает данные из FIFO, опустошая его. Когда область буфера прочитана, пользователь программно сбрасывает бит RXFUL соответствующего буфера. Когда бит RXFUL очищен, номер соответствующего буфера увеличенный на единицу, записывается в биты CiFIFO<FNRB>. Программа пользователя может (только) считать это значение, сдвинуть в лево на 4 бита и использовать как адрес смещения для следующего буфера, который нужно прочитать. Программа пользователя должна считывать буферы один за другим.

Модуль генерирует условие прерывания если FIFO почти наполнен. Это условие описано математически как показано  в Формуле 1.

Формула 1: Вычисление FIFO прерывания

FNRB-FBP=1

или

(FNRB=START)AND(FBP=END)

Прерывание генерируется когда устанавливается бит RXFUL для только что записанного буфера и после обновления бита FBP. Вычисление использует обновленное значение FBP.

7.4 Пример FIFO

Рисунок 15 показывает несколько примеров функционирования FIFO. В примере стартовый буфер FIFO - 5 (CiFCTRL<FSA>=101), а последний буфер FIFO - 11 (CiFDTRL<DMABS>=011).

Рисунок 15. Пример использования FIFO

Примечание: MBn представляет буфера сообщения 5-11.

'Write' показывает, что сообщение записано в буфер сообщений FIFO, и RXFUL флаг, связанный с тем буфером установлен.

'Read' показывает, что пользовательская программа читает сообщение из буфера сообщений FIFO. Как только буферное сообщение будет прочитано, программному обеспечению можно будет очистить соответствующий этому буферу бит RXFUL.

Case 1. Прежде чем принять сообщения в буфер FIFO его необходимо проинициализировать. Указатель FIFO буфера указывает на буфер 5 (FRB=5), а указатель следующего буфера чтения указан на буфер сообщений 6 (FNRB=5)

Case 2. показывает FIFO  после одного принятого сообщения и переданного в буфер сообщений 5. Указатель буфера FIFO инкрементируется (FBP=6), и бит заполнения буфера сообщений 5 устанавливается (RXFUL=1)

Case 3 показывает FIFO  после шести принятых сообщений. Указатель буфера FIFO указывает на последний расположенный в области FIFO (FBP=5+6=11), а указатель следующего буфера для чтения указывает на начальный буфер FIFO (FNRB=5). В этом случае, FIFO почти полон и будет сгенерировано FIFO прерывание.

Case 4 показывает FIFO после программного чтения первого принятого сообщения. Когда программно очищается бит наполнения буфера сообщений 5 RXFUL, модуль записывает в указатель следующего буфера для чтения FIFO MB5+1 (FNRB=5+1=6).

Case 5 показывает FIFO после чтения и записи в буфер 11 семи сообщений. Бит RXFUL заполнения буфера сообщений 11 устанавливается (RXFUL=1). Вместо инкрементирования, указатель буфера FIFO возвращается на начало FIFO (FBP=FSA=5). Замете FBP сейчас на один меньше FNRB, который сгенерирует FIFO прерывание как только RXFUL статус-бит для буфера сообщений 11 установится.

Case 6 показывает FIFO  после восьми принятых и записанных в буфер 5 сообщений. Сейчас FIFO полон. Для этого условия нет прерывания.

Case 7 показывает FIFO  после девяти принятых сообщений. Сейчас FIFO переполнен. Модуль устанавливает бит RXOVL для буфера выбранного для записи. Сообщение утеряно. Модуль генерирует прерывание переполнения чтения.