本人是大一的学生,学习了一段时间的stm32,此系列博客为个人的学习笔记,方便个人复习,如有错误或问题,非常非常欢迎大家来大力指正。
知识参考中科大RM(TrojanGeneric)和kevin的教程。本视频的部分图也来自视频中的图片,代码也是参考他们的大家如果要学习强烈推荐他们的视频
can
(两种模式:闭环和开环)
没有主从,没有地址的概念,发送的是帧,帧有标识符,can可以对识别符识别是否需要,需要就接收,BS1采样点的位置,BS2发送点的位置()
和这个对应
以下是帧的类型,常用的是数据帧和遥控帧
我们可以知道,要配置帧和过滤器,然后发送出去配置电机,就可以驱动电机了
以下是帧的结构,帧代码:
数据帧有ID有数据
遥控帧有ID无数据,裁决是看那个先出现显性电平0,RTR是判断是遥控帧还是数据帧
Can_TxHeader0.RTR=CAN_RTR_DATA;//数据帧填写CAN_RTR_DATA,遥控帧填写CAN_RTR_REMOTE */
IDE为标识符扩展位,1扩展,0默认,扩展帧在后面
Can_TxHeader0.IDE=CAN_ID_STD;//标准帧填写CAN_ID_STD,扩展帧填写CAN_ID_EXT
DLC数据长度编码
Can_TxHeader0.DLC=8;//帧长度
Can_TxHeader0.ExtId=0;//拓展帧
Can_TxHeader0.StdId=0x1FF;//标准帧
筛选器的代码:
Can_Filter0.FilterFIFOAssignment=CAN_FILTER_FIFO0;//绑定FIFO
can有两个fifo,一个fifo有三个邮箱。都有一个接收中断函数。有筛选器,配置可接收id或掩码。一开始的数据为广播,筛选器可以筛选需要的遥控帧和数据帧
一个can外设有两个fifo,一个fifo有三个邮箱
Can_Filter0.FilterScale=CAN_FILTERSCALE_16BIT;//筛选器字节数
Can_Filter0.FilterMode=CAN_FILTERMODE_IDMASK;//模式
Can_Filter0.FilterActivation=CAN_FILTER_ENABLE;//使能
Can_Filter0.FilterIdHigh=0x000;//id寄存器高八位
Can_Filter0.FilterIdLow=0x000;//id寄存器低八位
Can_Filter0.FilterMaskIdHigh=0x000;//掩码寄存器高8位
Can_Filter0.FilterMaskIdLow=0x000;//掩码寄存器低八位
Can_Filter0.FilterBank=0;//筛选器编号 can1 0-13,can2 14-27
if(HAL_CAN_ConfigFilter(&hcan1,&Can_Filter0)!=HAL_OK)//判断是否配置成功
{
Error_Handler();
}
电流/电压配置
TxMailBox=CAN_TX_MAILBOX0;
Set_GM6020_Data[0]=0x22;//电压/电流配置
HAL_CAN_Start(&hcan1);
以下是全部的代码:
CAN_FilterTypeDef Can_Filter0;//结构体定义过滤器
CAN_TxHeaderTypeDef Can_TxHeader0;//结构体头文件配置
uint32_t TxMailBox;//邮箱
uint8_t Set_GM6020_Data[8];//发送的数据(电压)
Can_Filter0.FilterFIFOAssignment=CAN_FILTER_FIFO0;//绑定FIFO
Can_Filter0.FilterScale=CAN_FILTERSCALE_16BIT;//筛选器字节数
Can_Filter0.FilterBank=0;//筛选器编号 can1 0-13,can2 14-27
Can_Filter0.FilterMode=CAN_FILTERMODE_IDMASK;//模式
Can_Filter0.FilterActivation=CAN_FILTER_ENABLE;//使能
Can_Filter0.FilterIdHigh=0x000;//id寄存器高八位
Can_Filter0.FilterIdLow=0x000;//id寄存器低八位
Can_Filter0.FilterMaskIdHigh=0x000;//掩码寄存器高8位
Can_Filter0.FilterMaskIdLow=0x000;//掩码寄存器低八位
if(HAL_CAN_ConfigFilter(&hcan1,&Can_Filter0)!=HAL_OK)//判断是否配置成功
{
Error_Handler();
}
Can_TxHeader0.DLC=8;//帧长度
Can_TxHeader0.StdId=0x1FF;//标准帧
Can_TxHeader0.ExtId=0;//拓展帧
Can_TxHeader0.IDE=CAN_ID_STD;//传输数据格式,标准帧填写CAN_ID_STD,扩展帧填写CAN_ID_EXT
Can_TxHeader0.RTR=CAN_RTR_DATA;//传输数据格式,数据帧填写CAN_RTR_DATA,遥控帧填写CAN_RTR_REMOTE
Can_TxHeader0.TransmitGlobalTime=DISABLE;//时间触发通信模式开始/结束
TxMailBox=CAN_TX_MAILBOX0;
Set_GM6020_Data[0]=0x22;//电压/电流配置
HAL_CAN_Start(&hcan1);//开启can
TxMailBox=CAN_TX_MAILBOX0;
Set_GM6020_Data[0]=0x22;//电压/电流配置
HAL_CAN_Start(&hcan1);
while (1)
{
HAL_Delay(50);
HAL_CAN_AddTxMessage(&hcan1,&Can_TxHeader0,Set_GM6020_Data,&TxMailBox);
}
其他信息:
RS拉低是高速模式,拉高是静默模式。Vref是接参考电压,接can可以双机can通信
uint32_t HAL_CAN_IsSleepActive(const CAN_HandleTypeDef *hcan);查看是否在睡眠
测试模式:静默模式(可接不可发),回环模式(可发不可接外来的,只可接自己的),静默与回环模式(只可接自己的)
HAL_StatusTypeDef HAL_CAN_AddTxMessage(CAN_HandleTypeDef *hcan, const CAN_TxHeaderTypeDef *pHeader,const uint8_t aData[], uint32_t *pTxMailbox);//发送函数
HAL_StatusTypeDef HAL_CAN_AbortTxRequest(CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);//挂起已发送的函数
uint32_t HAL_CAN_IsTxMessagePending(const CAN_HandleTypeDef *hcan, uint32_t TxMailboxes);//看返回值是否在等待发送,0无1有
HAL_StatusTypeDef HAL_CAN_ConfigFilter(CAN_HandleTypeDef *hcan, const CAN_FilterTypeDef *sFilterConfig);
设置筛选器
#define HAL_CAN_DISABLE_IT()//可以关掉某个中断