Имеется микроконтроллер LPC2366 с двумя интерфейсами CAN. Пытаюсь с одного CAN-а (второго) отправить некое сообщение на первый. Инициализирую оба CAN-а:
//Предделитель частоты тактирования CAN
//0x00 cclk/4; 0x01 cclk/1; 0x02 cclk/2; 0x03 cclk/6;
PCLKSEL0 |= (0x02 << 26)|(0x02 << 28) | (2 << 30);
/* Power Up the CAN1 and CAN2 controller. */
PCONP |= (1 << 13)|(1 << 14);
// настройка пинов CAN1 и CAN2
PINSEL1 |= (0x03 << 10)|(0x03 << 12);
PINSEL4 |= (0x01 << 14)|(0x01 << 16);
//Сброс CAN1 контроллера
CAN1MOD = 0x00000001;
//Сброс CAN2 контроллера
CAN2MOD = 0x00000001;
//CAN1IER = CAN2IER = 0; // Disable Receive Interrupt
CAN1GSR = CAN2GSR = 0; // Reset error counter when CANxMOD is in reset
//Установка скорости передачи CAN1 контроллера 1 Мбит
CAN1BTR = (0x01)|(0x03 << 14)|(0x08 << 16)|(0x07 << 20); //clk = 32 MHz, brp = 2, tsec1 = 9, tsec2 = 8
//Установка скорости передачи CAN2 контроллера 1 Мбит
CAN2BTR = (0x01)|(0x03 << 14)|(0x08 << 16)|(0x07 << 20);
//CAN1BTR = CAN2BTR = 0x078C0001;
VICVECTPRIORITY23 = 0x00; //приоритет вектора
VICVECTADDR23 = (unsigned)irq_CAN12; //запись адреса обработчика прерывания
VICINTENABLE_bit.CAN12 = 1; //разрешение прерывания vic
CAN1IER = 0x00000001;
CAN2IER = 0x00000001; //разрешаем прерывание приема
//Запуск CAN1 контроллера
CAN1MOD = 0x00000000;
//Запуск CAN2 контроллера
CAN2MOD = 0x00000000;
Пытаюсь отправить сообщение:
if(CAN2SR_bit.TBS1 == 1)
{
CAN2TFI1_bit.DLC = 8; // Длина пакета - 8 байт
CAN2TID1 = 0x22; // Устанавливаю стандартный кадр, но на него сейчас пофигу, фильтрация все равно отключена и принимающий CAN только один.
CAN2TDA1 = 0xAA; //Само сообщение
CAN2CMR = 0x21; //Отправляю
}
В результате выскакивает ошибка stuff error. Подскажите, как диагностировать неполадку и куда копать? На осциллографе высвечивается просто прямоугольный сигнал.