реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Настройка CAN и PLL, помогите подружить CAN и PLL
Anatrulij
сообщение Feb 11 2009, 12:29
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 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++);

}


}

Причина редактирования: Пользуйтесь тэгами для форматирования исходников
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 11 2009, 13:20
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Anatrulij @ Feb 11 2009, 15:29) *
В данной теме хочу охватить сразу два вопроса:



Просто для самого начала возьмите примерчики от NXP. PLL - на худой конец посчитайте в экселовском пиложении от того-же NXP, а вычитывать и разбирать Ваше нагромождение всяких магических цифирей для инициализации PLL/CAN , думаю никто не станет sad.gif


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Anatrulij
сообщение Feb 11 2009, 13:44
Сообщение #3


Участник
*

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



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


Хорошо, забыли про PLL(хотя я брал примеры и от NXP и др.,), но подскажите по поводу прерывания по КАН.

или примерчиками рабочеми поделитесь
Go to the top of the page
 
+Quote Post
zltigo
сообщение Feb 11 2009, 14:09
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Anatrulij @ Feb 11 2009, 16:44) *
или примерчиками рабочеми поделитесь


Примеры от NXP, хоть и примитивные, но РАБОЧИЕ.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Anatrulij
сообщение Feb 12 2009, 06:10
Сообщение #5


Участник
*

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



У кого есть примерчики работы CAN не NXP-шные?
Go to the top of the page
 
+Quote Post
Troll
сообщение Feb 12 2009, 07:01
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Anatrulij
сообщение Feb 12 2009, 07:42
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 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
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 19:02
Рейтинг@Mail.ru


Страница сгенерированна за 0.01441 секунд с 7
ELECTRONIX ©2004-2016