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

 
 
> Помогите разобраться с CANом в stm32
batisto4ka
сообщение May 7 2012, 08:13
Сообщение #1


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

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Помогите, опжалуйста, разобраться с CANом для stm32.

Постановка задачи следующая. Есть отладочная плата sk-mstm32f107 и самодельная плата на основе stm32f103vet. Роль первой платы - мастер, второй- слэйв. Пробую на основе исходников библиотеки StdPeriphLib написать программку, которая просто передаст хоть что-то на вторую платку. Не получается.
Согласно документации на отладочную плату на stm32f107:
CAN_TX1=GPIOD_1;
CAN_RX1=GPIOD_0;
Плата слэйва на stm32f103vet:
CAN_TX=GPIOA_12;
CAN_RX=GPIOA_11;
Прилагаю файлы 2 проектов с настройками CANов. Подскажите, что я не так делаю и почему не срабатывает прерывание у слэйва по получению данных.
P.S.(edited)
Внесла исправления. Добавила в функцию Init_GPIO_CAN проекта для мастера stm32f107 ремап:
Код
GPIO_PinRemapConfig(GPIO_Remap2_CAN1, ENABLE);

Но все равно прерывания по получению не срабатывают.

Сообщение отредактировал batisto4ka - May 7 2012, 10:30
Прикрепленные файлы
Прикрепленный файл  CAN_Testing.rar ( 49.4 килобайт ) Кол-во скачиваний: 65
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
lead_seller
сообщение May 7 2012, 11:55
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 27-10-08
Пользователь №: 41 225



1. Неплохо было бы увидеть принципиальные схемы обоих схемы.

2. Скорости большие - проверьте дальность проводов, и наличие терминирующих резисторов (ну или просто уменьшите скорости)

3. Запустите отправку пакета и посмотрите состояние CAN. Вас должен интересовать регистр ESR, а в нем поле LEC - в нем содержится код последней ошибки. Узнаете на чем конкретно валится передача от Мастера.

4. Гляньте осцилографом (а лучше лог.анализатором, у того же USBee есть расшифровка CAN), чего вообще творится на шине.

5. Банальное. Посмотрите на полярность проводов (CAN полярен) и одинаковые ли у вас микросхемы физического уровня.
Go to the top of the page
 
+Quote Post
batisto4ka
сообщение May 7 2012, 12:44
Сообщение #3


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

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Вопрос решен. Связь между платами утановлена. Проблемма была в перемычке на бутлоадер на отладочной плате мастера. По-этому, когда отключала программатор, плата после перезагрузки уходила в бут, а не на загрузку основной программы. Но осталась проблемма с платой приемника. Что-то мне кажется, не правильно настроены либо описаны прерывания у меня для stm32f103.Перифэралс Кан ресивер в Кейле при отладке показывает, что принят тот пакет, который отпрвлен мастером, НО прерывания не срабатывают.
Более того, прогрмма заходит на строчку 324 файла startup_stm32f10x_hd.s.
CODE
/*=========================================================================*/
void NVIC_CAN_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel=USB_LP_CAN1_RX0_IRQn;//|USB_HP_CAN1_TX_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*==============================================================================*/
void USB_HP_CAN1_TX_IRQHandler (void)
{
if (CAN_GetITStatus(CAN1,CAN_IT_TME))
{ // request completed mbx 0
CAN_ClearITPendingBit(CAN1,CAN_IT_TME);
CAN_TxRdy++;
}
}
/*========================================================================*/
void USB_LP_CAN1_RX_IRQHandler (void)
{
if (CAN_GetITStatus(CAN1,CAN_IT_FMP0))
{ // message pending ?
CAN_Receive(CAN1,0,&RxMessage); // read the message
CAN_RxRdy++; // set receive flag
}
}
/*===========================================================================*/
int main (void)
{
__disable_irq ();
Init_CLK();
NVIC_CAN_Configuration();
Init_GPIO_CAN();
Init_CAN();

CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE);
CAN_ITConfig(CAN1, CAN_IT_FF0, ENABLE);
CAN_ITConfig(CAN1, CAN_IT_FOV0, ENABLE);
__enable_irq ();
while (1)
{
}
}


Сообщение отредактировал IgorKossak - May 10 2012, 07:03
Причина редактирования: [codebox]
Go to the top of the page
 
+Quote Post
batisto4ka
сообщение May 10 2012, 06:08
Сообщение #4


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

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Банальная невнимательность
void USB_LP_CAN1_RX0_IRQHandler (void)

Сообщение отредактировал batisto4ka - May 10 2012, 06:09
Go to the top of the page
 
+Quote Post
batisto4ka
сообщение May 10 2012, 12:35
Сообщение #5


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

Группа: Участник
Сообщений: 89
Регистрация: 3-01-11
Пользователь №: 61 997



Подскажите, пожалуйста кто знает по фильтрам в CAN.

