当前位置:网站首页>CAN总线通信应用
CAN总线通信应用
2022-07-26 22:49:00 【李今天摸鱼了嘛?】
实验生产线环境检测系统构建
一、系统构成

二、代码分析

//CAN总线配置
void CAN_User_Config(CAN_HandleTypeDef* hcan )
{
CAN_FilterTypeDef sFilterConfig;
HAL_StatusTypeDef HAL_Status;
sFilterConfig.FilterBank = 0; //过滤器0
sFilterConfig.FilterMode = CAN_FILTERMODE_IDMASK;//屏蔽位模式
sFilterConfig.FilterScale = CAN_FILTERSCALE_32BIT; //32位宽
sFilterConfig.FilterIdHigh = 0x0000; //32位ID
sFilterConfig.FilterIdLow = 0x0000;
sFilterConfig.FilterMaskIdHigh = 0x0000; //32位MASK
sFilterConfig.FilterMaskIdLow = 0x0000;
sFilterConfig.FilterFIFOAssignment = CAN_RX_FIFO0; //接收到的报文放入到FIFO0中
sFilterConfig.FilterActivation = ENABLE; //激活过滤器
sFilterConfig.SlaveStartFilterBank = 0;
HAL_Status=HAL_CAN_ConfigFilter(hcan, &sFilterConfig);
HAL_Status=HAL_CAN_Start(hcan); //开启CAN
if(HAL_Status!=HAL_OK)
{
printf("开启CAN失败\r\n");
}
HAL_Status=HAL_CAN_ActivateNotification(hcan, CAN_IT_RX_FIFO0_MSG_PENDING);
if(HAL_Status!=HAL_OK)
{
printf("开启挂起中段允许失败\r\n");
}
}
//启动CAN总线
void can_start(void)
{
HAL_CAN_Start(&hcan);
}
//停止CAN总线
void can_stop(void)
{
HAL_CAN_Stop(&hcan);
}
//CAN数据发送函数
uint8_t Can_Send_Msg_StdId(uint16_t My_StdId,uint8_t len,uint8_t Type_Sensor)
{
CAN_TxHeaderTypeDef TxMeg;
ValueType ValueType_t;
uint8_t vol_H,vol_L;
uint16_t i=0;
uint8_t data[8];
TxMeg.StdId=My_StdId; // 标准标识符
TxMeg.ExtId=0x00; // 设置扩展标示符
TxMeg.IDE=CAN_ID_STD; // 标准帧
TxMeg.RTR=CAN_RTR_DATA; // 数据帧
TxMeg.DLC=len; // 要发送的数据长度
for(i=0;i<len;i++)
{
data[i]=0;
}
data[0] = Sensor_Type_t;
data[3] = (uint8_t)My_StdId&0x00ff; //取低两位做ID
data[4] = My_StdId>>8; //高位在后
printf("Can_Send_Msg_StdId >>My_StdId 标准帧ID= %x \r\n",My_StdId);
printf("Can_Send_Msg_StdId >>Sensor_Type_t %d \r\n",data[0]);
ValueType_t=ValueTypes(Type_Sensor);
printf("Can_Send_Msg_StdId >>ValueType_t %d \r\n",ValueType_t);
switch(ValueType_t)
{
case Value_ADC:
vol_H = (vol&0xff00)>>8;
vol_L = vol&0x00ff;
data[1]=vol_H;
data[2]=vol_L;
printf("Can_Send_Msg_StdId >> Value_ADC TxMessage.Data[1]=vol_L %d \r\n",data[1]);
printf("Can_Send_Msg_StdId >> Value_ADC TxMessage.Data[2]=vol_L %d \r\n",data[2]);
break;
case Value_Switch:
data[1]=switching;
data[2]=0;
break;
case Value_I2C:
data[1]=sensor_tem;
data[2]=sensor_hum;
printf("Can_Send_Msg_StdId >> Value_I2C TxMessage.Data[1]=vol_L %d \r\n",data[1]);
printf("Can_Send_Msg_StdId >> Value_I2C TxMessage.Data[2]=vol_L %d \r\n",data[2]);
break;
default:
break;
}
if (HAL_CAN_AddTxMessage(&hcan, &TxMeg, data, &TxMailbox) != HAL_OK)
{
printf("Can send data error\r\n");
}
else
{
printf("Can send data success\r\n");
}
return 0;
}
//CAN中断回调函数
void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
CAN_RxHeaderTypeDef RxMeg;
uint8_t Data[8] = {0};
HAL_StatusTypeDef HAL_RetVal;
int i;
RxMeg.StdId=0x00;
RxMeg.ExtId=0x00;
RxMeg.IDE=0;
RxMeg.DLC=0;
HAL_RetVal=HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxMeg, Data);
if ( HAL_OK==HAL_RetVal)
{
for(i=0;i<RxMeg.DLC;i++)
{
Can_data[i]= Data[i];
printf("%02X ",Data[i]);
}
printf("\r\n");
flag_send_data=1;
}
}网关主函数
while (1)
{
/* USER CODE END WHILE */
if(1)
{
Value_Type=ValueTypes(Sensor_Type_t);
switch(Value_Type)
{
case Value_ADC: //光照 空气 火焰 可燃气体
sensor_number=1;
vol=Get_Voltage();
printf("vol=Get_Voltage ===== %x \r\n",vol);
break;
case Value_Switch: //人体 红外 声音
sensor_number=1;
switching=Switching_Value();
printf("switching=Switching_Value== %d \r\n",switching);
break;
case Value_I2C:
sensor_number=2;
SHT1x_get_temperature(&sensor_tem); //温度
SHT1x_get_relative_humidity(&sensor_hum); //湿度
printf("sensor_tem ===== %d :;sensor_hum===%d \r\n",(int)sensor_tem,(int)sensor_hum);
break;
default:
break;
}
//把本块板子的传感数据发送到网关
Master_To_Gateway(Can_STD_ID, Value_Type, vol, switching, sensor_hum, sensor_tem );
}
HAL_Delay(1500);
//发送从CAN总线接收的其他节点数据至网关
if(flag_send_data==1)
{
CAN_Master_To_Gateway( Can_data,9);
flag_send_data=0;
}
//USART1 通过M3主控模块配置工具配置采集传感器类型 或 或者CAN发送标准帧ID (注标准帧不能超过0 to 0x7FF)
if(!usart1_data_fifo_is_empty())
{
HAL_Delay(100);
process_up();
}
/* USER CODE BEGIN 3 */
}节点主函数
while (1)
{
/* USER CODE END WHILE */
if(1)
{
Value_Type=ValueTypes(Sensor_Type_t);
switch(Value_Type)
{
case Value_ADC: //光照 空气 火焰 可燃气体
sensor_number=1;
vol=Get_Voltage();
printf("vol=Get_Voltage ===== %x \r\n",vol);
break;
case Value_Switch: //人体 红外 声音
sensor_number=1;
switching=Switching_Value();
printf("switching=Switching_Value== %d \r\n",switching);
break;
case Value_I2C:
sensor_number=2;
SHT1x_get_temperature(&sensor_tem); //温度
SHT1x_get_relative_humidity(&sensor_hum); //湿度
printf("sensor_tem ===== %d :;sensor_hum===%d \r\n",(int)sensor_tem,(int)sensor_hum);
break;
default:
break;
}
//把本块板子的传感数据发送到网关
Master_To_Gateway(Can_STD_ID, Value_Type, vol, switching, sensor_hum, sensor_tem );
}
HAL_Delay(1500);
//发送从CAN总线接收的其他节点数据至网关
if(flag_send_data==1)
{
CAN_Master_To_Gateway( Can_data,9);
flag_send_data=0;
}
//USART1 通过M3主控模块配置工具配置采集传感器类型 或 或者CAN发送标准帧ID (注标准帧不能超过0 to 0x7FF)
if(!usart1_data_fifo_is_empty())
{
HAL_Delay(100);
process_up();
}
/* USER CODE BEGIN 3 */
}边栏推荐
- Simple application of rip V2 (V2 configuration, announcement, manual summary, ripv2 authentication, silent interface, accelerating convergence)
- Realize data interaction between two apps through fileprovider
- 7.7 sheen Xiyin written test
- HCIA静态路由综合实验
- [详解C语言]一文带你玩转循环结构(for_while_do-while)
- 第三讲--GPIO输入输出库函数使用以及相关例程
- OSPF protocol knowledge summary
- The gradient descent method and Newton method are used to calculate the open radical
- Text to image paper intensive reading ssa-gan: text to image generation with semantic spatial aware Gan
- 广域网技术实验
猜你喜欢
随机推荐
Electron FAQ 61 - must the client run with administrator privileges?
ospf协议概述以及基础概念
C语言——字符和字符串、算术运算符、类型转换
Golang - sync包的使用 (WaitGroup, Once, Mutex, RWMutex, Cond, Pool, Map)
Ogeek meetup phase I, together with cubefs, is hot
C语言——while语句、dowhile语句、for循环和循环结构、break语句和continue语句
JS logical operator
JS -- first understand the naming rules and data types of JS and variables
Static comprehensive experiment (comprehensive exercise of static route, loopback interface, default route, empty interface, floating static)
7.13 蔚来提前批笔试
C语言——赋值运算符、复合的赋值运算符、自增自减运算符、逗号运算符、条件运算符、goto语句、注释
JS逻辑运算符
第四讲—讲解GPIO_Write函数以及相关例程
C language implementation of the small game [sanziqi] Notes detailed logic clear, come and have a look!!
6.30滴滴面经(一面+二面)
C语言——关系运算符和逻辑运算符、if语句、switch语句、分支结构的嵌套
Nat网络地址转换实验
a元素的伪类
Three methods that can effectively fuse text and image information -- feature stitching, cross modal attention, conditional batch normalization
静态路由基础配置(IP地址的规划、静态路由的配置),实现全网可达。






![[explain C language in detail] takes you to play with loop structure (for_while_do while)](/img/d9/75053297873a5b5458514e7f557cdc.png)

