STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx

上传人:b****9 文档编号:92720 上传时间:2022-10-02 格式:DOCX 页数:17 大小:22.29KB
下载 相关 举报
STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx_第1页
第1页 / 共17页
STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx_第2页
第2页 / 共17页
STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx_第3页
第3页 / 共17页
STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx_第4页
第4页 / 共17页
STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx

《STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx》由会员分享,可在线阅读,更多相关《STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx(17页珍藏版)》请在冰豆网上搜索。

STM32-HT1200M-AD421之Hart从机方案设计代码(测试OK).docx

/****************************************************************************

*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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 职业教育 > 职业技术培训

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1