STM32的一线协议

#ifndef ONE_WIRE_CFG_H
#define ONE_WIRE_CFG_H
//
#include "complier_lib.h"
#ifdef USE_MCU_STM32
	#include "delay_task.h"
	#include "gpio_task.h"
#endif
 
//---定义结构体
typedef struct _OneWire_HandlerType		OneWire_HandlerType;
//---定义指针结构体
typedef struct _OneWire_HandlerType		*pOneWire_HandlerType;
//---定义
struct _OneWire_HandlerType
{
	UINT32_T		msgBit;																									//---端口序号
	GPIO_TypeDef	*msgPort;																								//---端口号	
	void			(*msgDelay)(UINT32_T delay);																			//---延时函数
	UINT8_T			(*msgTask)(OneWire_HandlerType *OneWireHandlerType,UINT16_T length,UINT8_T *pVal,UINT8_T msg);			//---消息处理函数
};
 
//---函数定义
UINT8_T OneWire_Init(OneWire_HandlerType *OneWireHandlerType, void(*msgDelay)(UINT32_T delay));
UINT8_T OneWire_DeInit(OneWire_HandlerType *OneWireHandlerType);
UINT8_T OneWire_START(OneWire_HandlerType *OneWireHandlerType);
UINT8_T OneWire_WriteBit(OneWire_HandlerType *OneWireHandlerType, UINT8_T bitVal);
UINT8_T OneWire_ReadBit(OneWire_HandlerType *OneWireHandlerType);
UINT8_T OneWire_WriteByte(OneWire_HandlerType *OneWireHandlerType, UINT8_T val);
UINT8_T OneWire_ReadByte(OneWire_HandlerType *OneWireHandlerType);
 
