STM32F107VCT6开发板 CAN总线通信实验----发送和接收

参考这位大神
https://blog.csdn.net/MQ0522/article/details/113242004?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-113242004-blog-89485524.pc_relevant_multi_platform_featuressortv2dupreplace&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-113242004-blog-89485524.pc_relevant_multi_platform_featuressortv2dupreplace&utm_relevant_index=1
2. CAN总线通信发送相关库函数
发送数据结构体:

typedef struct
{
uint32_t StdId; /*!<指定标准标识符
该参数可以是0到0x7FF之间的值,11位数据 */

uint32_t ExtId; /*!< 指定扩展标识符
该参数可以是0到0x1FFFFFFF之间的值,29位数据 */

uint8_t IDE; /*!< 指定要传输的消息的标识符类型
标准帧:CAN_ID_STD
扩展帧:CAN_ID_EXT */

uint8_t RTR; /*!< 指定要传输的消息的帧类型
数据帧:CAN_RTR_DATA
远程帧:CAN_RTR_REMOTE */

uint8_t DLC; /*!< 指定将要传输的帧的长度。
取值范围为0 ~ 8 */

uint8_t Data[8]; /*!< 包含要传输的数据。
取值范围是0 ~ 0xFF */
} CanTxMsg;

3.CAN总线通信发送程序
标准帧具体代码如下:

CanTxMsg TxMessage; //定义结构体变量
/* 发送数据*/
void CAN_TX(void)
{
TxMessage.StdId=0x01; //标准标识符为0x01
TxMessage.IDE=CAN_ID_STD; //使用标准标识符 CAN_ID_STD
TxMessage.RTR=CAN_RTR_DATA; //为数据帧
TxMessage.DLC=0x08; //消息的数据长度为8个字节
TxMessage.Data[0]=0x01; //第1个字节数据
TxMessage.Data[1]=0x02; //第2个字节数据
TxMessage.Data[2]=0x03; //第3个字节数据
TxMessage.Data[3]=0x04; //第4个字节数据
TxMessage.Data[4]=0x05; //第5个字节数据
TxMessage.Data[5]=0x06; //第6个字节数据
TxMessage.Data[6]=0x07; //第7个字节数据
TxMessage.Data[7]=0x08; //第8个字节数据
CAN_Transmit(CAN1, &TxMessage); //发送数据
}
扩展帧具体代码如下:
CanTxMsg TxMessage; //定义结构体变量
/* 发送两个字节的数据*/
void CAN_TX(void)
{

TxMessage.ExtId=0x1FFFFFFF; //扩展标识符 0x1FFFFFFF
TxMessage.IDE=CAN_ID_EXT; //使用标准标识符 CAN_ID_EXT
TxMessage.RTR=CAN_RTR_DATA; //为数据帧
TxMessage.DLC=0x08; //消息的数据长度为8个字节
TxMessage.Data[0]=0x01; //第1个字节数据
TxMessage.Data[1]=0x02; //第2个字节数据
TxMessage.Data[2]=0x03; //第3个字节数据
TxMessage.Data[3]=0x04; //第4个字节数据
TxMessage.Data[4]=0x05; //第5个字节数据
TxMessage.Data[5]=0x06; //第6个字节数据
TxMessage.Data[6]=0x07; //第7个字节数据
TxMessage.Data[7]=0x08; //第8个字节数据
CAN_Transmit(CAN1, &TxMessage); //发送数据
}
2. CAN总线通信接收相关库函数
接收数据结构体:

typedef struct
{
uint32_t StdId; /*!<指定标准标识符
该参数可以是0到0x7FF之间的值 */

uint32_t ExtId; /*!< 指定扩展标识符
该参数可以是0到0x1FFFFFFF之间的值 */

uint8_t IDE; /*!< 指定要传输的消息的标识符类型
标准帧:CAN_ID_STD
扩展帧:CAN_ID_EXT */

uint8_t RTR; /*!< 指定要传输的消息的帧类型
数据帧:CAN_RTR_DATA
远程帧:CAN_RTR_REMOTE */

uint8_t DLC; /*!< 指定将要传输的帧的长度。
取值范围为0 ~ 8 */

uint8_t Data[8]; /*!< 包含要传输的数据。
取值范围是0 ~ 0xFF */

uint8_t FMI; /*!< 指定存储在邮箱中的消息所经过的筛选器的索引
该参数可以是0到0xFF之间的值 */
} CanRxMsg;

接收库函数:
void CAN_Receive(CAN_TypeDef* CANx, uint8_t FIFONumber, CanRxMsg* RxMessage);
3. CAN总线通信接收程序
标准帧:
具体代码如下:

CanRxMsg RxMessage;//定义结构体变量
//接收中断
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //接收FIFO0中的数据
get_data(&RxMessage); //接收数据处理函数
}
//接收数据处理函数
void get_data(CanRxMsg* rxMsg)
{
switch(rxMsg->StdId) //判断标准帧标识符
{
case 0x001:
//要实现的功能
break;
/*
*
其他标识未列出
/
case 0x7ff:
//要实现的功能
break;
default :
break;
}
}
扩展帧:
具体代码如下:

CanRxMsg RxMessage;//定义结构体变量
//接收中断
void USB_LP_CAN1_RX0_IRQHandler(void)
{
CAN_Receive(CAN1, CAN_FIFO0, &RxMessage); //接收FIFO0中的数据
get_data(&RxMessage); //接收数据处理函数
}
//接收数据处理函数
void get_data(CanRxMsg
rxMsg)
{
switch(rxMsg->ExtId) //判断扩展帧标识符
{
case 0x00000001:
//要实现的功能
break;
/*
*
其他标识未列出
*/
case 0x1FFFFFFF:
//要实现的功能
break;
default :
break;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值