bldc/firmware/src/Driver/can.c

140 lines
6.2 KiB
C
Raw Normal View History

2020-10-23 11:11:06 +00:00
/*******************************************************************************
* @file can.c
* @author: MQjehovah mail:MQjehovah@hotmail.com
* @version 1.0.0
* @date 2020.10.23
* @brief
******************************************************************************
* @attention
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "adc.h"
/* Definition ----------------------------------------------------------------*/
extern short int Cur_ADC;
extern short int Temp_ADC;
/* Functions -----------------------------------------------------------------*/
/*******************************************************************************
* @brief CAN1初始化
* @param None
* @retval None
* @note None
*******************************************************************************/
void CAN1_Config(u16 bound)
{
u8 brp = 3000 / bound;
GPIO_InitTypeDef GPIO_InitStructure;
CAN_InitTypeDef CAN_InitStructure;
CAN_FilterInitTypeDef CAN_FilterInitStructure;
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);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//CAN单元设置
CAN_InitStructure.CAN_TTCM = DISABLE; //ENABLE:时间触发通信模式 DISABLE:非时间触发通信模式
CAN_InitStructure.CAN_ABOM = ENABLE; //软件自动离线管理
CAN_InitStructure.CAN_AWUM = DISABLE; //ENABLE:监测到can消息退出休眠模式 DISABLE:清除CAN->MCR的SLEEP位退出休眠模式
CAN_InitStructure.CAN_NART = DISABLE; //ENABLE:无论发送成功与否只法一次 DISABLE:发送不成功一直重发
CAN_InitStructure.CAN_RFLM = DISABLE; //ENABLE:FIFO溢出后丢弃后面的报文 DISABLE:溢出后新的覆盖旧的
CAN_InitStructure.CAN_TXFP = ENABLE; //ENABLE:优先级由请求顺序决定 DISABLE:优先级由报文标识符决定
CAN_InitStructure.CAN_Mode = CAN_Mode_Normal; //模式设置
CAN_InitStructure.CAN_SJW = CAN_SJW_1tq; //重新同步跳跃宽度(Tsjw)为tsjw+1个时间单位 CAN_SJW_1tq~CAN_SJW_4tq
CAN_InitStructure.CAN_BS1 = CAN_BS1_6tq; //Tbs1范围CAN_BS1_1tq ~ CAN_BS1_16tq
CAN_InitStructure.CAN_BS2 = CAN_BS2_5tq; //Tbs2范围CAN_BS2_1tq ~ CAN_BS2_8tq
CAN_InitStructure.CAN_Prescaler = brp; //分频系数(Fdiv)为brp+1
CAN_Init(CAN1, &CAN_InitStructure); //初始化CAN1
//配置过滤器
CAN_FilterInitStructure.CAN_FilterNumber = 0; //过滤器0
CAN_FilterInitStructure.CAN_FilterMode = CAN_FilterMode_IdMask; //标识符屏蔽位模式
CAN_FilterInitStructure.CAN_FilterScale = CAN_FilterScale_32bit; //过滤器位宽32位
CAN_FilterInitStructure.CAN_FilterIdHigh = 0x0000; //32位ID
CAN_FilterInitStructure.CAN_FilterIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterMaskIdHigh = 0x0000; //32位MASK
CAN_FilterInitStructure.CAN_FilterMaskIdLow = 0x0000;
CAN_FilterInitStructure.CAN_FilterFIFOAssignment = CAN_Filter_FIFO0; //过滤器0关联到FIFO0
CAN_FilterInitStructure.CAN_FilterActivation = ENABLE; //激活过滤器0
CAN_FilterInit(&CAN_FilterInitStructure); //滤波器初始化
// Motor_Cmd(Addr_Left,DISABLE);
// Motor_Cmd(Addr_Right,DISABLE);
// delay_ms(20);//CAN命令包发送完成
CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); //FIFO0消息挂号中断允许.
}
/*******************************************************************************
* @brief CAN1中断
* @param None
* @retval None
* @note s顺时针n逆时针 S顺时针N逆时针
*******************************************************************************/
CanRxMsg BLcanbuf;
FlagStatus BL_Deal_Flag = RESET;
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CanRxMsg RxMessagebuf;
CAN_Receive(CAN1, CAN_FIFO0, &RxMessagebuf);
// CanRx_TimeOut_Cnt = 3000; //500ms
if (RxMessagebuf.StdId == 0x7df)
{
// if ((RxMessagebuf.Data[0] == 'S') || (RxMessagebuf.Data[0] == 'P') || (RxMessagebuf.Data[0] == 'X') || (RxMessagebuf.Data[0] == 'D'))
// {
// Com_No_T1 = RxMessagebuf.Data[7];
// if (Com_No_T1 != Com_No_OLD_T1)
// {
// if (RecDone_T1 == RESET)
// RecDone_T1 = SET;
// else
// return;
// memcpy(&uComRx_T1, RxMessagebuf.Data, 8);
// Com_No_OLD_T1 = Com_No_T1;
// }
// else
// {
// if (Say_Hello_T1 == 0)
// Say_Hello_T1 = 1;
// else
// return;
// uComTx_T1.mode = RxMessagebuf.Data[0];
// }
// }
}
}
int CanTx_TimeOut_Cnt = 0;
/**********************************************************************
* Description : None
* Input : None
* Output : None
* Return : None
* Attention : None
**********************************************************************/
u8 can_send_message(u8 index, u32 id, u8 dlc, u8 *data)
{
u8 mbox;
CanTxMsg TxMessage;
TxMessage.StdId = id; // 标准标识符
TxMessage.ExtId = id; // 设置扩展标示符
TxMessage.IDE = 0; // 标准帧
TxMessage.RTR = 0; // 数据帧
TxMessage.DLC = dlc; // 要发送的数据长度
CanTx_TimeOut_Cnt = 50; //25ms
memcpy(TxMessage.Data, data, 8);
do
{
mbox = CAN_Transmit(CAN1, &TxMessage);
} while ((mbox == CAN_TxStatus_NoMailBox) && (CanTx_TimeOut_Cnt != 0));
while ((CAN_TransmitStatus(CAN1, mbox) != CAN_TxStatus_Ok) && (CanTx_TimeOut_Cnt != 0))
;
CanTx_TimeOut_Cnt = 0;
return 1;
}
/*********************************END OF FILE**********************************/