diff --git a/DS18B20/dallas_tools.c b/DS18B20/dallas_tools.c index b12d232..3603f08 100644 --- a/DS18B20/dallas_tools.c +++ b/DS18B20/dallas_tools.c @@ -102,16 +102,30 @@ HAL_StatusTypeDef Dallas_BusFirstInit(DALLAS_HandleTypeDef *hdallas, UART_Handle return HAL_ERROR; #ifndef UART_Driver - if(GPIOx == NULL) - return HAL_ERROR; - OW_TIM->CR1 |= TIM_CR1_CEN; - hdallas->onewire.DataPin = GPIO_Pin; - hdallas->onewire.DataPort = GPIOx; + if(GPIOx == NULL) + { + hdallas->onewire.DataPin = OW_Pin; + hdallas->onewire.DataPort = OW_GPIO_Port; + } + else + { + hdallas->onewire.DataPin = GPIO_Pin; + hdallas->onewire.DataPort = GPIOx; + } + for (uint32_t i = 0; i < 16; i++) + { + if (hdallas->onewire.DataPin & (1 << i)) + { + hdallas->onewire.DataPinNumb = i; + break; + } + } #else if(huart == NULL) - return HAL_ERROR; - hdallas->onewire.huart = huart; + hdallas->onewire.huart = &OW_UART_Handle; + else + hdallas->onewire.huart = huart; #endif /* Инициализация onewire и поиск датчиков*/ OneWire_Init(&hdallas->onewire); diff --git a/DS18B20/onewire.h b/DS18B20/onewire.h index 7871140..60d008b 100644 --- a/DS18B20/onewire.h +++ b/DS18B20/onewire.h @@ -50,6 +50,7 @@ typedef struct #if defined(UART_Driver) UART_HandleTypeDef *huart; #else + uint16_t DataPinNumb; uint16_t DataPin; GPIO_TypeDef *DataPort; #endif diff --git a/DS18B20/ow_port.c b/DS18B20/ow_port.c index b4b0d8c..7603b92 100644 --- a/DS18B20/ow_port.c +++ b/DS18B20/ow_port.c @@ -7,7 +7,6 @@ #include "ow_port.h" #include "onewire.h" #include "tim.h" -uint32_t pin_pos = (OW_Pin_Numb < 8) ? (OW_Pin_Numb * 4) : ((OW_Pin_Numb - 8) * 4); /** * @brief The internal function is used as gpio pin mode @@ -18,7 +17,8 @@ void OneWire_Pin_Mode(OneWire_t* OW, PinMode Mode) { #if defined(UART_Driver) #elif defined(CMSIS_Driver) -volatile uint32_t *config_reg = (OW_Pin_Numb < 8) ? &(OW->DataPort->CRL) : &(OW->DataPort->CRH); + volatile uint32_t *config_reg = (OW->DataPinNumb < 8) ? &(OW->DataPort->CRL) : &(OW->DataPort->CRH); + uint32_t pin_pos = (OW->DataPinNumb < 8) ? (OW->DataPinNumb * 4) : ((OW->DataPinNumb - 8) * 4); // —брос текущих 4 бит (CNF + MODE) *config_reg &= ~(0xF << pin_pos); @@ -27,7 +27,7 @@ volatile uint32_t *config_reg = (OW_Pin_Numb < 8) ? &(OW->DataPort->CRL) : &(OW- // ¬ход с подт¤жкой или без Ц например, CNF = 0b01, MODE = 0b00 // «десь устанавливаем вход с подт¤жкой: *config_reg |= (0x8 << pin_pos); // CNF=10, MODE=00 (вход с подт¤жкой) - OW->DataPort->ODR |= (1 << OW_Pin_Numb); // ¬ключить подт¤жку вверх + OW->DataPort->ODR |= (1 << OW->DataPinNumb); // ¬ключить подт¤жку вверх } else { @@ -118,3 +118,4 @@ void OneWire_Delay_us(uint32_t us) prev = curr; } } + diff --git a/DS18B20/ow_port.h b/DS18B20/ow_port.h index f0c9cb2..32035d0 100644 --- a/DS18B20/ow_port.h +++ b/DS18B20/ow_port.h @@ -13,49 +13,53 @@ #include "stm32f1xx_hal.h" /* I/O Port ------------------------------------------------------------------*/ -//#define UART_Driver ///< использовтаь UART (onewire_uart.c/.h) +#define UART_Driver ///< использовтаь UART (onewire_uart.c/.h) //#define LL_Driver ///< использовать CMSIS для управления ножкой #define CMSIS_Driver ///< использовать CMSIS для управления ножкой // если ничего не выбрано - используется HAL +/** + * @defgroup DEFAULT_SETTINGS Дефолтные параметры для OW + * @details Определены дефолтные параметры для OW, применятся если передать NULL в Dallas_BusFirstInit. + * @{ + */ + +/** + * @brief Порт вывода для шины 1-Wire. + * @details Указывает порт GPIO, к которому подключена линия данных 1-Wire (например, для DS18B20). + */ +#define OW_UART_Handle huart1 /** - * @def OW_GPIO_Port * @brief Порт вывода для шины 1-Wire. * @details Указывает порт GPIO, к которому подключена линия данных 1-Wire (например, для DS18B20). */ #define OW_GPIO_Port GPIOA /** - * @def OW_Pin_Numb - * @brief Номер пина в порту OW_GPIO_Port. - * @details Используется для формирования маски пина и настройки ввода/вывода. - */ -#define OW_Pin_Numb 9 - -/** - * @def OW_Pin * @brief Маска пина, соответствующая номеру OW_Pin_Numb. * @details Используется при доступе к регистрам порта для управления состоянием линии 1-Wire. */ -#define OW_Pin (1<