mirror of
https://github.com/eddyem/STM8_samples.git
synced 2025-12-06 10:45:12 +03:00
147 lines
4.2 KiB
C
147 lines
4.2 KiB
C
/*
|
|
* onewire.h
|
|
*
|
|
* Copyright 2015 Edward V. Emelianoff <eddy@sao.ru, edward.emelianoff@gmail.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
* MA 02110-1301, USA.
|
|
*/
|
|
|
|
#pragma once
|
|
#ifndef __ONEWIRE_H__
|
|
#define __ONEWIRE_H__
|
|
|
|
#include "stm8l.h"
|
|
|
|
#define ERR_TEMP_VAL 200000
|
|
|
|
#define TIM2REGH(reg) TIM2_##reg##H
|
|
#define TIM2REGL(reg) TIM2_##reg##L
|
|
#define TIM2REG(reg, val) do{TIM2REGH(reg) = val >> 8; TIM2REGL(reg) = val & 0xff;}while(0)
|
|
|
|
|
|
// ARR values: 1000 for reset, 100 for data in/out
|
|
// CCR2 values: 500 for reset, 60 for sending 0 or reading, <15 for sending 1
|
|
// CCR1 values: >550 if there's devices on line (on reset), >12 (typ.15) - read 0, < 12 (typ.1) - read 1
|
|
#define RESET_LEN ((U16)1000)
|
|
#define BIT_LEN ((U16)100)
|
|
#define RESET_P ((U16)500)
|
|
#define BIT_ONE_P ((U16)10)
|
|
#define BIT_ZERO_P ((U16)60)
|
|
#define BIT_READ_P ((U16)5)
|
|
#define RESET_BARRIER ((U16)550)
|
|
#define ONE_ZERO_BARRIER ((U16)10)
|
|
|
|
#define OW_BUSY ((TIM2_CR1 & TIM_CR1_CEN))
|
|
|
|
|
|
/*
|
|
* thermometer commands
|
|
* send them with bus reset!
|
|
*/
|
|
// find devices
|
|
#define OW_SEARCH_ROM (0xf0)
|
|
// read device (when it is alone on the bus)
|
|
#define OW_READ_ROM (0x33)
|
|
// send device ID (after this command - 8 bytes of ID)
|
|
#define OW_MATCH_ROM (0x55)
|
|
// broadcast command
|
|
#define OW_SKIP_ROM (0xcc)
|
|
// find devices with critical conditions
|
|
#define OW_ALARM_SEARCH (0xec)
|
|
/*
|
|
* thermometer functions
|
|
* send them without bus reset!
|
|
*/
|
|
// start themperature reading
|
|
#define OW_CONVERT_T (0x44)
|
|
// write critical temperature to device's RAM
|
|
#define OW_SCRATCHPAD (0x4e)
|
|
// read whole device flash
|
|
#define OW_READ_SCRATCHPAD (0xbe)
|
|
// copy critical themperature from device's RAM to its EEPROM
|
|
#define OW_COPY_SCRATCHPAD (0x48)
|
|
// copy critical themperature from EEPROM to RAM (when power on this operation runs automatically)
|
|
#define OW_RECALL_E2 (0xb8)
|
|
// check whether there is devices wich power up from bus
|
|
#define OW_READ_POWER_SUPPLY (0xb4)
|
|
|
|
/*
|
|
* RAM register:
|
|
* 0 - themperature LSB
|
|
* 1 - themperature MSB (all higher bits are sign)
|
|
* 2 - T_H
|
|
* 3 - T_L
|
|
* 4 - B20: Configuration register (only bits 6/5 valid: 9..12 bits resolution); 0xff for S20
|
|
* 5 - 0xff (reserved)
|
|
* 6 - (reserved for B20); S20: COUNT_REMAIN (0x0c)
|
|
* 7 - COUNT PER DEGR (0x10)
|
|
* 8 - CRC
|
|
*
|
|
* To identify S20/B20 use value of confuguration register: its MSbit is 0
|
|
*/
|
|
|
|
typedef enum{
|
|
OW_MODE_OFF, // sleeping
|
|
OW_MODE_TRANSMIT_N, // transmit N bytes
|
|
OW_MODE_RECEIVE_N, // receive N bytes
|
|
OW_MODE_RESET // reset bus
|
|
} OW_modes;
|
|
|
|
typedef struct{
|
|
U8 is_free;
|
|
U8 ROM_bytes[8];
|
|
} ow_ROM;
|
|
|
|
#define EEPROM_MAGICK (0x1234)
|
|
|
|
// there's only 128 bytes of EEPROM on STM8S003!!!
|
|
// so we have not more than 14 sensors!
|
|
#define MAX_SENSORS (14)
|
|
|
|
typedef struct{
|
|
U16 magick;
|
|
ow_ROM ROMs[MAX_SENSORS];
|
|
} eeprom_data;
|
|
|
|
extern U8 ROM[];
|
|
extern eeprom_data *saved_data;
|
|
|
|
extern volatile U8 ow_data; // byte to send/receive
|
|
extern volatile U8 onewire_tick_ctr; // tick counter
|
|
extern volatile U8 is_receiver;
|
|
extern volatile U16 onewire_gotlen; // last captured value
|
|
extern U8 ow_data_array[];
|
|
extern U8 ow_byte_ctr;
|
|
extern volatile OW_modes ow_mode;
|
|
|
|
extern void (*ow_process_resdata)();
|
|
|
|
void onewire_setup();
|
|
U8 onewire_reset();
|
|
void onewire_send_byte(U8 byte);
|
|
void onewire_wait_for_receive();
|
|
void process_onewire();
|
|
void onewire_receive_bytes(U8 N);
|
|
void onewire_send_bytes(U8 N);
|
|
|
|
long gettemp();
|
|
|
|
void eeprom_default_setup();
|
|
U8 erase_saved_ROM(U8 num);
|
|
U8 store_ROM();
|
|
|
|
#endif // __ONEWIRE_H__
|