Polaris 0 28 декабря, 2009 Опубликовано 28 декабря, 2009 · Жалоба Добрый день! Хотел бы использовать аппаратный CAN у LPC2368. Возникнет также необходимость эскплуатировать его в одной сети с MCP2515. Но при изучении документации возникла непонятная ситуация с настройкой тайминга. В стандарте CAN и у MCP2515 в бите упоминается четыре сегмента - Synchronization Segment, Propagation Segment, Phase Segment 1, Phase Segment 2. В документации же к LPC23xx Propagation Segment отсутствует, что создает неоднозначность в тактировании. Как быть? Заранее спасибо Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 28 декабря, 2009 Опубликовано 28 декабря, 2009 · Жалоба В стандарте CAN и у MCP2515 в бите упоминается четыре сегмента - Synchronization Segment, Propagation Segment, Phase Segment 1, Phase Segment 2. В документации же к LPC23xx Propagation Segment отсутствует, что создает неоднозначность в тактировании. Как быть? Sync - он не настраивается и равен 1 а вот у LPC TSEG1 = Prop + Phase seg 1, TSEG2 = Phase Seg2 Т.е. у LPC Samling point находится Sync(=1) + TSEG1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Polaris 0 28 декабря, 2009 Опубликовано 28 декабря, 2009 · Жалоба Sync - он не настраивается и равен 1 а вот у LPC TSEG1 = Prop + Phase seg 1, TSEG2 = Phase Seg2 Т.е. у LPC Samling point находится Sync(=1) + TSEG1 Спасибо за ответ! После вдумчивого чтения документации (не только по LPC), чего-то подобного я и ожидал. Выделились :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 0 29 декабря, 2009 Опубликовано 29 декабря, 2009 · Жалоба Выделились :) Это не только у LPC такая настройка таймингов. Кстати она логичнее - потому что настройка и phase1 и phase2 избыточна. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yarunt 0 7 января, 2010 Опубликовано 7 января, 2010 · Жалоба Дабы не плодить темы ,напишу сюда. LPC2368 пытаюсь запусть прерывание на RX CAN2 не выходит, передаю пакет CAN1. Может нужно еще какие-то регистры установить? void CAN_Init( DWORD can_btr ) { CAN1RxDone = CAN2RxDone = FALSE; PCONP |= (1 << 13) | (1 << 14); // Enable clock to the peripheral PINSEL0 &= ~0x00000F0F; PINSEL0 |= 0x0000A05; // port0.0~1, function 0x01, port0.4~5, function 0x10 CAN1MOD = CAN2MOD = 1; // Reset CAN CAN1IER = CAN2IER = 0; // Disable Receive Interrupt CAN1GSR = CAN2GSR = 0; // Reset error counter when CANxMOD is in reset CAN1BTR = CAN2BTR = can_btr; CAN1MOD = CAN2MOD = 0; // CAN in normal operation mode CAN_AFMR = 0x00000001; CAN1IER =0; CAN2IER = 0x1; VICIntEnClr = 0xFFFFFFFF; // Disable all Ints VICVectAddr23 = (unsigned long)CAN_Handler; VICVectCntl23 = 1; VICIntEnable = 1 << 23; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Polaris 0 12 января, 2010 Опубликовано 12 января, 2010 · Жалоба Дабы не плодить темы ,напишу сюда. LPC2368 пытаюсь запусть прерывание на RX CAN2 не выходит, передаю пакет CAN1. Может нужно еще какие-то регистры установить? У меня все заработало, завтра посмотрю и отпишу работающую конфигурацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yarunt 0 13 января, 2010 Опубликовано 13 января, 2010 · Жалоба У меня все заработало, завтра посмотрю и отпишу работающую конфигурацию. Очень нужно, досих пор не разобрался. Уже накидал монитор регистров для правки на на этом же кристале .Кан1 передает пакет кан 2 принимает договариваясь между собой ,а вот прерывания от кан2 нет.Если просто смотреть регистры А и В то ошибок нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Polaris 0 14 января, 2010 Опубликовано 14 января, 2010 · Жалоба Вот такой процесс инициализации я использую, нашел в исходниках кайла, что-то менял, но что - не особо помню уже. void CAN_setup (uint32_t ctrl) { CAN_TypeDef *pCAN = (ctrl == 1) ? CAN1 : CAN2; /* select CAN controller */ if (ctrl == 1) { PCONP |= 1 << 13; /* Enable clock for CAN1 */ PINSEL0 &= 0xFFFFFFF0; /* Reset CAN1 bits */ PINSEL0 |= 0x00000005; /* Set CAN1 bits to b0101 */ *(&VICVectAddr23) = (unsigned long) CAN_ISR; /* Set interrupt vector for CAN */ *(&VICVectCntl23) = 1; VICIntEnable = (1 << 23); /* Enable CAN Interrupt */ } else { PCONP |= 1 << 14; /* Enable clock for CAN2 */ PINSEL0 &= 0xFFFFF0FF; /* Reset CAN2 bits */ PINSEL0 |= 0x00000A00; /* Set CAN2 bits to b1010 */ *(&VICVectAddr23) = (unsigned long) CAN_ISR; /* Set interrupt vector for CAN */ *(&VICVectCntl23) = 1; VICIntEnable = (1 << 23); /* Enable CAN Interrupt */ } CANAF->AFMR = 2; /* By default filter is not used */ pCAN->MOD = 1; /* Enter reset mode */ pCAN->IER = 0; /* Disable all interrupts */ pCAN->GSR = 0; /* Clear status register */ CAN_cfgBaudrate(ctrl, 250000); /* Set bit timing */ pCAN->IER = 0x0003; /* Enable Tx and Rx interrupt */ } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yarunt 0 20 января, 2010 Опубликовано 20 января, 2010 · Жалоба Спасибо ,все дело было в инициализации фильтра, строка CAN2AFMR =0x00000002 исправила ситуацию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться