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

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

/* CiTRBnSID = 0bxxx1 0010 0011 1100  = 0х123С

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

ecan1MsgBuf[0][0] = 0x123C;

/* CiTRBnEID = 0bxxxx 0000 0000 0000   

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

ecan1MsgBuf[0][1] = 0x0000;

/* CiTRBnDLC = 0b0000 0000 xxx0 1111 = 0х000F

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

ecan1MsgBuf[0][2] = 0x000F;

/* Записываем байты данных сообщения */

ecan1MsgBuf[0][3] = 0xabcd;

ecan1MsgBuf[0][4] = 0xabcd;

ecan1MsgBuf[0][5] = 0xabcd;

ecan1MsgBuf[0][6] = 0xabcd;

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

C1TR01CONbits.TXREQ0 = 0x1;

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

Пример 2. Программный код для отправки расширенного фрейма

/* Назначаем буфер сообщения 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 1101 =0х123D

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

ecan1MsgBuf[2][0] = 0x123D;

/* CiTRBnEID = 0bxxxx 1111 0000 0000

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

ecan1MsgBuf[2][1] = 0x0F00;

/* CiTRBnDLC = 0b0000 1100 xxx0 1111  = 0C0F

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

ecan1MsgBuf[2][2] = 0x0C0F;

/* Записываем байты данных сообщения */

ecan1MsgBuf[2][3] = 0xabcd;

ecan1MsgBuf[2][4] = 0xabcd;

ecan1MsgBuf[2][5] = 0xabcd;

ecan1MsgBuf[2][6] = 0xabcd;

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

C1TR23CONbits.TXREQ2 = 0x1;

6.2 Отмена передачи сообщений.

Установить бит Abort All Pending Transmissions ABAT регистра управления CiCTRL1<12> для запроса отмены передачи всех неотправленных сообщений. Отмена определенных сообщений может быть осуществлена путем сброса бита TXREQm (CiTRmnCON<3>) связанного с определенным буфером сообщений. В любом случае, передача отменится только если модуль ECAN не начал передачу сообщения на шину.

6.3 Удаленная передача запроса/ответа.

6.3.1 Удаленная передача запроса.

Узел, ожидая приема кадра данных со специфичным значением идентификатора может инициировать передачу необходимых данных другим узлом передав удаленный фрейм запроса. Удаленный фрейм запроса может быть стандартной или расширенной формы.

Удаленный фрейм запроса похож на кадр данных, с ниже перечисленными исключениями:

- RTR бит (RTR=1)

- нет поля данных (DLC=0)

Перед передачей удалённого запроса, пользователю необходимо выполнить следующие задачи:

- Сконфигурировать буфер сообщений для передачи и задать приоритеты буфера.

- Записать удаленный запрос в соответствующий буфер сообщений. Передающийся идентификатор должен быть идентичен идентификатору запрашиваемых для передачи данных.

- Установите бит запроса передачи для буфера инициирующего передачу удаленного запроса.

6.3.2. Удаленная передача ответа.

Узел работающий как источник ответа на удаленный запрос должен сконфигурировать полученный фильтр в соответствии с идентификатором удаленного запроса. Буферы сообщений  0-7 могут ответить на удаленный запрос поэтому Acceptance Filter Buffer Pointer FnBP будет указывать на один из 8 буферов сообщений. Биты TXENn и RTRENn в регистре управления CiTRmnCON должны быть установлены для ответа на удаленный запрос.

Это случается только когда указатель FnBP указывает на буфер сообщений сконфигурированный для передачи TXENn=1.

Рисунок 9 показывает обработку процесса удаленного запроса:

1.  ECAN узел 1 передает удаленный запрос передачи (используя буфер сообщений 1)

2.  ECAN узел 2 принимает запрос и отвечает отправкой фрейма данных (используя буфер сообщений 7)

3.  Фрейм данных принимается ECAN узлом 1