Перейти к содержанию
    

CAN для LPC23xx

Добрый день!

 

Хотел бы использовать аппаратный CAN у LPC2368. Возникнет также необходимость эскплуатировать его в одной сети с MCP2515. Но при изучении документации возникла непонятная ситуация с настройкой тайминга. В стандарте CAN и у MCP2515 в бите упоминается четыре сегмента - Synchronization Segment, Propagation Segment, Phase Segment 1, Phase Segment 2. В документации же к LPC23xx Propagation Segment отсутствует, что создает неоднозначность в тактировании. Как быть?

 

Заранее спасибо

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В стандарте 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Sync - он не настраивается и равен 1

а вот у LPC TSEG1 = Prop + Phase seg 1, TSEG2 = Phase Seg2

Т.е. у LPC Samling point находится Sync(=1) + TSEG1

Спасибо за ответ! После вдумчивого чтения документации (не только по LPC), чего-то подобного я и ожидал. Выделились :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выделились :)

Это не только у LPC такая настройка таймингов.

Кстати она логичнее - потому что настройка и phase1 и phase2 избыточна.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дабы не плодить темы ,напишу сюда. 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;   
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дабы не плодить темы ,напишу сюда. LPC2368 пытаюсь запусть прерывание на RX CAN2 не выходит, передаю пакет CAN1. Может нужно еще какие-то регистры установить?

У меня все заработало, завтра посмотрю и отпишу работающую конфигурацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У меня все заработало, завтра посмотрю и отпишу работающую конфигурацию.

Очень нужно, досих пор не разобрался. Уже накидал монитор регистров для правки на на этом же кристале .Кан1 передает пакет кан 2 принимает договариваясь между собой ,а вот прерывания от кан2 нет.Если просто смотреть регистры А и В то ошибок нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот такой процесс инициализации я использую, нашел в исходниках кайла, что-то менял, но что - не особо помню уже.

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 */

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо ,все дело было в инициализации фильтра, строка CAN2AFMR =0x00000002 исправила ситуацию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...