/* Записываем сообщение в буфер 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
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.