|
楼主 |
发表于 2021-9-10 17:32:19
|
显示全部楼层
CAN部分很简单,自定义2个ID,就可以了。驱动都是通用的,用的官方代码。
- #ifndef DRIVER_CAN_H
- #define DRIVER_CAN_H
- #include "type.h"
- void CAN1_Init(void);
- void CAN_Disable(void);
- UINT8 CAN1_SendMessage(UINT32 id, UINT8 *memory, UINT8 Length);
- void CAN_RXBufferSet(void);
- #endif
复制代码
- #include "system.h"
- CanTxMsg TxMessage;
- CanRxMsg RxMessage;
- void CAN_SetRxBuffer(UINT8 buffer, UINT32 id, UINT32 mask)
- {
- CAN_FilterInitTypeDef CAN_FilterInitStructure;
- UINT32 ID_FDR = 0,Mask_FDR = 0;
-
- ID_FDR = (id<<21) & 0xFFE00000;
- Mask_FDR = (mask<<21) & 0xFFE00000;
- /* CAN filter init */
- CAN_FilterInitStructure.CAN_FilterNumber = buffer; /*指定待初始化的过滤器(0~13)*/
- CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdList; /*过滤器模式 CAN_FILTERMODE_MASK(标识符屏蔽位模式) CAN_FILTERMODE_LIST(列表模式)*/
- CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; /*过滤器位宽*/
- CAN_FilterInitStructure.CAN_FilterIdHigh = (UINT16)(ID_FDR>>16);
- CAN_FilterInitStructure.CAN_FilterIdLow = (UINT16)ID_FDR; /*过滤器标识符*/
- CAN_FilterInitStructure.CAN_FilterMaskIdHigh = (UINT16)(Mask_FDR>>16);
- CAN_FilterInitStructure.CAN_FilterMaskIdLow = (UINT16)Mask_FDR; /*过滤器屏蔽标识符*/
- CAN_FilterInitStructure.CAN_FilterFIFOAssignment = 1; /*FIFO Num 1*/
- CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; /*使能或是失能过滤器*/
- CAN_FilterInit(&CAN_FilterInitStructure);
- }
- void CAN1_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- CAN_InitTypeDef CAN_InitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- /* Configure CAN RX(PA11) pin */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;/*上拉输入*/
- GPIO_Init(GPIOA, &GPIO_InitStructure);
- /* Configure CAN TX(PA12) pin */
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;/*复用推挽输出*/
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &GPIO_InitStructure);
-
- /* CAN register init */
- CAN_DeInit(CAN1);
- 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_Normal;
- //CAN_InitStructure.CAN_Mode = CAN_Mode_LoopBack;
-
- //72MHz//72000/2/6/((1+9+2))=500k (1+9)/(1+9+2)=83%
- CAN_InitStructure.CAN_SJW = CAN_SJW_2tq;
- CAN_InitStructure.CAN_BS1 = CAN_BS1_9tq;
- CAN_InitStructure.CAN_BS2 = CAN_BS2_2tq;
- CAN_InitStructure.CAN_Prescaler = 6;
- CAN_Init(CAN1, &CAN_InitStructure);
-
- //设置接收buf
- CAN_SetRxBuffer(0,0x392,0xfff);
-
- /* Enable CAN1 RX1 interrupt IRQ channel */
- NVIC_InitStructure.NVIC_IRQChannel = CAN1_RX1_IRQn;//FIFO 1
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE);//FIFO 1 not empty interrupt
-
- //错误中断配置
- NVIC_InitStructure.NVIC_IRQChannel = CAN1_SCE_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- CAN_ITConfig(CAN1, CAN_IT_ERR, ENABLE); //错误中断使能
- // CAN_ITConfig(CAN1, CAN_IT_EWG, ENABLE); //警告错误
- // CAN_ITConfig(CAN1, CAN_IT_EPV, ENABLE); //被动错误
- CAN_ITConfig(CAN1, CAN_IT_BOF, ENABLE); //离线中断
- // CAN_ITConfig(CAN1, CAN_IT_LEC, ENABLE); //错误种类
- }
- UINT8 CAN1_SendMessage(UINT32 id, UINT8 *memory, UINT8 Length)
- {
- UINT8 Sendmail_num = CAN_TxStatus_NoMailBox;
- UINT8 SendCount = 0;
- UINT8 value = 1;
- if(Length > 8) Length = 8;
- /* Transmit */
- TxMessage.StdId = id;
- TxMessage.ExtId = id;
- TxMessage.RTR = CAN_RTR_DATA;
- TxMessage.IDE = CAN_ID_STD; //标准帧
- TxMessage.DLC = Length;
- memcpy(TxMessage.Data,memory,TxMessage.DLC);
- while(1)
- {//只有3个发送邮箱,所以一次只能发送三帧数据,如果满了可以等待一段时间再发
- Sendmail_num = CAN_Transmit(CAN1, &TxMessage);
-
- if(Sendmail_num == CAN_TxStatus_NoMailBox)
- {//邮箱满
- delay_ms(1);
- SendCount ++;
- if(SendCount == 10)//10ms
- {
- SendCount = 0;
- value = 0;
- break;
- }
- }
- else
- {
- value = 1;
- break;
- }
- }
- return value;
- }
- //------------------------中断处理------------------------------
- //接收中断处理
- void CAN1_RX1_IRQHandler(void)
- {
- CAN_Receive(CAN1, CAN_FIFO1, &RxMessage);
- if((RxMessage.FMI == 0) && (RxMessage.StdId == 392))
- {
- //DebugUart_Printf(1,"CAN:0x500\r\n");
- }
- }
- //错误中断处理
- void CAN1_SCE_IRQHandler(void)
- {
- //错误中断
- if(CAN_GetITStatus(CAN1,CAN_IT_ERR) == SET)
- {
- CAN_ClearITPendingBit(CAN1,CAN_IT_ERR);
- //DebugUart_Printf(DEBUG_ErrInfo,"[ErrInfo]:Ext CAN ERROR:INT\r\n");
- }
- //离线中断
- if(CAN_GetITStatus(CAN1,CAN_IT_BOF) == SET)
- {
- CAN_ClearITPendingBit(CAN1,CAN_IT_BOF);
- //DebugUart_Printf(DEBUG_ErrInfo,"[ErrInfo]:Ext CAN ERROR:buf off\r\n");
- //通过软件手动的从离线状态中恢复
- gSysStateFlag.bits.b_CanBusOffFlag = 1;
- }
- // if(CAN_GetITStatus(CAN1,CAN_INT_WE) == SET)
- // {
- // //DebugUart_Printf(DEBUG_ErrInfo,"[ErrInfo]:Ext CAN ERROR:error warning 96\r\n");
- // }
- // if(CAN_GetITStatus(CAN1,CAN_INT_PE) == SET)
- // {
- // //DebugUart_Printf(DEBUG_ErrInfo,"[ErrInfo]:Ext CAN ERROR:error warning 128\r\n");
- // }
- // if(CAN_GetITStatus(CAN1,CAN_INT_ET) == SET)
- // {
- // //DebugUart_Printf(DEBUG_ErrInfo,"[ErrInfo]:Ext CAN ERROR:error active\r\n");
- // }
- }
复制代码
|
|