//
#endif /*ONE_WIRE_CFG_H */
#include "one_wire_cfg.h"
 
 
///
//函	   数:
//功	   能:
//输入参数: 
//输出参数: 
//说	   明:
//
UINT8_T OneWire_Init(OneWire_HandlerType *OneWireHandlerType, void(*msgDelay)(UINT32_T delay))
{
#ifdef USE_MCU_STM32
	if ((OneWireHandlerType==NULL)||(OneWireHandlerType->msgPort==NULL))
	{
		return ERROR_1;
	}
	//---使能端口时钟
	GPIOTask_Clock(OneWireHandlerType->msgPort, 1);
	LL_GPIO_InitTypeDef GPIO_InitStruct;
	//---GPIO的初始化
	GPIO_InitStruct.Pin			= OneWireHandlerType->msgBit;			//---对应的GPIO的引脚
	GPIO_InitStruct.Mode		= LL_GPIO_MODE_OUTPUT;					//---配置状态为输出模式
	GPIO_InitStruct.Speed		= LL_GPIO_SPEED_FREQ_VERY_HIGH;			//---GPIO的速度
	GPIO_InitStruct.OutputType	= LL_GPIO_OUTPUT_OPENDRAIN;				//---输出模式---开漏输出
	GPIO_InitStruct.Pull		= LL_GPIO_PULL_UP;						//---上拉使能
	//---初始化端口
	LL_GPIO_Init(OneWireHandlerType->msgPort, &GPIO_InitStruct);
#endif
	GPIO_OUT_1(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	//---延时函数
	if (msgDelay!=NULL)
	{
		OneWireHandlerType->msgDelay = msgDelay;
	}
	//---消息函数
	OneWireHandlerType->msgTask = NULL;
	return OK_0;
}
 
///
//函	   数:
//功	   能:
//输入参数: 
//输出参数: 
//说	   明:
//
UINT8_T OneWire_DeInit(OneWire_HandlerType *OneWireHandlerType)
{
#ifdef USE_MCU_STM32
	LL_GPIO_DeInit(OneWireHandlerType->msgPort);
#endif
	GPIO_OUT_1(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	//---消息函数
	OneWireHandlerType->msgTask = NULL;
}
 
///
//函	   数:
//功	   能:
//输入参数: 
//输出参数: 
//说	   明:
//
UINT8_T OneWire_START(OneWire_HandlerType *OneWireHandlerType)
{
	UINT8_T _return = OK_0;
	//---设置为输出且输出零
	GPIO_OUT_0(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	//>=480
	if (OneWireHandlerType->msgDelay!=NULL)
	{
		OneWireHandlerType->msgDelay(500);
	}
	//---输出高电平
	GPIO_OUT_1(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	//15us~60us之间
	if (OneWireHandlerType->msgDelay != NULL)
	{
		OneWireHandlerType->msgDelay(50);
	}			
	_return = GPIO_GET_STATE(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	//60us~240us
	if (OneWireHandlerType->msgDelay != NULL)
	{
		OneWireHandlerType->msgDelay(50);
	}			
	return _return;
}
 
///
//函	   数:
//功	   能:
//输入参数: 
//输出参数: 
//说	   明:
//
UINT8_T OneWire_WriteBit(OneWire_HandlerType *OneWireHandlerType, UINT8_T bitVal)
{
	//---控制总线,强制拉低
	GPIO_OUT_0(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	//=4
	if (OneWireHandlerType->msgDelay != NULL)
	{
		OneWireHandlerType->msgDelay(4);
	}
	//---发送数据
	if (bitVal)
	{
		//---释放总线
		GPIO_OUT_1(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
		
	}
	//=60us 
	if (OneWireHandlerType->msgDelay != NULL)
	{
		OneWireHandlerType->msgDelay(50);
	}		
	//---释放总线
	GPIO_OUT_1(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	//=4
	if (OneWireHandlerType->msgDelay != NULL)
	{
		OneWireHandlerType->msgDelay(4);
	}
	return 0;
}
 
///
//函	   数:
//功	   能:
//输入参数: 
//输出参数: 
//说	   明:
//
UINT8_T OneWire_ReadBit(OneWire_HandlerType *OneWireHandlerType)
{
	UINT8_T _return = 0;
	//---控制总线,强制拉低
	GPIO_OUT_0(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	//=8
	if (OneWireHandlerType->msgDelay != NULL)
	{
		OneWireHandlerType->msgDelay(8);
	}
	//---释放总线
	GPIO_OUT_1(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	//=14
	if (OneWireHandlerType->msgDelay != NULL)
	{
		OneWireHandlerType->msgDelay(14);
	}
	//---读取数据
	if (GPIO_GET_STATE(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit))
	{
		_return = 1;
	}
	//=40
	if (OneWireHandlerType->msgDelay != NULL)
	{
		OneWireHandlerType->msgDelay(40);
	}
	//---释放总线
	GPIO_OUT_1(OneWireHandlerType->msgPort, OneWireHandlerType->msgBit);
	return _return;
}
 
///
//函	   数:
//功	   能:
//输入参数: 
//输出参数: 
//说	   明:
//
UINT8_T OneWire_WriteByte(OneWire_HandlerType *OneWireHandlerType, UINT8_T val)
{
	UINT8_T i = 0;
	for (i = 0; i < 8; i++)
	{
		//---先发送低位数据
		OneWire_WriteBit(OneWireHandlerType, (val & 0x01));
		val >>= 1;
	}
	return OK_0;
}
 
///
//函	   数:
//功	   能:
//输入参数: 
//输出参数: 
//说	   明:
//
UINT8_T OneWire_ReadByte(OneWire_HandlerType *OneWireHandlerType)
{
	UINT8_T _return = 0, i = 0;
	for (i = 0; i < 8; i++)
	{
		_return |= (OneWire_ReadBit(OneWireHandlerType) << i);
	}
	//=5
	if (OneWireHandlerType->msgDelay != NULL)
	{
		OneWireHandlerType->msgDelay(5);
	}
	return _return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值