STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx
《STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx》由会员分享,可在线阅读,更多相关《STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx(17页珍藏版)》请在冰豆网上搜索。
/****************************************************************************
*Copyright(c),2001-2060,ihealthlabs版权所有
****************************************************************************
*文件名称:
hart_task.h
*版本:
0.0.1
*作者:
lvchunhao
*创建日期:
2017年8月5日
*描述:
Uart1-Hart通讯
1.中断接收/查询发送
2.
****************************************************************************/
#ifndef_HART_TASK_H
#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]*同左
不需要使用u8Status[2]*需要使用u8Status[2]
***************************************************************/
typedefstruct_tagStHartDataFrame
{
#if0
uint8_tu8Preamble[20];//前导符:
作为通信同步的需要,5-20字节的0xFF,通常采用5个
字节
#endif
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);
#ifdef__cplusplus
}
#endif
#endif/*_HART_TASK_H*/
/****************************************************************************
*Copyright(c),2001-2060,ihealthlabs版权所有
****************************************************************************
*文件名称:
hart_task.c
*版本:
0.0.1
*作者:
lvchunhao
*创建日期:
2017年8月5日
*描述:
Uart1-Hart通讯
1.中断接收/查询发送
2.一包数据最大可能不超过60Bytes
3.波特率1200bps,每s传送150字节
****************************************************************************/
#include"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*)&x;
}
/**
*函数功能:
将接收到的1字节数据存入接收缓冲区中
*输入参数:
u8Data[in]:
数据
*返回值:
无
*说明:
自定义串口接收中断使用
*/
voidUart1RecvData(uint8_tu8Data)
{
if(u32Uart1WriteIndex==RECVBUFF_SIZE)
{
u32Uart1WriteIndex=0;
}
u8Uart1RxBuffer[u32Uart1WriteIndex++]=u8Data;
}
/**
*函数功能:
AD421发送函数(SPI-Master)[4-20ma正常电流编码]
*输入参数:
u8Data[in]:
数据
*返回值:
无
*说明:
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)
{
HAL_GPIO_WritePin(GPIOB,Hart_DATA_Pin,GPIO_PIN_RESET);
}
else
{
HAL_GPIO_WritePin(GPIOB,Hart_DATA_Pin,GPIO_PIN_SET);
}
HAL_GPIO_WritePin(GPIOB,Hart_CLOCK_Pin,GPIO_PIN_SET);
s32TmpData=s32TmpData>>1;
}
/*AD421的LATCH管脚上升沿将数据锁存到DAC锁存器中*/
HAL_GPIO_WritePin(GPIOB,Hart_LATCH_Pin,GPIO_PIN_RESET);
vTaskDelay(5);
HAL_GPIO_WritePin(GPIOB,Hart_LATCH_Pin,GPIO_PIN_SET);
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