140 lines
6.2 KiB
C
140 lines
6.2 KiB
C
|
/*******************************************************************************
|
||
|
* @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**********************************/
|