#ifndef __CAN__H #define __CAN__H //******************************************************************** //CAN GPIO初始化 #define CAN_GPIO GPIOA #define CAN_GPIO_TX GPIO_Pin_12 #define CAN_GPIO_TX_SRC GPIO_PinSource12 #define CAN_GPIO_TX_AF GPIO_AF_4 #define CAN_GPIO_RX GPIO_Pin_11 #define CAN_GPIO_RX_SRC GPIO_PinSource11 #define CAN_GPIO_RX_AF GPIO_AF_4 #define CAN_GPIO_RCC RCC_AHBPeriph_GPIOA #define CAN_GPIO_Init() do{ \ GPIO_InitTypeDef GPIO_InitStructure; \ RCC_AHBPeriphClockCmd(CAN_GPIO_RCC , ENABLE); \ RCC_APB1PeriphClockCmd(RCC_APB1Periph_CAN, ENABLE); \ GPIO_PinAFConfig(CAN_GPIO,CAN_GPIO_TX_SRC,CAN_GPIO_TX_AF); \ GPIO_PinAFConfig(CAN_GPIO,CAN_GPIO_RX_SRC,CAN_GPIO_RX_AF); \ SYSCFG->CFGR1 |= SYSCFG_CFGR1_PA11_PA12_RMP; \ GPIO_InitStructure.GPIO_Pin=CAN_GPIO_TX; \ GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; \ GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; \ GPIO_InitStructure.GPIO_OType=GPIO_OType_OD; \ GPIO_Init(CAN_GPIO, &GPIO_InitStructure); \ GPIO_InitStructure.GPIO_Pin=CAN_GPIO_RX; \ GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; \ GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; \ GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; \ GPIO_Init(CAN_GPIO, &GPIO_InitStructure); \ }while(0) #define CAN_TX_LOW() GPIO_ResetBits(CAN_GPIO,CAN_GPIO_TX) #define CAN_RX_LOW() GPIO_ResetBits(CAN_GPIO,CAN_GPIO_RX) #define CAN_NVIC_Init() do{ \ NVIC_InitTypeDef NVIC_InitStructure; \ NVIC_InitStructure.NVIC_IRQChannel=CEC_CAN_IRQn; \ NVIC_InitStructure.NVIC_IRQChannelPriority=0; \ NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE; \ NVIC_Init(&NVIC_InitStructure); \ }while(0) //******************************************************************** //CAN_STBY初始化 #define CAN_STBY_PIN GPIO_Pin_10 #define CAN_STBY_PORT GPIOA #define CAN_STBY_PORT_RCC RCC_AHBPeriph_GPIOA #define CAN_STBY_Init() do{ \ GPIO_InitTypeDef GPIO_InitStructure; \ RCC_AHBPeriphClockCmd(CAN_STBY_PORT_RCC, ENABLE); \ GPIO_InitStructure.GPIO_Pin = CAN_STBY_PIN; \ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; \ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; \ GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; \ GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; \ GPIO_Init(CAN_STBY_PORT, &GPIO_InitStructure); \ CAN_STBY_Off(); \ }while(0) //LED输出控制 #define CAN_STBY_Off() GPIO_ResetBits(CAN_STBY_PORT,CAN_STBY_PIN) #define CAN_STBY_On() GPIO_SetBits(CAN_STBY_PORT,CAN_STBY_PIN) //******************************************************************** typedef struct { INT32U StdId; union { INT32U ExtId; struct { INT8U SA :8; //Source Address 源地址 INT8U PS_GE :8; //PDU Specific 目标地址 //PDU2 为组扩展 //如果高四位为1 ,PS就是组扩展 INT8U PF :8; // PDU FORMAT 以及数据域对应的参数组编号 // CA should use only PDUFormat. // PDU1 PF值范围 0-239 PS 含义:目标地址 // PDU2 PF值范围 240-245 PS 含义:组扩展 INT8U DP :1; //DataPage 0 PDU1 1 PDU2 INT8U EDP :1; //0 ///EDP INT8U Priod :3; //优先级 INT8U PDUFormat_Top :3; //0 // This needs pre and post processing. }Bits; }Bytes; INT8U IDE; INT8U RTR; INT8U DLC; INT8U FMI; } PDU2_Str; //******************************************************************** #define CAN_TX_BUFF_Size 10 #define CAN_RX_BUFF_Size 10 //******************************************************************** extern CanRxMsg CAN_RX_Buffer[CAN_RX_BUFF_Size]; extern CanTxMsg CAN_TX_Buffer[CAN_TX_BUFF_Size]; extern void CAN1_Init(void); extern INT8U CAN1_Polling(void); extern void CAN1_InterruptMode(void); extern void CAN1_Transmit(void); extern void CAN1_WriteTxBuffer(INT8U *ptr,INT32U Len,INT32U StdID,INT32U ExtID); #endif