void CAN_Config_Init(void)
{
GPIO_Config_T gpioConfig;
CAN_Config_T canConfig;
CAN_FilterConfig_T filterConfig;
/* GPIOB, GPIOD and AFIO clocks enable */
RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA | RCM_APB2_PERIPH_AFIO);
/* CAN1 and CAN2 Periph clocks enable */
RCM_EnableAPB1PeriphClock(RCM_APB1_PERIPH_CAN1 );
/* CAN GPIO Init */
/* CAN1 Tx remap 1 */
//GPIO_ConfigPinRemap(GPIO_NO_REMAP_CAN1);
gpioConfig.pin = GPIO_PIN_12;
gpioConfig.mode = GPIO_MODE_AF_PP;
gpioConfig.speed = GPIO_SPEED_50MHz;
GPIO_Config(GPIOA, &gpioConfig);
/* CAN1 Rx remap 1 */
gpioConfig.pin = GPIO_PIN_11;
gpioConfig.mode = GPIO_MODE_IN_PU;
GPIO_Config(GPIOA, &gpioConfig);
CAN_Reset(CAN1);
CAN_ConfigStructInit(&canConfig);
/* CAN1 and CAN2 cell init */
canConfig.autoBusOffManage = DISABLE;
canConfig.autoWakeUpMode = DISABLE;
canConfig.nonAutoRetran = DISABLE;
canConfig.rxFIFOLockMode = DISABLE;
canConfig.txFIFOPriority = ENABLE;
canConfig.mode = CAN_MODE_NORMAL;
canConfig.syncJumpWidth = CAN_SJW_1;
canConfig.timeSegment1 = CAN_TIME_SEGMENT1_3;
canConfig.timeSegment2 = CAN_TIME_SEGMENT2_2;
canConfig.prescaler = 6;
CAN_Config(CAN1, &canConfig);
/* CAN1 filter init */
filterConfig.filterNumber = 1;
filterConfig.filterMode = CAN_FILTER_MODE_IDMASK;
filterConfig.filterScale = CAN_FILTER_SCALE_32BIT;
filterConfig.filterIdHigh = 0x6420;
filterConfig.filterIdLow = 0x0000;
filterConfig.filterMaskIdHigh = 0x0000;
filterConfig.filterMaskIdLow = 0x0000;
filterConfig.filterFIFO = CAN_FILTER_FIFO_0;
filterConfig.filterActivation = ENABLE;
CAN_ConfigFilter(CAN1,&filterConfig);
/* Enable CAN Interrupt */
CAN_EnableInterrupt(CAN1, CAN_INT_F0MP);
NVIC_EnableIRQRequest(USBD1_LP_CAN1_RX0_IRQn, 0, 0);
}
void CAN_Transmit_Init(void)
{
TxMessage.stdID = 0x321;
TxMessage.extID = 0x001;
TxMessage.remoteTxReq = CAN_RTXR_DATA;
TxMessage.typeID = CAN_TYPEID_STD;
TxMessage.dataLengthCode = 1;
}
void app_can_init(void)
{
CAN_Config_Init();
CAN_Transmit_Init();
CAN_EnableInterrupt(CAN1, CAN_INT_F0MP);
}
/* CAN发送数据 */
void can_send(uint32_t id, const uint8_t *msg, uint8_t len)
{
CAN_TxMessage_T Txmsg;
Txmsg.stdID = id;
Txmsg.extID = id;
Txmsg.remoteTxReq = CAN_RTXR_DATA;
Txmsg.typeID = CAN_TYPEID_STD;
Txmsg.dataLengthCode = len;
memcpy(Txmsg.data,msg,len);
CAN_TxMessage(CAN1, &Txmsg);
}
|