|
stm32f107vct непонятки с CAN, в loopback CAN1 работает а CAN2 нет |
|
|
|
Feb 5 2010, 23:43
|

бессмертным стать можно тремя способами
    
Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912

|
Сабж в заголовке . пробую запустить сразу два CAN сначала решил по одиночке запустить в режиме loopback - генерацию прерываний. написано по образу примера из фирменной библиотеки. функции инициализации и отправки пакета идентичны , принимают параметр CAN1 или CAN2. CAN2 не генерит прерываний и не принимает пакет. передачик говорит что все передано CAN_TransmitStatus(CANx, TransmitMailbox) возвращает CANTXOK. Приемник CAN2 тупо ниче нихочет делать  че делать? после просмотра подиаганаоли даташита терзают смутные сомнения что CAN1 и CAN2 "две большие разницы" .... вод код инициализации модулей, мутотень с GPIO вырезал Код void can_init(CAN_TypeDef* CANx) { // активация модуля CAN1 //RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); if (CANx==CAN1) RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN1,ENABLE); else RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2,ENABLE);
NVIC_InitTypeDef NVIC_InitStructure; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
// установка канала CANx_RX0_IRQn контроллера прервыаний NVIC if (CANx==CAN1) NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; else NVIC_InitStructure.NVIC_IRQChannel = CAN2_RX0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
// сброс регистров модуля CAN CAN_DeInit(CANx);
CAN_InitTypeDef CAN_InitStructure; CAN_StructInit(&CAN_InitStructure); // инициалищация модуля CAN 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_Mode = CAN_Mode_LoopBack; 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 = 4;//2 CAN_Init(CANx, &CAN_InitStructure);
// инициализация фильтра CAN CAN_FilterInitTypeDef CAN_FilterInitStructure; CAN_FilterInitStructure.CAN_FilterNumber=0; CAN_FilterInitStructure.CAN_FilterMode=CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale=CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh=0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdLow=0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment=0; CAN_FilterInitStructure.CAN_FilterActivation=ENABLE; CAN_FilterInit(&CAN_FilterInitStructure);
// разрешение прерыания по приему сообщения в FIFO #0 модуля CAN1 CAN_ITConfig(CANx, CAN_IT_FMP0 , ENABLE);
} //--------------------------------------------------------------------------------------- uint32_t can_tx(CAN_TypeDef* CANx , uint8_t* data , uint32_t size) { CanTxMsg TxMessage; uint8_t TransmitMailbox = 0;
//подготовка пакета для передачи TxMessage.StdId = 0x321; TxMessage.ExtId = 0x01; TxMessage.RTR = CAN_RTR_DATA; TxMessage.IDE = CAN_ID_STD; TxMessage.DLC = 1; TxMessage.Data[0] = 0x55;
// передача пакета TransmitMailbox=CAN_Transmit(CANx, &TxMessage); uint32_t i = 0xffff; // таймер таймаута по завершении передачи while((CAN_TransmitStatus(CANx, TransmitMailbox) != CANTXOK) && i ) { i--; } if ( !i ) return 0xFFFFFFFF; return size; } //-------------------------------------------------------------------------- void CAN1_RX0_IRQHandler(void) { while(1); // ловим прерывания под отладчиком } void CAN2_RX0_IRQHandler(void) { while(1); // ловим прерывания под отладчиком } для теста вызываются can_init(CAN1); tmp = can_tx( CAN1 , NULL , 32) ; программа зацикливается в обработчике прерывания CAN1_RX0_IRQHandler can_init(CAN2); tmp = can_tx( CAN2 , NULL , 32) ; программа не циклится  чек делать кроме чтения даташита который уже читаю?
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 18)
|
Feb 25 2010, 20:40
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(klen @ Feb 25 2010, 23:35)  просба счастливых обладателей этих демобордов поделится кодом. Ну я "счастливый":-) Только нет там кода. Практически нет. Все демки в бинарном виде... Я поэтому до сих пор безуспешно ищу пример работы с USB-хостом  Всё, что было в комплекте, качается вот отсюда: http://www.st.com/mcu/familiesdocs-110.htmlSTM3210C-EVAL demonstration firmware: zip, pdf. ЗЫ. Это всё про STM3210C-EVAL, насчёт кейла не знаю.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Mar 1 2010, 12:21
|

