Added DS18B20 driver.
This commit is contained in:
parent
08074f4051
commit
2fb8c03a22
|
@ -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
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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;
|
||||
}
|
101
Core/Src/main.c
101
Core/Src/main.c
|
@ -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 */
|
||||
|
||||
/**
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
6
Makefile
6
Makefile
|
@ -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 = \
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue