Added DS18B20 driver.

This commit is contained in:
imi415 2021-05-22 02:02:15 +08:00
parent 08074f4051
commit 2fb8c03a22
Signed by: imi415
GPG Key ID: 17F01E106F9F5E0A
10 changed files with 219 additions and 47 deletions

View File

@ -0,0 +1,21 @@
#ifndef __DS18B20_ONEWIRE_H
#define __DS18B20_ONEWIRE_H
#include "one_wire.h"
typedef struct {
uint8_t t_high;
uint8_t t_low;
int16_t t_decimal;
} ds18b20_temp_t;
typedef struct {
onewire_t *ow_driver;
onewire_rom_num_t rom;
} ds18b20_t;
onewire_ret_t ds18b20_start_convert(ds18b20_t *ds);
uint8_t ds18b20_check_busy(ds18b20_t *ds);
onewire_ret_t ds18b20_read_temperature(ds18b20_t *ds, ds18b20_temp_t *temp);
#endif

View File

@ -58,9 +58,9 @@ void Error_Handler(void);
/* USER CODE END EFP */
/* Private defines -----------------------------------------------------------*/
#define LED_Pin GPIO_PIN_13
#define LED_GPIO_Port GPIOC
#define WIRE_IO_Pin GPIO_PIN_0
#define LED_Pin GPIO_PIN_9
#define LED_GPIO_Port GPIOA
#define WIRE_IO_Pin GPIO_PIN_8
#define WIRE_IO_GPIO_Port GPIOB
/* USER CODE BEGIN Private defines */

View File

@ -33,6 +33,10 @@ typedef struct {
} onewire_t;
uint8_t onewire_bus_reset(onewire_t *ow);
onewire_ret_t onrwire_bus_write_bit(onewire_t *ow, uint8_t bit);
uint8_t onewire_bus_read_bit(onewire_t *ow);
onewire_ret_t onewire_bus_write_byte(onewire_t *ow, uint8_t byte);
uint8_t onewire_bus_read_byte(onewire_t *ow);
onewire_ret_t onewire_bus_search_init(onewire_t *ow);

View File

@ -48,7 +48,7 @@
/*#define HAL_I2C_MODULE_ENABLED */
/*#define HAL_I2S_MODULE_ENABLED */
/*#define HAL_IRDA_MODULE_ENABLED */
/*#define HAL_IWDG_MODULE_ENABLED */
#define HAL_IWDG_MODULE_ENABLED
/*#define HAL_NOR_MODULE_ENABLED */
/*#define HAL_NAND_MODULE_ENABLED */
/*#define HAL_PCCARD_MODULE_ENABLED */

View File

@ -0,0 +1,44 @@
#include "ds18b20_onewire.h"
static onewire_ret_t ds18b20_match_rom(ds18b20_t *ds) {
onewire_bus_write_byte(ds->ow_driver, 0x55); // Issue match ROM
for(uint8_t i = 0; i < 8; i++) {
onewire_bus_write_byte(ds->ow_driver, ds->rom.rom_num[i]);
}
return OW_OK;
}
onewire_ret_t ds18b20_start_convert(ds18b20_t *ds) {
onewire_bus_reset(ds->ow_driver);
ds18b20_match_rom(ds);
onewire_bus_write_byte(ds->ow_driver, 0x44); // Issue convert T command
return OW_OK;
}
uint8_t ds18b20_check_busy(ds18b20_t *ds) {
uint8_t done = onewire_bus_read_bit(ds->ow_driver);
if(done) return 0;
return 1;
}
onewire_ret_t ds18b20_read_temperature(ds18b20_t *ds, ds18b20_temp_t *temp) {
onewire_bus_reset(ds->ow_driver);
ds18b20_match_rom(ds);
onewire_bus_write_byte(ds->ow_driver, 0xBE); // Issue read scrachpad command
temp->t_low = onewire_bus_read_byte(ds->ow_driver);
temp->t_high = onewire_bus_read_byte(ds->ow_driver);
onewire_bus_reset(ds->ow_driver);
temp->t_decimal = (temp->t_high & 0xF8) ? 0x8000 : 0x0000;
temp->t_decimal |= (temp->t_high & 0x07) << 8U;
temp->t_decimal |= temp->t_low;
temp->t_decimal = temp->t_decimal * 625 / 1000;
return OW_OK;
}