Частый гость
 
Группа: Свой
Сообщений: 135
Регистрация: 6-04-07
Из: Бронницы
Пользователь №: 26 809

|
Цитата(klen @ Mar 1 2010, 02:33)  а не поделитесь куском кода где делается чтоб они оба работали? разницы между 105 и 107 не должно быть. я выше то и говорил - гдето я туплю или в библиотеке ошибка и я ее немогу найти. Скорее всего глупость гдето моя.
про крышку гроба - ну очень нравится стиль документации у NXP и также сильно ненравится у ST. на мой взгляд подход NXP - дока отвечает почему именно так нада далать, а у ST -тупо делай так, вот тебе еще либа, тоже без описания и нелезь внутрь. я не могу поделиться куском ибо сейчас не на работе , а Вам как я понял нужно срочно , однако могу показать где у Вас "глюка закралася". Уважаемый AlexandrY абсолютно верно вам показал на бит 13:8 CAN2SB[5:0]: CAN2 start bank в регистре CAN_FMR , в эти биты грузится номер стартового фильтра для второго CAN-а после ресета там согластно доке - 1110b то бишь 14 , (по братски фильтры делят). а Вы инитите 0й фильтр, проинитьте 14й в случае второго CAN- а или используйте процедуру из либы void CAN_SlaveStartBank(uint8_t CAN_BankNumber); // у меня версия либы V3.1.2 с параметром ноль , хотя это нелогично С уважением Илья.
--------------------
если еррата пуста - это не хорошо а плохо
|
|
|
|
|
Aug 5 2011, 15:39
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

|
Добрый всем вечер!
Я пробую запустить CAN на STM32-discovery (заменил камень только на 105й)
Собрал пакет из библиотеки STM32F10x_stdPeriph_Lib ( там есть примеры с 2мя канами и с одним LoopBack)
В обоих случаях в дебагере я не вижу прерывания по приему(просто оно не компилируется)
Не могу понять почему...
Пробовал в 100% рабочий проект из боарда воткнуть библиотеку, тоже компилируется, дисплей, светодиоды, кнопки - все работает а CAN передавать - передает, а на приеме нет прерывания ... куда копать? (проект я могу весь выложить или частями) P.S Iar ARM 6.20
|
|
|
|
|
Aug 6 2011, 09:45
|
Группа: Участник
Сообщений: 11
Регистрация: 16-05-08
Пользователь №: 37 560

|
Цитата(Pavlike @ Aug 5 2011, 14:39)  Добрый всем вечер!
Я пробую запустить CAN на STM32-discovery (заменил камень только на 105й)
Собрал пакет из библиотеки STM32F10x_stdPeriph_Lib ( там есть примеры с 2мя канами и с одним LoopBack)
В обоих случаях в дебагере я не вижу прерывания по приему(просто оно не компилируется)
Не могу понять почему...
Пробовал в 100% рабочий проект из боарда воткнуть библиотеку, тоже компилируется, дисплей, светодиоды, кнопки - все работает а CAN передавать - передает, а на приеме нет прерывания ... куда копать? (проект я могу весь выложить или частями) P.S Iar ARM 6.20 ================== РЕШЕНО!!!====================== В разделе EWARMv5 содержался файл startup_STM32F10x_MD_VL.s, заменил его на коннект лайн для 32F105 startup_STM32F10x_CL.s и все ОК!
|
|
|
|
|
Feb 1 2013, 09:27
|
Группа: Новичок
Сообщений: 3
Регистрация: 24-07-12
Пользователь №: 72 885

