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

4.  Фрейм данных помещается в буфер сообщений 14 ECAN узла 1

Рисунок 9. Удалённый запрос/ответ

1. Узел, передающий удалённый запрос, должен иметь передающий буфер, чтобы послать удалённый запрос, и один приёмный буфер, чтобы получить в ответ фрейм данных.

2. Узел, получающий удалённый запрос должен иметь передающий буфер, чтобы передать фрейм данных в ответ на полученный удалённый запрос.

3. CiBUFPNTm <FnBP> должен указывать на передающий буфер в случае удалённого запроса.

4. CiTRmnCON <RTREN> должен быть установлен так, чтобы, когда удалённый запрос был получен, CiTRmnCON <TXREQ> бит будет автоматически установлен.

Пример 3 иллюстрирует программный код для передачи расширенного удалённого запроса используя буфер сообщения 2.

Пример 3. Пример программы для перадачи расширенного удалённого запроса

/* Назначаем буфер сообщения 32x8слов для ECAN1 в DMARAM */

unsigned int ecan1MsgBuf[32][8] __attribute__(space(dma));

DMA1STA = __builtin_dmaoffset(ecan1MsgBuf);

/* Конфигурируем буфер сообщения 0 для передачи, а также назначаем приоритет */

C1TR23CONbits.TXEN0 = 0x1;

C1TR23CONbits.TX0PRI = 0x2;

/* Записываем сообщение в буфер 0 */

/* CiTRBnSID = 0bxxx1 0010 0011 1111 = 0х123F

IDE = 0b1     SRR = 0b1    SID<10:0> : 0b100 1000 1111 */

ecan1MsgBuf[2][0] = 0x123F;

/* CiTRBnEID = 0bxxxx 1111 0000 0000  =  0x0F00

EID<17:6> = 0b1111 0000 0000 */

ecan1MsgBuf[2][1] = 0x0F00;

/* CiTRBnDLC = 0b0000 1110 xxx0 1111  = 0x0E0F

EID<17:6> = 0b000011  RTR = 0b1   RB1 = 0b0    RB0 = 0b0    DLC = 0b1111 */

ecan1MsgBuf[2][2] = 0x0E0F;

/* Байты данных отсутствуют для удалённого запроса */

/* Делаем запрос на передачу данных из буфера 2 */

C1TR23CONbits.TXREQ2 = 0x1;

7. ПРИЁМ СООБЩЕНИЙ ECAN

ECAN модуль может принимать и стандартные и расширенные фреймы из CAN шины. Кроме того он имеет дополнительную возможность автоматически передавать принятые сообщения в буфер определяемый пользователем в DMA RAM, таким образом исключая необходимость пользователю отслеживать копирование сообщения из аппаратного регистра в буфер определяемый пользователем. Формат хранения сообщения в пределах буфера DMA  идентичен передающим буферам, с каждым сообщением (включая связанный регистр статуса) занимаемым 8 слов DMA RAM.

Две главных стадии процесса приёма из шины ECAN описаны ниже, с упрощённым примером процесса приёма показанным на рисунке 10 и рисунке 13.

7.1 Принятые сообщения и приемный фильтр.

Как показано на рисунке 10, каждое приходящее по шине сообщение принимается в буфер приемных сообщений, и его поле идентификатора сравнивается с 16 приемными фильтрами определенными пользователем. Каждый принятый стандартный фрейм данных состоит из 11-битного стандартного идентификатора (SID), и каждый расширенный кадр данных состоит из 11-битного стандартного идентификатора и 18-битного расширенного идентификатора. Если все биты принятого идентификатора полностью одинаковы с соответствующими битами любого из приемных фильтров, ECAN модуль генерирует передачу DMA  запроса в DMA контролер, таким образом сообщение может быть принято в назначенный буфер в DMA RAM.

Рисунок 10. Приём сообщения и фильтрация

7.1.1 Приемный фильтр

Рисунок 11 показывает как входящий идентификатор сообщения начинает сравниваться с фильтр/маской битами для стандартного кадра. Рисунок 12 показывает как входящий идентификатор сообщения начинает сравниваться с фильтр/маской битами для расширенного кадра.

Рисунок 11. Фильтрация при приёме стандартного фрейма

Рисунок 12. Фильтрация при приёме расширенного фрейма

Приемные фильтры 0-15 могут быть индивидуально включены или выключены используя биты включения фильтров (FLTENn) в ECAN регистре (CiFEN1). Значение “n” в регистре соответствует индексу приемного фильтра.

Приемные фильтры 0-15 определяют идентификаторы, которые должны содержаться в приемных сообщениях для их содержания в приемном буфере. Каждый из этих фильтров состоит из двух регистров = один для стандартных идентификаторов и другой для расширенных идентификаторов. Эти регистры обозначаются как: