Здравствуйте,
Есть плата собственной разработки с 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 на данном камне без ремапа?