当前位置:网站首页>CAN总线发送数据
CAN总线发送数据
2022-08-09 10:56:00 【zhaodong_jack】
TransmitMailbox = CAN_Transmit(CAN1, &TxMessage);//发送数据
while((CAN_TransmitStatus(CAN1,TransmitMailbox))!=CANTXOK);//等待数据发送完成
uint8_t CAN_Transmit(CAN_TypeDef* CANx, CanTxMsg* TxMessage)
{
uint8_t transmit_mailbox = 0;
/* Check the parameters */
assert_param(IS_CAN_ALL_PERIPH(CANx));
assert_param(IS_CAN_IDTYPE(TxMessage->IDE));
assert_param(IS_CAN_RTR(TxMessage->RTR));
assert_param(IS_CAN_DLC(TxMessage->DLC));
/* Select one empty transmit mailbox */
//选择一个合适的邮箱
if ((CANx->TSR&CAN_TSR_TME0) == CAN_TSR_TME0)//判断邮箱0是否空闲
{
transmit_mailbox = 0;
}
else if ((CANx->TSR&CAN_TSR_TME1) == CAN_TSR_TME1)//判断邮箱0是否空闲
{
transmit_mailbox = 1;
}
else if ((CANx->TSR&CAN_TSR_TME2) == CAN_TSR_TME2)//判断邮箱0是否空闲
{
transmit_mailbox = 2;
}
else
{
transmit_mailbox = CAN_TxStatus_NoMailBox;
}
if (transmit_mailbox != CAN_TxStatus_NoMailBox)//有空闲的邮箱
{
/* Set up the Id */
CANx->sTxMailBox[transmit_mailbox].TIR &= TMIDxR_TXRQ;//清除对应邮箱的TXRQ位
if (TxMessage->IDE == CAN_Id_Standard)
{
assert_param(IS_CAN_STDID(TxMessage->StdId));
CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->StdId << 21) | \
TxMessage->RTR);//将标准ID值赋值到寄存器
}
else
{
assert_param(IS_CAN_EXTID(TxMessage->ExtId));
CANx->sTxMailBox[transmit_mailbox].TIR |= ((TxMessage->ExtId << 3) | \
TxMessage->IDE | \
TxMessage->RTR);//扩展ID值赋值到TIR寄存器
}
/* Set up the DLC */
TxMessage->DLC &= (uint8_t)0x0000000F;
CANx->sTxMailBox[transmit_mailbox].TDTR &= (uint32_t)0xFFFFFFF0;
CANx->sTxMailBox[transmit_mailbox].TDTR |= TxMessage->DLC;//赋DLC的值到TDTR寄存器中
/* Set up the data field */
CANx->sTxMailBox[transmit_mailbox].TDLR = (((uint32_t)TxMessage->Data[3] << 24) |
((uint32_t)TxMessage->Data[2] << 16) |
((uint32_t)TxMessage->Data[1] << 8) |
((uint32_t)TxMessage->Data[0]));//低4字节数据赋值到低字节数据寄存器
CANx->sTxMailBox[transmit_mailbox].TDHR = (((uint32_t)TxMessage->Data[7] << 24) |
((uint32_t)TxMessage->Data[6] << 16) |
((uint32_t)TxMessage->Data[5] << 8) |
((uint32_t)TxMessage->Data[4]));//高4字节数据赋值到高字节数据寄存器
/* Request transmission */
CANx->sTxMailBox[transmit_mailbox].TIR |= TMIDxR_TXRQ;//软件置高TXRQ位,请求发送邮箱的数据
}
return transmit_mailbox;
}
边栏推荐
- 情感分析SowNLP词库
- Looper 原理浅析
- 15.10 the POSIX semaphore Unix environment programming chapter 15
- arcgis制图之天地图符号样式配置
- 多商户商城系统功能拆解26讲-平台端分销设置
- 美的数字化平台 iBUILDING 背后的技术选型
- 数据存储:对dataframe类,使用to_csv()将中文数据写入csv文件
- torch.stack()的官方解释,详解以及例子
- tensorflow和numpy对应的版本,报FutureWarning: Passing (type, 1) or ‘1type‘ as a synonym of type is deprecate
- 聚类了解
猜你喜欢

非科班毕业生,五面阿里:四轮技术面+HR一面已拿offer

Quartz分布式实现

∘(空心的点乘)的数学含义

golang 三种指针类型具体类型的指针、unsafe.Pointer、uintptr作用

Shell script combat (2nd edition) / People's Posts and Telecommunications Press Script 1 Find programs in the PATH

vite的原理,手写vite

类与对象 (下)

微信小程序——天气查询

OpenSSF's open source software risk assessment tool: Scorecards

美的数字化平台 iBUILDING 背后的技术选型
随机推荐
tensorflow实现线性方程的参数调整
Jmeter BeanShell post processor
Missing URI template variable ‘employeeNumber‘ for method parameter of type String
基于STM32设计的环境检测设备
The torch. The stack () official explanation, explanation and example
如何在gazebo进行 joint的转动控制
Unix Environment Programming Chapter 15 15.3 Functions popen and pclose
华为VRRP+MSTP联动接口检测实验案例
Netscope: Online visualization tool for neural network structures
绝了,这套RESTful API接口设计总结
bit、byte、KB、M、G、T相互关系
golang源代码阅读,sync系列-Cond
pip common commands and changing source files
在线编译matlab,亲测好用
性能测试(04)-表达式和业务关联-JDBC关联
信息系统项目的十大管理
爬虫实例,获取豆瓣上某部电影的评论
Product Quantization (PQ)
torch.stack()的官方解释,详解以及例子
日期工具类