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

 
 
> stm32f107vct непонятки с CAN, ч.2
kulpanov
сообщение Mar 12 2011, 15:44
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 6-01-11
Пользователь №: 62 053



Всем привет, проблема с CAN, кто сталкивался с проблемой подскажите.
Модуль Barracuda на stm32f107vc от TerraElectronica.
Среда Eclipse(gcc)+jLink. Пытаюсь запустить CAN.
Скажу сразу для МК без ОС делаю, что то впервые.
Поначалу всё шло успешно, код дернутый с их примера Web-сервера
успешно передавал данные из порта в порт: CAN1->CAN2, CAN2->CAN1.
Но вот дальше данные идтить отказываются!
Поясню: подключаю IXXAT usb-to-can, ноль эмоций. Т.е. порты друг другу данные шлют ixxat их не видит.
Сам ixxat данные послать не может.
Со скоростью CAN разобрался, помогли примеры из IAR, кстати примеры из IAR также успешно пересылают данные и ixxat также их не видит.
Если эту железку воткнуть в рабочую CAN сеть - вся сеть начинает глючить.
Сам ixxat рабочий, пакеты от CAN-приводов и иных контроллеров ловит/передаёт изумительно. От barracuda отказывается.
В terre ничего вразумительного не говорят.
Сам не электронщик, и очень не хочется думать, что дело в проводах. Но если это так. подскажите как terru [CENSORED] схватить.
Я думаю что примеры кода у всех одни и те-же, я их практически не правил, но если надо выложу.

Собственно help me!

Сообщение отредактировал IgorKossak - Mar 12 2011, 16:02
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
SasaVitebsk
сообщение Mar 14 2011, 21:15
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



Надёргал из проекта.
Писал на скорую руку - использовал библиотеки stm. Собственно там и ч/з регистры ничего сложного нет. Когда работал - там всё понятно было.
И фильтра там красиво сделаны.

CODE

#define OSC 8000000L // Частота кварца
#define CCLK (OSC*9) // Частота ядра контроллера
#define PCLK (CCLK/2) // Частота переферии

...
void RCC_Configuration(void)
{

/* GPIO clock enable */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |
RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOB |
RCC_APB2Periph_GPIOC |
RCC_APB2Periph_GPIOD |
RCC_APB2Periph_GPIOE, ENABLE);

/* CAN1 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE);
/* CAN2 Periph clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);

/* TIM2 clock enable */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/* ADCCLK = PCLK2/8 */
RCC_ADCCLKConfig(RCC_PCLK2_Div8);

/* Enable ADC1 and GPIOC clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);

/* Enable DMA1 clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);

}


void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;

/* Configure CAN1 pin: RX */
GPIO_InitStructure.GPIO_Pin = CAN1_GPIO_Pin_RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(CAN1_GPIO, &GPIO_InitStructure);

/* Configure CAN1 pin: TX */
GPIO_InitStructure.GPIO_Pin = CAN1_GPIO_Pin_TX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(CAN1_GPIO, &GPIO_InitStructure);

/* Configure CAN2 pin: RX */
GPIO_InitStructure.GPIO_Pin = CAN2_GPIO_Pin_RX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(CAN2_GPIO, &GPIO_InitStructure);

/* Configure CAN2 pin: TX */
GPIO_InitStructure.GPIO_Pin = CAN2_GPIO_Pin_TX;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(CAN2_GPIO, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
GPIO_Init(GPIOA, &GPIO_InitStructure);

}

...
NVIC_InitStructure.NVIC_IRQChannel = USB_LP_CAN1_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
....

void CAN_Config(void)
{
/* CAN register init */
CAN_DeInit(CAN1);
CAN_StructInit(&CAN_InitStructure);

/* CAN cell init */
CAN_InitStructure.CAN_TTCM = DISABLE;
CAN_InitStructure.CAN_ABOM = DISABLE;
CAN_InitStructure.CAN_AWUM = DISABLE;
CAN_InitStructure.CAN_NART = DISABLE;
CAN_InitStructure.CAN_RFLM = DISABLE;
CAN_InitStructure.CAN_TXFP = DISABLE;
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq;
CAN_InitStructure.CAN_Prescaler = 16; // 250 кбит
CAN_Init(CAN1, &CAN_InitStructure);

/* CAN filter 0 init */
CAN_FilterInitStructure.CAN_FilterNumber=0;
CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask;
CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit;
CAN_FilterInitStructure.CAN_FilterIdHigh= (PCAN_ID_PC1>>13) & 0xffff;
CAN_FilterInitStructure.CAN_FilterIdLow= (PCAN_ID_PC1<<3) & 0xffff;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0780;
CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0;
CAN_FilterInitStructure.CAN_FilterActivation=ENABLE;
CAN_FilterInit(&CAN_FilterInitStructure);

/* transmit */
TxMessage.StdId = 0;
TxMessage.ExtId = 0;
TxMessage.RTR = CAN_RTR_DATA;
TxMessage.IDE = CAN_ID_STD;
TxMessage.DLC = 1;

}


void Init_RxMes(CanRxMsg *RxMessage)
{
uint8_t i = 0;

RxMessage->StdId = 0x00;
RxMessage->ExtId = 0x00;
RxMessage->IDE = CAN_ID_STD;
RxMessage->DLC = 0;
RxMessage->FMI = 0;
for (i = 0;i < 8;i++)
RxMessage->Data[i] = 0x00;
}


Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:54
Рейтинг@Mail.ru


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