STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK)文档格式.docx
- 文档编号:13023679
- 上传时间:2022-10-02
- 格式:DOCX
- 页数:17
- 大小:22.29KB
STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK)文档格式.docx
《STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK)文档格式.docx》由会员分享,可在线阅读,更多相关《STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK)文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
#define_HART_TASK_H
#ifdef__cplusplus
extern"
C"
{
#endif
#include"
stdint.h"
/***************************************************************
*1.主机长度最长为25字节,从机最长为27字节(只有从机有响应码2byte
*2.u8Start&
0x8000==0为主从短帧结构*从主短帧结构
u8Addr只用1个字节u8Addr[0]*同左
不需要使用u8Status[2]*需要使用u8Status[2]
*3.u8Start&
0x8000==1为主从长帧结构:
*从主长帧结构
u8Addr需要全部使用5个字节u8Addr[5]*同左
***************************************************************/
typedefstruct_tagStHartDataFrame
{
#if0
uint8_tu8Preamble[20];
//前导符:
作为通信同步的需要,5-20字节的0xFF,通常采用5个
字节
uint8_tu8Start;
//定界符:
主->
从(短帧0x02长帧0x82)从->
主(短0x06长0x86)突发
(0x01/0x81)
uint8_tu8Addr[5];
//地址:
短帧结构中1个字节,长帧结构中5个字节
uint8_tu8Command;
//命令:
范围为253个,用Hex表示,31127254255为预留值
uint8_tu8Bcnt;
//长度:
从该字节下一字节-->
到最后的字节数(不包括校验字节)
uint8_tu8Status[2];
//响应码:
只存在于从机响应主机消息的时候
uint8_tu8Data[25];
//数据:
最多25字节
uint8_tu8Parity;
//校验:
奇偶纵向校验,从起始字节-->
奇偶校验前一字节为止
}StHartDataFrame;
typedefenum_tagEmHartFrameType
TYPE_MAIN_SLAVE_SHORT_FRAME=0x02,//主机到从机短帧结构
TYPE_MAIN_SLAVE_LONG_FRAME=0x82,//主机到从机长帧结构
TYPE_SLAVE_MAIN_SHORT_FRAME=0x06,//从机到主机短帧结构
TYPE_SLAVE_MAIN_LONG_FRAME=0x86,//从机到主机长帧结构
TYPE_BURST_MODE_SHORT_FRAME=0x01,//突发模式短帧结构
TYPE_BURST_MODE_LONG_FRAME=0x81,//突发模式长帧结构
}EmHartFrameType;
voidUart1RecvData(uint8_tu8Data);
voidvTaskHartCommunicate(void*pArgs);
}
#endif/*_HART_TASK_H*/
hart_task.c
2.一包数据最大可能不超过60Bytes
3.波特率1200bps,每s传送150字节
common.h"
//Uart1parameters
staticuint32_tu32Uart1WriteIndex=0;
uint8_tu8Uart1RxBuffer[RECVBUFF_SIZE];
//串口Uart1接收缓冲区
uint8_tu8Uart1TxBuffer[SENDBUFF_SIZE];
//串口Uart1发送缓冲区
//otherparameters
uint8_tu8HartCMD_0[]={0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X80,0X00,0X00,0X82};
//短帧
通用命令0:
读标识码
//Hartprotol
StHartDataFramestHartFrameRecv;
//Hart接收处理结构体
StHartDataFramestHartFrameSend;
//Hart发送处理结构体
/*
1.例如0x413FA000转换之后为11.976562
2.floatb=*(float*)&
a;
物理转换,把a所在的内存空间值当做float解释
3.floatb=(float)a;
逻辑转换,只是简单的去掉小数部分而已
4.Ubuntu上eclipse测试ok,需注意大小端问题
*/
//十六进制转十进制浮点型
floatIEEE754Int2Float(intx)
return*(float*)&
x;
//十进制浮点型转十六进制
intIEEE754Float2Int(floatx)
return*(int*)&
/**
*函数功能:
将接收到的1字节数据存入接收缓冲区中
*输入参数:
u8Data[in]:
数据
*返回值:
无
*说明:
自定义串口接收中断使用
voidUart1RecvData(uint8_tu8Data)
if(u32Uart1WriteIndex==RECVBUFF_SIZE)
u32Uart1WriteIndex=0;
u8Uart1RxBuffer[u32Uart1WriteIndex++]=u8Data;
AD421发送函数(SPI-Master)[4-20ma正常电流编码]
1.正常电流4-20ma1lsb=244nA16bit(20-4)/65536ma
*2.警报电流<
3.5ma&
>
24ma1lsb=244nA17bit(32-0)/131072ma
int32_tSPI2TransmitAD421(int32_ts32pData)
int32_ti,s32Ret=0;
int32_ts32TmpData=0x8000;
/*AD421-SPI这三管脚初始化都为0*/
HAL_GPIO_WritePin(GPIOB,Hart_CLOCK_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,Hart_DATA_Pin,GPIO_PIN_RESET);
/*两个Latch上升沿之间16个周期clock为正常电流*/
HAL_GPIO_WritePin(GPIOB,Hart_LATCH_Pin,GPIO_PIN_RESET);
vTaskDelay(5);
HAL_GPIO_WritePin(GPIOB,Hart_LATCH_Pin,GPIO_PIN_SET);
/*发送数据MSB先发,Clock上升沿有效*/
for(i=0;
i<
16;
i++)
HAL_GPIO_WritePin(GPIOB,Hart_CLOCK_Pin,GPIO_PIN_RESET);
if((s32TmpData&
s32pData)==0x0)
else
HAL_GPIO_WritePin(GPIOB,Hart_DATA_Pin,GPIO_PIN_SET);
s32TmpData=s32TmpData>
>
1;
/*AD421的LATCH管脚上升沿将数据锁存到DAC锁存器中*/
returns32Ret;
Hart信号发送函数
pData[in]:
需要发送的数据
*输入参数:
Size[in]:
发送数据长度
HAL_OK/orother
int32_tHartDataSend(uint8_t*pData,uint16_tSize)
int32_ts32Err=0;
//发送数据时INRTS=0,发送完成后INRTS=1等待接收
HAL_GPIO_WritePin(Hart_INRTS_GPIO_Port,Hart_INRTS_Pin,GPIO_PIN_RESET);
s32Err=HAL_UART_Send(&
huart1,pData,Size);
//需要延时关闭,具体延时时间需要测试暂定为50ms
vTaskDelay(50);
//HAL_GPIO_WritePin(Hart_INRT
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32 HT1200M AD421 Hart 方案设计 代码 测试 OK
![提示](https://static.bdocx.com/images/bang_tan.gif)