Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F105RBT6 CAN не работает без remap'а
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
laowai
Здравствуйте,

Есть плата собственной разработки с stm32f105rbt6 x 1, mcp2551 x 3.
Изначальная идея заключалась в возможности организации кольца на CAN2. Предполагалось, что в случае одного обрыва на шине, перенастраиваем CAN2 на альтернативные порты ввода-вывода, подключая второе полукольцо шины, не теряя связь с устройствами на шине. Встретился с проблемой и не могу 2 день победить.

Корпус 64-пиновый, по документации CAN2: ноги rx,tx PB12,PB13 либо PB5,PB6 соответственно.

Вот этот код инициализации работает:

Код
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

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

/* Configure CAN2 pin: TX */
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//GPIO_Init(GPIOB, &GPIO_InitStructure);

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

/* Configure CAN2 pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);

GPIO_PinRemapConfig(GPIO_Remap_CAN2 , ENABLE);


Этот нет:

Код
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

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

/* Configure CAN2 pin: TX */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);

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

/* Configure CAN2 pin: TX */
//GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
//GPIO_Init(GPIOB, &GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN2, ENABLE);

//GPIO_PinRemapConfig(GPIO_Remap_CAN2 , ENABLE);


Остальной код не меняется. Разница только в ремапе. Т.е. с ремапом работает, без - нет. Смотрю цифровым анализатором: на ноге PB13 3.3В.

Ноги исправные, при переводе в GPIO_Mode_Out_PP и дрыганье анализатором вижу меандр.

Та же ситуация с CAN1, с ремапом вижу пакеты на PB8, без ремапа на PA12 только 3.3В.

В errata ничего подобного не видел.

Кто-нибудь запускал CAN на данном камне без ремапа?
adnega
Ничего не понял.
Если ремап включен, то CAN2 работает на ногах PB5, PB6.
Если ремап выключен, то CAN2 работает на ногах PB12, PB13.

Поскольку в рабочем коде ремап включен, то на PB6 будет передача, а на PB13 передачи быть не должно. Получается, что у вас все работает в соответствии с документацией.
laowai
Цитата(adnega @ Dec 20 2014, 09:56) *
Если ремап включен, то CAN2 работает на ногах PB5, PB6.
Если ремап выключен, то CAN2 работает на ногах PB12, PB13.


Когда я включаю ремап и настраиваю PB5-PB6, то CAN2 работает на PB5,PB6. И на PB6 анализатором я вижу отправляемые мною пакеты.
Когда я не включаю(!) ремап и настраиваю PB12-PB13, то CAN2 должен(!) работать на PB12,PB13. Но я не вижу пакетов на PB13, только 1 (3.3В).

Та же история с CAN1. Работает только в случае ремапа.
adnega
Принудительно GPIO_PinRemapConfig(GPIO_Remap_CAN2 , DISABLE) пробовали?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.