gpio_output(CAN1_STB_GPIO_IDX, TRUE);
gpio_output(CAN1_EN_GPIO_IDX, TRUE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_CANx, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
cangpio_init();
CAN_DeInit(CANx);
CAN_StructInit(&CAN_InitStructure);
//CAN cell init
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_LoopBack;
//Baudrate = 500kbps
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq;
CAN_InitStructure.CAN_BS1 = CAN_BS1_3tq;
CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
CAN_InitStructure.CAN_Prescaler = 12;
CAN_Init(CANx, &CAN_InitStructure);
void can_send_msg(CAN_TypeDef* CANx, CanTxMsg *pTxMessage){
u8 TransmitMailBox;
u32 ntry;;
u8 idx = 0;
u8 nret;
TransmitMailBox = CAN_Transmit(CANx, pTxMessage);
ntry = 0;
while(((nret = CAN_TransmitStatus(CANx, TransmitMailBox)) != CANTXOK) && (ntry != 0xFFFF)){
ntry++;
}
if(ntry >= 0xFFFF){
#ifdef __DEBUG_VERSION__
printf("\n CAN<%d> Trans falied<%d, %d>!", idx, TransmitMailBox, nret);
#endif
}
}
Nvic.c
void CanNvicInit(u8 idx){
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = CAN_PREEMPRTION_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = CAN_SUB_PRIORITY;
NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX0_IRQn;
NVIC_Init(&NVIC_InitStructure);
CAN_ITConfig(CANx, CAN_IT_FMP0, ENABLE);
printf("can nvic init over \r\n");
}
stm32f10x_it.c
void CAN1_RX0_IRQHandler(void){
CAN_Receive(CANx, CAN_FIFO0, &(g_can_recv_buf[g_can_recvtail]));
g_can_recvtail = (g_can_recvtail + 1) % CAN_RECVBUF_MAX;
}