|
|
  |
Настройка CAN и PLL, помогите подружить CAN и PLL |
|
|
|
Feb 11 2009, 12:29
|
Участник

Группа: Новичок
Сообщений: 64
Регистрация: 7-11-08
Пользователь №: 41 437

|
В данной теме хочу охватить сразу два вопроса: 1. Настройка CAN и PLL 2. Настройка прерывания по приему на CAN 1. Начал разбираться с CANом, настраиваю скорость CAN без PLL - все в прядке, включаю PLL - CAN не коректно работает. Посмотрите код может что-то я упустил. 2. Не могу настроить прерывания по приходу данных на CAN. CODE Собственно сам код
#include "LPC23xx.h" /* LPC23xx definitions */ #include <stdlib.h> #include "type.h" #include "irq.h"
#define PLL_MValue 11 #define PLL_NValue 0
typedef struct { DWORD Frame; // Bits 16..19: DLC - Data Length Counter // Bit 30: Set if this is a RTR message // Bit 31: Set if this is a 29-bit ID message DWORD MsgID; // CAN Message ID (11-bit or 29-bit) DWORD DataA; // CAN Message Data Bytes 0-3 DWORD DataB; // CAN Message Data Bytes 4-7 } CAN_MSG;
CAN_MSG MsgBuf_RX1;
unsigned long ReceiveDate1; unsigned long ReceiveDate2;
void ConfigurePLL ( void ) { unsigned long MValue, NValue;
if ( PLLSTAT & (1 << 25) ) { PLLCON = 1; /* Enable PLL, disconnected */ PLLFEED = 0xaa; PLLFEED = 0x55; }
PLLCON = 0; /* Disable PLL, disconnected */ PLLFEED = 0xaa; PLLFEED = 0x55; SCS |= 0x20; /* Enable main OSC */ while( !(SCS & 0x40) ); /* Wait until main OSC is usable */
CLKSRCSEL = 0x1; /* select main OSC, 12MHz, as the PLL clock source */
PLLCFG = PLL_MValue | (PLL_NValue << 16); PLLFEED = 0xaa; PLLFEED = 0x55; PLLCON = 1; /* Enable PLL, disconnected */ PLLFEED = 0xaa; PLLFEED = 0x55;
CCLKCFG = 3; /* Set clock divider */
while ( ((PLLSTAT & (1 << 26)) == 0) ); /* Check lock bit status */ MValue = PLLSTAT & 0x00007FFF; NValue = (PLLSTAT & 0x00FF0000) >> 16; while ((MValue != PLL_MValue) && ( NValue != PLL_NValue) );
PLLCON = 3; /* enable and connect */ PLLFEED = 0xaa; PLLFEED = 0x55; while ( ((PLLSTAT & (1 << 25)) == 0) ); /* Check connect bit status */ return; }
void CANRec(void) __irq { DWORD * pDest; // initialize destination pointer pDest = (DWORD *)&MsgBuf_RX1; *pDest = CAN1RFS; // Frame pDest++; *pDest = CAN1RID; // ID //change by gongjun pDest++; *pDest = CAN1RDA; // Data A pDest++; *pDest = CAN1RDB; // Data B
CAN1CMR = 0x04; // release receive buffer VICVectAddr = 0;
return; }
void InitCAN() { CAN1MOD = 1; // Reset CAN PINSEL0 &= ~(0xF<<0); PINSEL0 |= (0x5<<0); // enable PIN for CAN1 PCONP |= (1 << 13); CAN1IER = 0; // Disable Receive Interrupt //CAN1BTR = 0x0036002F; // PCLKSEL0 = (1<<26); CAN1BTR = 0x0015000C; CAN_AFMR = 2; CAN1IER = 0x00000001; VICVectPriority0 = 0x00000001; VICVectAddr0 = (unsigned)CANRec; VICIntEnable = (1<<23); CAN1MOD = 0; }
void SendCAN(unsigned long Date) { while (CAN1SR&0x00000004) { CAN1TFI1 = 0x00040000; CAN1TID1 = 0x00000001; CAN1TDA1 = Date; CAN1CMR = 1; } }
int main() { //ConfigurePLL(); InitCAN(); while (1) { if (MsgBuf_RX1.DataA == 0) SendCAN(0x55555555); else SendCAN(MsgBuf_RX1.DataA); for (long i=0; i<0x999999;i++);
}
}
Причина редактирования: Пользуйтесь тэгами для форматирования исходников
|
|
|
|
|
Feb 11 2009, 13:44
|
Участник

Группа: Новичок
Сообщений: 64
Регистрация: 7-11-08
Пользователь №: 41 437

|
Цитата(zltigo @ Feb 11 2009, 16:20)  Просто для самого начала возьмите примерчики от NXP. PLL - на худой конец посчитайте в экселовском пиложении от того-же NXP, а вычитывать и разбирать Ваше нагромождение всяких магических цифирей для инициализации PLL/CAN , думаю никто не станет  Хорошо, забыли про PLL(хотя я брал примеры и от NXP и др.,), но подскажите по поводу прерывания по КАН. или примерчиками рабочеми поделитесь
|
|
|
|
|
Feb 12 2009, 06:10
|
Участник

Группа: Новичок
Сообщений: 64
Регистрация: 7-11-08
Пользователь №: 41 437

|
У кого есть примерчики работы CAN не NXP-шные?
|
|
|
|
|
Feb 12 2009, 07:01
|
Частый гость
 
Группа: Участник
Сообщений: 104
Регистрация: 30-06-05
Из: С-Петербург
Пользователь №: 6 406

|
Цитата(Anatrulij @ Feb 12 2009, 12:10)  У кого есть примерчики работы CAN не NXP-шные? В архиве функции инициализации и настройки CAN контроллера, и функция обработки прерывания. Инициализация: can_init (&can0, 0, can0_handler); if (can_set_speed (&can0, 4)) {}; can_set_protocol (&can0, 0xFF, 0xF, 1000, 200, can_outbuf0, CAN0_OUTBUF_SIZE, can_inbuf0, CAN0_INBUF_SIZE); can0_handler - обработчик прерывания bittimе для CAN настраивается относительно рабочей частоты, если неправильно настраиваете PLL. То и CAN не работает.
Сообщение отредактировал Troll - Feb 12 2009, 07:02
Прикрепленные файлы
CAN.rar ( 4.38 килобайт )
Кол-во скачиваний: 36
--------------------
Hemos Pasado
|
|
|
|
|
Feb 12 2009, 07:42
|
Участник

Группа: Новичок
Сообщений: 64
Регистрация: 7-11-08
Пользователь №: 41 437

|
Цитата(Troll @ Feb 12 2009, 10:01)  В архиве функции инициализации и настройки CAN контроллера, и функция обработки прерывания.
Инициализация: can_init (&can0, 0, can0_handler); if (can_set_speed (&can0, 4)) {}; can_set_protocol (&can0, 0xFF, 0xF, 1000, 200, can_outbuf0, CAN0_OUTBUF_SIZE, can_inbuf0, CAN0_INBUF_SIZE);
can0_handler - обработчик прерывания
bittimе для CAN настраивается относительно рабочей частоты, если неправильно настраиваете PLL. То и CAN не работает. спасибо. Но мне хотелось бы код для LPC24xx
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|