|
Цитата(klen @ Mar 1 2010, 18:14)  дело было не бобине.... а в фильтрах  все работает. вот обозначат тему, попросят помочь... кто-то время уделит, подскажет, поможет... вопрос разрешиться...А решение рассказать другим?! Дык нет ведь - надо написать что "всё работает" и всё. Эгоистично как-то ((( Придется дальше время поубивать на поиски решения. AlexandrY и cebotor - спасибо за подсказку
|
|
|
|
|
Feb 3 2013, 09:06
|
Группа: Новичок
Сообщений: 3
Регистрация: 24-07-12
Пользователь №: 72 885

|
Цитата(igler_u @ Feb 1 2013, 14:27)  Придется дальше время поубивать на поиски решения. заработало и у меня Изначальная проблема была - запустить CAN2 (на stm32f105rc/vc), который при настройках, аналогичных CAN1, работать отказывался... При экспериментах выяснилось, что CAN2 работает только на отправку. Принять на него что-либо не получается, при этом передающая сторона докладывает, что всё отправлено, все OK. Для решения проблемы необходимо произвести дополнительные настройки: - первым делом при настройке второго CAN нужно затактировать CAN1! - далее (как говорилось ранее/выше) нужно настроить фильтры под второй CAN: в структуре инициализации параметр CAN_FilterNumber для CAN2 должен иметь номер с 14 по 27. альтернативно - использовать функцию CAN_SlaveStartBank(номер нужного фильтра), которая изменяет номер начального фильтр для CAN2. Регистры фильтров у CAN1 и CAN2 общие, и настраиваются они в CAN1 (для этого он должен быть затактирован). При этом в окне регистров CAN2 (в Keil) флаг FINIT - режим инициализации фильтров, в котором приём не активен! - будет находится в установленном состоянии (то есть что-то не то показыавется). Видимо, так как настройки фильтров общие, смотреть их для CAN2 нужно в настройках для CAN1.
|
|
|
|
|
Jul 3 2013, 09:06
|
Группа: Новичок
Сообщений: 2
Регистрация: 3-07-13
Пользователь №: 77 367

|
Цитата(igler_u @ Feb 3 2013, 13:06)  заработало и у меня Изначальная проблема была - запустить CAN2 (на stm32f105rc/vc), который при настройках, аналогичных CAN1, работать отказывался... При экспериментах выяснилось, что CAN2 работает только на отправку. Принять на него что-либо не получается, при этом передающая сторона докладывает, что всё отправлено, все OK. Для решения проблемы необходимо произвести дополнительные настройки: - первым делом при настройке второго CAN нужно затактировать CAN1! - далее (как говорилось ранее/выше) нужно настроить фильтры под второй CAN: в структуре инициализации параметр CAN_FilterNumber для CAN2 должен иметь номер с 14 по 27. альтернативно - использовать функцию CAN_SlaveStartBank(номер нужного фильтра), которая изменяет номер начального фильтр для CAN2.
Регистры фильтров у CAN1 и CAN2 общие, и настраиваются они в CAN1 (для этого он должен быть затактирован). При этом в окне регистров CAN2 (в Keil) флаг FINIT - режим инициализации фильтров, в котором приём не активен! - будет находится в установленном состоянии (то есть что-то не то показыавется). Видимо, так как настройки фильтров общие, смотреть их для CAN2 нужно в настройках для CAN1. Таже проблема  Не могу настроить оба CANа. Камень STM32F105RC. Из CAN1 данные отправляются и даже поступают на вход CAN2 (В регистре CAN_RF0R значнеие FMP0 становится 0х01), но если пытаюсь послать это же сообщение еще раз, то программа зависает  ((((((((( Вы можете привести листинг где вы сконфигурировали фильтры?
|
|
|
|
|
Jul 3 2013, 10:24
|
Группа: Новичок
Сообщений: 2
Регистрация: 3-07-13
Пользователь №: 77 367

|
Цитата(AlexanderB @ Jul 3 2013, 13:06)  Таже проблема  Не могу настроить оба CANа. Камень STM32F105RC. Из CAN1 данные отправляются и даже поступают на вход CAN2 (В регистре CAN_RF0R значнеие FMP0 становится 0х01), но если пытаюсь послать это же сообщение еще раз, то программа зависает  ((((((((( Вы можете привести листинг где вы сконфигурировали фильтры? Все заработало!!!!!!!!!!!! Всем спасибо. Был прецеплен startup_HD вместо нужного startup_CL
|
|
|
|
|
Jul 12 2013, 06:58
|
Группа: Новичок
Сообщений: 1
Регистрация: 12-07-13
Пользователь №: 77 498

|
Привет всем! Камень STM32F407 Пытаюсь настроить прием по CAN . Порты PD0 и PD1 (can1 RX , can1 TX) светодиод PB9 (плата от ТЕРРАЭЛЕКТРОНИКИ TE-stm32fx07) передачу настроил, работает нормально а вот прием никак... Может кто подскажет где собака порылась CODE #include "stm32f4xx.h" #include "stm32f4xx_rcc.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_can.h" #include "misc.h" #include "system_stm32f4xx.h"
#define USE_CAN1 /* #define USE_CAN2 */
#ifdef USE_CAN1 #define CANx CAN1 #else /* USE_CAN1 */ #define CANx CAN1 #endif /* USE_CAN1*/
void NVIC_Config(); void Rxmsg ();
void main() { SystemInit(); CAN_InitTypeDef CAN_InitStructure; CAN_FilterInitTypeDef CAN_FilterInitStructure; GPIO_InitTypeDef GPIO_InitStructure;
// Enable GPIO clock RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE); RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); // Configure CAN1 as alternate function GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_Init(GPIOD, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init(GPIOB, &GPIO_InitStructure);
// Connect PXx to CAN 1 2
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_CAN1); //CAN_RX = PD0 GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_CAN1); //CAN_TX = PD1
// init CAN1 RCC_APB1PeriphClockCmd (RCC_APB1Periph_CAN1, ENABLE);
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_Prescaler = 16;// 125kbs CAN_InitStructure.CAN_Mode = CAN_Mode_Normal;//LoopBack CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; CAN_InitStructure.CAN_BS1 = CAN_BS1_14tq; CAN_InitStructure.CAN_BS2 = CAN_BS2_6tq;
CAN_DeInit(CAN1); CAN_Init(CAN1, &CAN_InitStructure);
// IT Configuration for CAN1 FIFO 0 message received interrupt CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); // IT Configuration for CAN1 FIFO 1 message received interrupt CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);
/* CAN filter init */ #ifdef USE_CAN1 CAN_FilterInitStructure.CAN_FilterNumber = 0; #else /* USE_CAN1 */ CAN_FilterInitStructure.CAN_FilterNumber = 0; #endif /* USE_CAN1 */ CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; CAN_FilterInitStructure.CAN_FilterIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0xFFFF; CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000; CAN_FilterInitStructure.CAN_FilterFIFOAssignment =CAN_FIFO0;
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; CAN_FilterInit(&CAN_FilterInitStructure);
uint8_t TransmitMailbox = 0; CanTxMsg TxMessage; CanRxMsg RxMessage; uint32_t i = 0;
void NVIC_Config() { NVIC_InitTypeDef NVIC_InitStructure;
/* Enable CANx RX0 interrupt IRQ channel */ #ifdef USE_CAN1 NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; #else /* USE_CAN1 */ NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn; #endif /* USE_CAN1 */
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); }
void Rxmsg() { 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] = 0; } CAN_Receive(CAN1, CAN_FIFO0, &RxMessage);
}
while(1){ CSsendmsg (),Rxmsg(); if (RxMessage.Data[0]== 0x01) GPIOB->BSRRL = GPIO_Pin_9; int time = 3000000; while(time>1){time--;} time = 3000000; while(time>1){time--;} GPIOB->BSRRH = GPIO_Pin_9;
}}
Сообщение отредактировал IgorKossak - Jul 12 2013, 13:02
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|