View File

@ -24,9 +24,12 @@
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <string.h>
#include "usbd_cdc_if.h"
#include "one_wire_impl_ll.h"
#include "ds18b20_onewire.h"
/* USER CODE END Includes */
@ -45,12 +48,13 @@
/* USER CODE END PM */
/* Private variables ---------------------------------------------------------*/
IWDG_HandleTypeDef hiwdg;
/* USER CODE BEGIN PV */
onewire_impl_ll_t g_ow_impl = {
.GPIOx = WIRE_IO_GPIO_Port,
.PinMask = LL_GPIO_PIN_0
.PinMask = LL_GPIO_PIN_8
};
onewire_t g_ow = {
@ -67,8 +71,11 @@ onewire_t g_ow = {
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_IWDG_Init(void);
/* USER CODE BEGIN PFP */
void USB_ReEnum(void);
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
@ -100,21 +107,27 @@ int main(void)
/* USER CODE BEGIN SysInit */
USB_ReEnum();
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USB_DEVICE_Init();
MX_IWDG_Init();
/* USER CODE BEGIN 2 */
onewire_bus_reset(&g_ow);
onewire_rom_num_t rom_num;
onewire_bus_search_init(&g_ow);
while(onewire_bus_search_nextdev(&g_ow, &rom_num)){
//register_ow_dev(rom_num);
}
ds18b20_t ds_sensor = {
.ow_driver = &g_ow,
};
ds18b20_temp_t ds_temp;
char cdc_buffer[255];
/* USER CODE END 2 */
@ -122,9 +135,31 @@ int main(void)
/* USER CODE BEGIN WHILE */
while (1)
{
CDC_Transmit_FS((uint8_t *)"H+\r\n", 4);
onewire_bus_search_init(&g_ow);
while(onewire_bus_search_nextdev(&g_ow, &rom_num) != OW_ERROR){
ds_sensor.rom = rom_num;
ds18b20_start_convert(&ds_sensor);
while(ds18b20_check_busy(&ds_sensor)) {
HAL_Delay(10);
}
ds18b20_read_temperature(&ds_sensor, &ds_temp);
snprintf(cdc_buffer, 255, "%02x%02x%02x%02x%02x%02x%02x%02x\t%d\r\n",
rom_num.rom_num[0],
rom_num.rom_num[1],
rom_num.rom_num[2],
rom_num.rom_num[3],
rom_num.rom_num[4],
rom_num.rom_num[5],
rom_num.rom_num[6],
rom_num.rom_num[7],
ds_temp.t_decimal
);
CDC_Transmit_FS((uint8_t *)cdc_buffer, strlen(cdc_buffer));
HAL_IWDG_Refresh(&hiwdg);
}
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
HAL_Delay(1000);
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
@ -145,10 +180,11 @@ void SystemClock_Config(void)
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
@ -180,6 +216,34 @@ void SystemClock_Config(void)
HAL_RCC_EnableCSS();
}
/**
* @brief IWDG Initialization Function
* @param None
* @retval None
*/
static void MX_IWDG_Init(void)
{
/* USER CODE BEGIN IWDG_Init 0 */
/* USER CODE END IWDG_Init 0 */
/* USER CODE BEGIN IWDG_Init 1 */
/* USER CODE END IWDG_Init 1 */
hiwdg.Instance = IWDG;
hiwdg.Init.Prescaler = IWDG_PRESCALER_128;
hiwdg.Init.Reload = 4095;
if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN IWDG_Init 2 */
/* USER CODE END IWDG_Init 2 */
}
/**
* @brief GPIO Initialization Function
* @param None
@ -190,10 +254,9 @@ static void MX_GPIO_Init(void)
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* GPIO Ports Clock Enable */
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
@ -219,6 +282,24 @@ static void MX_GPIO_Init(void)
/* USER CODE BEGIN 4 */
void USB_ReEnum(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_12;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_Delay(100);
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12);
__HAL_RCC_GPIOA_CLK_DISABLE();
}
/* USER CODE END 4 */
/**

View File

@ -97,6 +97,17 @@ static inline onewire_ret_t onewire_op_write_bit(onewire_t *ow, uint8_t bit) {
return OW_OK;
}
onewire_ret_t onrwire_bus_write_bit(onewire_t *ow, uint8_t bit) {
if(bit) onewire_op_write_one_bit(ow);
else onewire_op_write_zero_bit(ow);
return OW_OK;
}
uint8_t onewire_bus_read_bit(onewire_t *ow) {
return onewire_op_read_bit(ow);
}
onewire_ret_t onewire_bus_write_byte(onewire_t *ow, uint8_t byte) {
for(uint8_t i = 0; i < 8; i++) {
onewire_op_write_bit(ow, byte & 0x01);

View File

@ -2,10 +2,12 @@
onewire_ret_t ow_impl_delay_us(onewire_impl_ll_t *impl, uint32_t usec) {
if(usec <= 5) return OW_OK;
LL_RCC_ClocksTypeDef clocks;
LL_RCC_GetSystemClocksFreq(&clocks);
uint32_t ticks = usec * (clocks.HCLK_Frequency / 1000000);
uint32_t ticks = (usec - 5) * (clocks.HCLK_Frequency / 1000000);
SysTick->CTRL = SYSTICK_CLKSOURCE_HCLK;

View File

@ -1,5 +1,5 @@
##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [3.13.0-B3] date: [Fri May 21 00:30:07 CST 2021]
# File automatically-generated by tool: [projectgenerator] version: [3.13.0-B3] date: [Sat May 22 01:45:40 CST 2021]
##########################################################################################################################
# ------------------------------------------------
@ -38,6 +38,7 @@ BUILD_DIR = build
C_SOURCES = \
Core/Src/one_wire.c \
Core/Src/one_wire_impl_ll.c \
Core/Src/ds18b20_onewire.c \
Core/Src/main.c \
Core/Src/stm32f1xx_it.c \
Core/Src/stm32f1xx_hal_msp.c \
@ -68,7 +69,8 @@ Core/Src/system_stm32f1xx.c \
Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_core.c \
Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ctlreq.c \
Middlewares/ST/STM32_USB_Device_Library/Core/Src/usbd_ioreq.c \
Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c
Middlewares/ST/STM32_USB_Device_Library/Class/CDC/Src/usbd_cdc.c \
Drivers/STM32F1xx_HAL_Driver/Src/stm32f1xx_hal_iwdg.c
# ASM sources
ASM_SOURCES = \

View File

@ -1,27 +1,32 @@
#MicroXplorer Configuration settings - do not modify
File.Version=6
GPIO.groupedBy=Group By Peripherals
IWDG.IPParameters=Reload,Prescaler
IWDG.Prescaler=IWDG_PRESCALER_128
IWDG.Reload=4095
KeepUserPlacement=false
Mcu.Family=STM32F1
Mcu.IP0=NVIC
Mcu.IP1=RCC
Mcu.IP2=SYS
Mcu.IP3=USB
Mcu.IP4=USB_DEVICE
Mcu.IPNb=5
Mcu.IP0=IWDG
Mcu.IP1=NVIC
Mcu.IP2=RCC
Mcu.IP3=SYS
Mcu.IP4=USB
Mcu.IP5=USB_DEVICE
Mcu.IPNb=6
Mcu.Name=STM32F103C(8-B)Tx
Mcu.Package=LQFP48
Mcu.Pin0=PC13-TAMPER-RTC
Mcu.Pin1=PD0-OSC_IN
Mcu.Pin2=PD1-OSC_OUT
Mcu.Pin3=PB0
Mcu.Pin4=PA11
Mcu.Pin5=PA12
Mcu.Pin6=PA13
Mcu.Pin7=PA14
Mcu.Pin8=VP_SYS_VS_tim4
Mcu.Pin9=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.PinsNb=10
Mcu.Pin0=PD0-OSC_IN
Mcu.Pin1=PD1-OSC_OUT
Mcu.Pin10=VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS
Mcu.Pin2=PA9
Mcu.Pin3=PA11
Mcu.Pin4=PA12
Mcu.Pin5=PA13
Mcu.Pin6=PA14
Mcu.Pin7=PB8
Mcu.Pin8=VP_IWDG_VS_IWDG
Mcu.Pin9=VP_SYS_VS_tim4
Mcu.PinsNb=11
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32F103CBTx
@ -54,18 +59,18 @@ PA13.Signal=SYS_JTMS-SWDIO
PA14.Locked=true
PA14.Mode=Serial_Wire
PA14.Signal=SYS_JTCK-SWCLK
PB0.GPIOParameters=GPIO_Label,GPIO_Speed,GPIO_ModeDefaultOutputPP,PinState,GPIO_PuPd
PB0.GPIO_Label=WIRE_IO
PB0.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
PB0.GPIO_PuPd=GPIO_PULLUP
PB0.GPIO_Speed=GPIO_SPEED_FREQ_LOW
PB0.Locked=true
PB0.PinState=GPIO_PIN_SET
PB0.Signal=GPIO_Output
PC13-TAMPER-RTC.GPIOParameters=GPIO_Label
PC13-TAMPER-RTC.GPIO_Label=LED
PC13-TAMPER-RTC.Locked=true
PC13-TAMPER-RTC.Signal=GPIO_Output
PA9.GPIOParameters=GPIO_Label
PA9.GPIO_Label=LED
PA9.Locked=true
PA9.Signal=GPIO_Output
PB8.GPIOParameters=GPIO_Label,GPIO_Speed,GPIO_ModeDefaultOutputPP,PinState,GPIO_PuPd
PB8.GPIO_Label=WIRE_IO
PB8.GPIO_ModeDefaultOutputPP=GPIO_MODE_OUTPUT_OD
PB8.GPIO_PuPd=GPIO_PULLUP
PB8.GPIO_Speed=GPIO_SPEED_FREQ_LOW
PB8.Locked=true
PB8.PinState=GPIO_PIN_SET
PB8.Signal=GPIO_Output
PD0-OSC_IN.Locked=true
PD0-OSC_IN.Mode=HSE-External-Oscillator
PD0-OSC_IN.Signal=RCC_OSC_IN
@ -100,7 +105,7 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=Makefile
ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false
ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USB_DEVICE_Init-USB_DEVICE-false-HAL-false,4-MX_IWDG_Init-IWDG-false-HAL-true
RCC.ADCFreqValue=36000000
RCC.AHBFreq_Value=72000000
RCC.APB1CLKDivider=RCC_HCLK_DIV2
@ -127,6 +132,8 @@ USB_DEVICE.CLASS_NAME_FS=CDC
USB_DEVICE.IPParameters=VirtualMode,VirtualModeFS,CLASS_NAME_FS
USB_DEVICE.VirtualMode=Cdc
USB_DEVICE.VirtualModeFS=Cdc_FS
VP_IWDG_VS_IWDG.Mode=IWDG_Activate
VP_IWDG_VS_IWDG.Signal=IWDG_VS_IWDG
VP_SYS_VS_tim4.Mode=TIM4
VP_SYS_VS_tim4.Signal=SYS_VS_tim4
VP_USB_DEVICE_VS_USB_DEVICE_CDC_FS.Mode=CDC_FS