Бегло просмотрел документацию на lpc11 и lpc15 - CAN в них похоже одинаковый.
На lpc11 у меня несколько серийных проектов.
Просмотрите в приложенных файлах инициализацию и работу с CAN.
Для работы я выбираю какие MSG OBJECT будут приёмные (RX), а какие передающие (TX)
CODE
//msg object для приёма сообщений
#define S6_BAM_CM_RX_MSG_OBJ 1
#define S6_BAM_DT_RX_MSG_OBJ 2
//msg object для отправки сообщений
#define S6_PASSPORT_TX_MSG_OBJ 10
#define S6_COUNTERS_TX_MSG_OBJ 11
#define S6_STATUS0_TX_MSG_OBJ 12
#define S6_STATUS1_TX_MSG_OBJ 13
#define S6_STATUS2_TX_MSG_OBJ 14
#define S6_STATUS3_TX_MSG_OBJ 15
#define S6_BAM_TX_MSG_OBJ 16
Настройка RX есть в приложенных файлах. При настройке определяется также маска фильтрации ACF-фильтра.
С TX работаем так:
CODE
//Передача сообщения 01 02 03 04 05 06 07 08 (01 -младший байт в сообщении, 08 - старший) на id 21 bit 0xabcd (extended frame)
stCANMSGObject msg;
msg.id = EXT_FRAME_TYPE | 0xabcd;
msg.dlc = 8; //длина данных (от 1 до 8)
msg.data[0] = 0x0201;
msg.data[1] = 0x0403;
msg.data[2] = 0x0605;
msg.data[3] = 0x0807;
CAN_Send(S6_PASSPORT_TX_MSG_OBJ, &msg);
Приём данных осуществляется в прерывании.
Любое принятое сообщение извлекается из RX MSG OBJECT и закидывается в FIFO. Далее уже в основной программе FIFO опрашивается в цикле до опустошения.
CODE
//проверяем rx fifo
stCANMSGObject can_rx_msg;
while(getMsgCAN(&can_rx_msg) != 0)
{
//выполняем проверку принятого сообщения
......
}