Можно ли с помощью фильтров, отсечь определенный диапазон ID.
1.Допустим устройство поддерживает ID от 0 до 125. Можно ли как то настроить фильтры, чтобы устройство принимало только сообщения с идентификаторами от 0 до 125? Как это реализовать?
2.Можно ли настроить фильтры так, чтобы они принимали только определенные номера ID (не по порядку штук 1000 разных ID)?Если можно, то как это сделать?
Go to the top of the page
 
+Quote Post
vptr
сообщение May 11 2012, 09:18
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 26
Регистрация: 15-11-07
Пользователь №: 32 363



Цитата(batisto4ka @ May 10 2012, 15:35) *
Подскажите, пожалуйста кто знает по фильтрам в CAN.

Можно ли с помощью фильтров, отсечь определенный диапазон ID.
1.Допустим устройство поддерживает ID от 0 до 125. Можно ли как то настроить фильтры, чтобы устройство принимало только сообщения с идентификаторами от 0 до 125? Как это реализовать?
2.Можно ли настроить фильтры так, чтобы они принимали только определенные номера ID (не по порядку штук 1000 разных ID)?Если можно, то как это сделать?

Для STM32F4xx включается режим Mask mode и настраивается mask register, в котором необходимо указать биты идентификатора сообщения, участвующие в сравнении при получении сообщения по CAN. Т.о. например, настраиваем в mask register младших пять бит как “don’t care” и в результате все сообщения у которых совпадут старшие биты, (младшие пять бит могут быть любыми) - будут приняты. Получаем 32 сообщения принимаемых через один фильтр.
Go to the top of the page
 
+Quote Post
Danis
сообщение May 19 2012, 20:01
Сообщение #7


Twilight Zone
***

Группа: Свой
Сообщений: 454
Регистрация: 17-02-09
Из: Челябинск
Пользователь №: 44 990



Здравствуйте, коллеги!

На STM32F2 возникли затруднения с CAN.
Для начала решил поработать в режиме Loop back mode. В этом режиме
все корректно работает, прочитанное сообщение идентично исходящему.
Меняю строчку
CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
На
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;
Соединяю пины CAN_Rx и CAN_Tx (ня всякий случай через 100 Ом) для получения внешней Loop back . Скорость выставляю 125kBps. Так не работает. Вообще по CAN для STM32F2 мало информации и примеров, искал Demo софт для отладочных плат STM32F2XX c примером для CAN, так все пока безрезультатно.

В примера IAR для STM32F2XX порты инициализируются так:
Код
#define CAN_GPIO_PORT             GPIOD
#define CAN_RX_SOURCE           GPIO_PinSource0
#define CAN_TX_SOURCE           GPIO_PinSource1
#define CAN_AF_PORT           GPIO_AF_CAN1      
#define CAN_RX_PIN           GPIO_Pin_5
#define CAN_TX_PIN           GPIO_Pin_13



  /* Connect CAN pins to AF9 */
  GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_RX_SOURCE, CAN_AF_PORT);
  GPIO_PinAFConfig(CAN_GPIO_PORT, CAN_TX_SOURCE, CAN_AF_PORT);
  
  /* Configure CAN RX and TX pins */
  GPIO_InitStructure.GPIO_Pin = CAN_RX_PIN | CAN_TX_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_UP;
  GPIO_Init(CAN_GPIO_PORT, &GPIO_InitStructure);


Т.е. и Rx и Tx как GPIO_Mode_AF. В примерах выше CAN_TX идет как GPIO_Mode_AF, CAN_RX - вход(GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // ).
Как правильно?

Если не сложно, прошу выложить куски рабочего кода инициализации и т.п. Ну, еще у меня CAN2 используется, может в нем какая-нибудь особенность есть....


--------------------
Magic Friend
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- batisto4ka   Помогите разобраться с CANом в stm32   May 7 2012, 08:13
- - aba   Стандартной библиотекой не пользовался, сказать пр...   May 7 2012, 09:47
|- - batisto4ka   Цитата(aba @ May 7 2012, 13:47) Стандартн...   May 7 2012, 11:06
|- - PoReX   Да, кстати, если используется CAN2, то эти дефайны...   May 28 2012, 07:08
|- - Danis   Цитата(PoReX @ May 28 2012, 10:08) Да, кс...   May 28 2012, 07:51
|- - PoReX   Цитата(Danis @ May 28 2012, 11:51) Пример...   May 28 2012, 08:09
- - aba   это моя инициализация CANа, правда для STM32F2xx ...   May 7 2012, 11:56
- - lead_seller   CODE void CAN_Initialization (uint16_t speed) { ...   May 7 2012, 12:16
- - PoReX   Цитата(Danis @ May 20 2012, 00:01) Соедин...   May 28 2012, 05:38
- - Danis   Цитата(PoReX @ May 28 2012, 08:38) Для на...   May 28 2012, 06:21


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

 


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


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