#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; }