当前位置:网站首页>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;
}
边栏推荐
猜你喜欢
随机推荐
cesium加载地图
Julia资料收集
PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization Paper Reading
[华为云在线课程][SQL语法分类][数据操作][学习笔记]
性能测试(04)-表达式和业务关联-JDBC关联
985毕业,工作3年,分享从阿里辞职到了国企的一路辛酸和经验
基于STM32设计的环境检测设备
shap库源码和代码实现
二叉树 前序是根在前(根左右)中序(左根右)
vite的原理,手写vite
使用pip成功安装某个库,但pycharm中找不到,此问题的解决方案
数据存储:对dataframe类,使用to_csv()将中文数据写入csv文件
Product Quantization (PQ)
PoseNet: A Convolutional Network for Real-Time 6-DOF Camera Relocalization论文阅读
json库的dumps()方法和loads()方法
无重复字符的最长子串
OpenSSF's open source software risk assessment tool: Scorecards
faster-rcnn学习
Multi-merchant mall system function disassembly 26 lectures - platform-side distribution settings
AQS同步组件-FutureTask解析和用例