STM32 BXCAN
目录
1.bxCAN简介
2.编程
- 1.初始化CAN
- 2.发送函数
- 3.接收函数
- 4.main函数内设置
3.FIFO邮箱介绍
Basic feature
通讯流程
初始化CAN
(1) GPIO 基本设置以及引脚配置、时钟配置
(2) CAN 模式,波特率等配置
1.设置相关位时序,主要用来配置波特率
2.模式选择,如普通模式,回环模式,回环静默模式
3.优先级选择
4.触发方式
(3)CAN FILTER CONFIGURATION
Mask、Code、Filter选择哪一个,IDE标准帧还是扩展帧。(这个是你能够接收ID的设置)
(4)接收中断使能
NVIC优先级配置
编写接收中断函数
发送函数
流程
在主函数中设置你想要发送的数据内容数组,长度。
配置你的node.ID,RTR,IDE,LEN,将buf中的内容填充好。
调用发送函数,将数据存储到发送邮箱上。
判断是否发送完成,没有等待一段时间,如果成功返回0,失败返回1
//=====================================
其中 msg[] 是想要发送的数组,len表示想要发送帧的长度
data总共可以接受8个字节。
STM32 CAN发送和接收都有邮箱的去接收。
unit8_t CAN_send_Msg(uint8_t* msg, uint8_t len)
{
uint8_t msgbox; //邮箱,存储你想要发送的帧frame
uint16_t i = 0;
CANTxMsg TxMessage;
TxMessage.Stdid = 0x12; //配置ID
// TxMessage.Extid = 0X12; //扩展帧29还是标准帧11
TxMessage.IDE = CAN_id_Standard; //显性0dominant
TxMessage.RTR= CAN_RTR_Data; //Data frame
TxMessage.DLC= len; //frame lenghth
for (i = 0; i < len; i++)
{
TxMessage.Data[i] = msg[i]; //把想要写的新消息写入buff中 0-8个字节
msgbox = CAN_Transmit(CAN1, &TxMessage); //最多发送8个字节
i = 0;
//循环等待 一段时间等待发送结束
while ((CAN_TransmitStatus(CAN1, mbox) == CAN_TxStatus_Failed) && (i < 0xfff))
i++;
if (i > 0xff)
{
return 1;
}
else
{
return 0;
}
}
}
//========================================
接收函数
//接收函数
//1.判断CAN接收邮箱是否收到数据
//2.BUF 数据缓存区,定义全局变量数组用于存放BUF数据
//3.返回值为0,无数据受到。其他受到数据。
unit8_t CAN_Receive_Msg(uint8_t* buf)
{
uint8_t i; //邮箱,存储你想要发送的帧frame
CANRxMsg TxMessage;
if (CAN_Message_pending(CAN1, CAN_FIFO) == 0) //没有接收到数据,直接退出
return 0;
CAN_receive(CAN1, CAN_FIFO, &RxMessage); //读取数据
for (i = 0; i < 8; i++)
{
buf[i] = RxMessage.Data[i]; //取出数据即可,如果存在数据,返回值不为0
}
return RxMessage.DLC; Date Length
}
主函数(伪代码)
设置发送msg数组和接收buf数组
int main()
{
- 主函数中调用transmit函数(填充发送的数组,选择发送的字节长度),至于结果你要看从设备的状态,可以通过仿真看从设备的状态。
从设备可能会发送接收成功的相应,不过这是CANopen协议
CAN_send_Msg(uint8_t* msg, uint8_t len)
- 上位机(其他设备)对从设备发送命令, 主函数中调用RECEIVE函数(选择哪个)
CAN_Receive_Msg(uint8_t* buf)
取出数据实现相应的操作
}
时间:2021-10-24 19:18:14 于 图书馆