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

 
 
> Can в STM32F103RBT6
Elcarnado
сообщение Mar 6 2013, 09:24
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 27-02-13
Пользователь №: 75 819



Здравствуйте! Начал осваивать stm и интерфейс can, пытаюсь осуществить передачу по данному интерфейсу, но пока тщетно. Для инициализации использую стандартные API-функции в программе CooCox. Заметил такую вещь: регистр MCR, отвечающий за режимы работы Can-интерфейса, не изменяет своего значения: то есть код вида "CANx->MCR = CANx->MCR | 0x0001" никак не влияет на состояние регистра. Пробовал разобраться по примеру, приведенному в CooCox, но еще больше запутался rolleyes.gif В этом примере никак не инициализируется порт для CAN, не делается ремаппинг и AFIO и не используется регистр MCR (он нужен для переключения режимов Sleep->Normal->Initialisation).
Мой листинг настройки Can:
CODE
void Init_Can(void)
{
// Инициализация порта
RCC_APB2PeriphClockCmd(RCC_APB1Periph_CAN1, ENABLE); // включаем тактирование CAN1
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // включаем тактирование AFIO
GPIO_PinRemapConfig(GPIO_Remap1_CAN1,ENABLE); // Переносим Can1 на PB8, PB9
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // включаем тактирование порта B

// CAN RX pin PB.8 input push pull
GPIO_InitTypeDef INIT_GPIO_B; // Объявляем структуру для инициализации порта
GPIO_StructInit(&INIT_GPIO_B); // заполняем дефолтными значениями
INIT_GPIO_B.GPIO_Mode = GPIO_Mode_IPU; // Режим - вход Pull-up (см. RM0041 p.154)
INIT_GPIO_B.GPIO_Pin = GPIO_Pin_8; // Настраиваем пин 8 порта B
INIT_GPIO_B.GPIO_Speed = GPIO_Speed_10MHz; // Скорость изменения пина
GPIO_Init(GPIOC, &INIT_GPIO_B); // Загрузка структуры настройки

// CAN TX pin PB.9 Alternative function Push-pull
INIT_GPIO_B.GPIO_Mode = GPIO_Mode_AF_PP; // Режим - Alternative Push-pull
INIT_GPIO_B.GPIO_Pin = GPIO_Pin_9; // Настраиваем пин 9 порта B
INIT_GPIO_B.GPIO_Speed = GPIO_Speed_10MHz; // Скорость изменения пина
GPIO_Init(GPIOC, &INIT_GPIO_B); // Загрузка структуры настройки

//Переход в режим настройки CAN
uint8_t ini = CAN_OperatingModeRequest(CAN1, CAN_OperatingMode_Initialization);
CAN_InitTypeDef CAN1_InitStruct;
CAN_StructInit(&CAN1_InitStruct);
CAN1_InitStruct.CAN_BS1 = CAN_BS1_3tq;
CAN1_InitStruct.CAN_BS2 = CAN_BS2_2tq;
CAN1_InitStruct.CAN_Prescaler = 24; //250 kbit/s (Prescaler = 6*10^6 / Speed)
CAN_Init(CAN1, &CAN1_InitStruct);

// Переход в нормальный режим работы CAN
uint8_t normal = CAN_OperatingModeRequest(CAN1, CAN_OperatingMode_Normal);

Данный код никак не влияет на состояние CAN-интерфейса и он продолжает спокойно пребывать в режиме SLEEP.
Функция CAN_OperatingModeRequest() взята из файла stm32f10x_can.h.
Помогите, пожалуйста, разобраться.

Сообщение отредактировал IgorKossak - Mar 6 2013, 20:05
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Golikov A.
сообщение Mar 12 2013, 17:12
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



посмотрите в таблице прерываний
CAN1_RX1_IRQn
какую функцию вызывает.
так вы определитесь с функцией...

потом
void CAN1_RX1_IRQHandler(void) {...}
в зависимости от среды надо проверить иногда требуется обозначить что это функция прерывание. либо прагмой либо еще как... В проекте есть еще хоть какие -то прерывания? вы их так же вызываете?

Проверьте регистры КАН, там может быть глобальный флаг на разрешение-запрещение всех прерываний

Я бы проверил значение регистров после инициализации, и сравнил с тем что там должно быть по описанию. Библиотеки - это весело и здорово, но их тоже люди пишут, а читать описание как ими пользоваться у нас не в почете...
Go to the top of the page
 
+Quote Post
Elcarnado
сообщение Mar 13 2013, 07:59
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 27-02-13
Пользователь №: 75 819



Цитата(Golikov A. @ Mar 12 2013, 19:12) *
посмотрите в таблице прерываний
CAN1_RX1_IRQn
какую функцию вызывает.
так вы определитесь с функцией...

потом
void CAN1_RX1_IRQHandler(void) {...}
в зависимости от среды надо проверить иногда требуется обозначить что это функция прерывание. либо прагмой либо еще как... В проекте есть еще хоть какие -то прерывания? вы их так же вызываете?

Проверьте регистры КАН, там может быть глобальный флаг на разрешение-запрещение всех прерываний

Я бы проверил значение регистров после инициализации, и сравнил с тем что там должно быть по описанию. Библиотеки - это весело и здорово, но их тоже люди пишут, а читать описание как ими пользоваться у нас не в почете...


Спасибо за советы! Вопрос от новичка: а где посмотреть таблицу прерываний? Я нашел только список прерываний с номерами в файле stm32f10x.h:
CODE
ADC1_2_IRQn = 18, /*!< ADC1 and ADC2 global Interrupt */
USB_HP_CAN1_TX_IRQn = 19, /*!< USB Device High Priority or CAN1 TX Interrupts */
USB_LP_CAN1_RX0_IRQn = 20, /*!< USB Device Low Priority or CAN1 RX0 Interrupts */
CAN1_RX1_IRQn = 21, /*!< CAN1 RX1 Interrupt */
CAN1_SCE_IRQn = 22, /*!< CAN1 SCE Interrupt */
EXTI9_5_IRQn = 23, /*!< External Line[9:5] Interrupts */
TIM1_BRK_IRQn = 24, /*!< TIM1 Break Interrupt */
TIM1_UP_IRQn = 25, /*!< TIM1 Update Interrupt */
TIM1_TRG_COM_IRQn = 26, /*!< TIM1 Trigger and Commutation Interrupt */
TIM1_CC_IRQn = 27, /*!< TIM1 Capture Compare Interrupt */
TIM2_IRQn = 28, /*!< TIM2 global Interrupt */
TIM3_IRQn = 29, /*!< TIM3 global Interrupt */
TIM4_IRQn = 30, /*!< TIM4 global Interrupt */
I2C1_EV_IRQn = 31, /*!< I2C1 Event Interrupt */
I2C1_ER_IRQn = 32, /*!< I2C1 Error Interrupt */
I2C2_EV_IRQn = 33, /*!< I2C2 Event Interrupt */
I2C2_ER_IRQn = 34, /*!< I2C2 Error Interrupt */
SPI1_IRQn = 35, /*!< SPI1 global Interrupt */
SPI2_IRQn = 36, /*!< SPI2 global Interrupt */
USART1_IRQn = 37, /*!< USART1 global Interrupt */
USART2_IRQn = 38, /*!< USART2 global Interrupt */
USART3_IRQn = 39, /*!< USART3 global Interrupt */
EXTI15_10_IRQn = 40, /*!< External Line[15:10] Interrupts */
RTCAlarm_IRQn = 41, /*!< RTC Alarm through EXTI Line Interrupt */
USBWakeUp_IRQn = 42 /*!< USB Device WakeUp from suspend through EXTI Line Interrupt */

и список обработчиков прерываний в файле startup_stm32f10x_md.c:

CODE
void WEAK Reset_Handler(void);
void WEAK NMI_Handler(void);
void WEAK HardFault_Handler(void);
void WEAK MemManage_Handler(void);
void WEAK BusFault_Handler(void);
void WEAK UsageFault_Handler(void);
void WEAK SVC_Handler(void);
void WEAK DebugMon_Handler(void);
void WEAK PendSV_Handler(void);
void WEAK SysTick_Handler(void);
void WEAK WWDG_IRQHandler(void);
void WEAK PVD_IRQHandler(void);
void WEAK TAMPER_IRQHandler(void);
void WEAK RTC_IRQHandler(void);
void WEAK FLASH_IRQHandler(void);
void WEAK RCC_IRQHandler(void);
void WEAK EXTI0_IRQHandler(void);
void WEAK EXTI1_IRQHandler(void);
void WEAK EXTI2_IRQHandler(void);
void WEAK EXTI3_IRQHandler(void);
void WEAK EXTI4_IRQHandler(void);
void WEAK DMA1_Channel1_IRQHandler(void);
void WEAK DMA1_Channel2_IRQHandler(void);
void WEAK DMA1_Channel3_IRQHandler(void);
void WEAK DMA1_Channel4_IRQHandler(void);
void WEAK DMA1_Channel5_IRQHandler(void);
void WEAK DMA1_Channel6_IRQHandler(void);
void WEAK DMA1_Channel7_IRQHandler(void);
void WEAK ADC1_2_IRQHandler(void);
void WEAK USB_HP_CAN1_TX_IRQHandler(void);
void WEAK USB_LP_CAN1_RX0_IRQHandler(void);
void WEAK CAN1_RX1_IRQHandler(void);
void WEAK CAN1_SCE_IRQHandler(void);
void WEAK EXTI9_5_IRQHandler(void);
void WEAK TIM1_BRK_IRQHandler(void);
void WEAK TIM1_UP_IRQHandler(void);
void WEAK TIM1_TRG_COM_IRQHandler(void);
void WEAK TIM1_CC_IRQHandler(void);
void WEAK TIM2_IRQHandler(void);
void WEAK TIM3_IRQHandler(void);
void WEAK TIM4_IRQHandler(void);
void WEAK I2C1_EV_IRQHandler(void);
void WEAK I2C1_ER_IRQHandler(void);
void WEAK I2C2_EV_IRQHandler(void);
void WEAK I2C2_ER_IRQHandler(void);
void WEAK SPI1_IRQHandler(void);
void WEAK SPI2_IRQHandler(void);
void WEAK USART1_IRQHandler(void);
void WEAK USART2_IRQHandler(void);
void WEAK USART3_IRQHandler(void);
void WEAK EXTI15_10_IRQHandler(void);
void WEAK RTCAlarm_IRQHandler(void);
void WEAK USBWakeUp_IRQHandler(void);


Чисто теоретически можно догадаться, что к чему, но вот где посмотреть, кто кого вызывает - не могу понять...
P.S. Была бы документация на эту библиотеку - с удовольствием почитал бы laughing.gif

Сообщение отредактировал IgorKossak - Mar 13 2013, 17:47
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Elcarnado   Can в STM32F103RBT6   Mar 6 2013, 09:24
- - Elcarnado   Так-с... С этой проблемкой воде разобрался (понадо...   Mar 6 2013, 12:26
- - SasaVitebsk   Вроде всё у вас нормально. Я правда с 105 работал....   Mar 6 2013, 12:55
- - Elcarnado   Эх... Кан все-равно не работает ((( Объявляю перем...   Mar 6 2013, 14:27
- - Elcarnado   Здравствуйте! После отправки сообщения проверя...   Mar 7 2013, 09:14
- - Golikov A.   вопрос в том есть ли приемники сообщения? если на ...   Mar 7 2013, 12:18
|- - Elcarnado   Цитата(Golikov A. @ Mar 7 2013, 14:18) во...   Mar 7 2013, 12:28
- - Golikov A.   Все зависит. Есть стандарт и рекомендации лучше им...   Mar 7 2013, 14:11
- - Elcarnado   Доброго вечера! Снова прошу вашей помощи. Инте...   Mar 11 2013, 15:37
- - Golikov A.   startup_stm32f10x_md.c - близко, почти горячо... ...   Mar 13 2013, 15:01
|- - Elcarnado   Цитата(Golikov A. @ Mar 13 2013, 17:01) s...   Mar 13 2013, 15:32
|- - adnega   Цитата(Elcarnado @ Mar 13 2013, 19:32) С ...   Mar 13 2013, 16:30
|- - Elcarnado   Цитата(adnega @ Mar 13 2013, 18:30) Припи...   Mar 14 2013, 07:03
- - Golikov A.   почему USB? volatile - возможно, но почему в деба...   Mar 13 2013, 16:51
|- - _Артём_   Цитата(Golikov A. @ Mar 13 2013, 18:51) п...   Mar 13 2013, 18:41
- - Golikov A.   Количество странностей заставило меня все таки отк...   Mar 14 2013, 05:31
- - Golikov A.   ну тогда вы просто не выпадаете из прерывания в ос...   Mar 14 2013, 07:35
|- - Elcarnado   Цитата(Golikov A. @ Mar 14 2013, 09:35) н...   Mar 14 2013, 08:23
- - Golikov A.   строго говоря это режим для отладки, как и сайлент...   Mar 14 2013, 15:23
- - Elcarnado   Добрый день! Наконец-то удалось подружить два ...   Mar 18 2013, 11:02


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

 


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


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