使用STM32F030C8T6普通IO口模拟IIC程序,已经实验验证可以使用。使用时请修改相应的管脚和延时函数即可。各个函数在程序中有备注就不一一说明了。还有一个是使用IIC读SI7020的示例程序。大家可以去使用。
; h4 b' ]% S- W0 ~
si7020_iic.h3 h2 ^/ r: e4 X, G" b% p
- H$ j1 j( m, c7 a) Y
- #ifndef __SI7020_IIC_H8 J2 a7 X, e0 b1 j4 H( n5 r4 C$ G% n
- #define __SI7020_IIC_H
% A4 ?' R- u; s9 p5 O - #include <stdio.h>
; Y/ o/ p0 K2 l$ y! Z - #include <stdint.h> f9 v: j& k f/ _7 ^7 g" R% [
- #include <stm32f1xx.h>
* V. Z0 N1 x* s" G- c1 l( i0 o E# [) [ - //////////////////////////////////////////////////////////////////////////////////
9 q+ \' \5 v& }1 G7 {: L - //本程序只供学习使用,未经作者许可,不得用于其它任何用途, Y0 o- w1 v& G u; ]( m) G
- //IIC 驱动函数头文件 * @2 S6 }) w) g( i8 i
- //使用普通IO口模拟IIC
# m/ @# h% r# d, p- w0 w' o( ^ - ////////////////////////////////////////////////////////////////////////////////// % B6 P0 p. p; V; L4 u2 Q, S
- # I$ ^. X0 _/ T5 J# u$ {
- typedef enum
) o# \" _! \# b* `! [ - {' P7 q2 Z6 k* S+ \
- NACK = 0,
+ p5 d5 ^( }/ r$ G! S* @ - ACK =! NACK,' O% D6 `/ W. R
- } AckStatus;
, T7 j: @7 C& g - #define SI7020_IIC_SDA_CLK RCC_APB2Periph_GPIOB8 j6 X0 o# c R: ?9 w2 {
- #define SI7020_IIC_SDA_PORT GPIOB/ H s8 `$ X; i0 R$ J; ?5 v
- #define SI7020_IIC_SDA_PIN GPIO_PIN_5
* H' q2 e8 c6 O& k - 3 |7 s1 Z9 R) ]+ k; p, g5 [
- #define SI7020_IIC_SCL_CLK RCC_APB2Periph_GPIOB+ j9 E7 R1 ^7 n; p
- #define SI7020_IIC_SCL_PORT GPIOB' u; ~! ~+ B+ D P! Z e
- #define SI7020_IIC_SCL_PIN GPIO_PIN_6) T* c, q! o9 g. z- q& s' o# e
- 9 H# t9 X) \* G$ ]: T! l" q. y2 x
- //IO方向设置
4 X4 O+ r; s9 M: r2 w- J8 W - #define SET_SI7020_IIC_SDA_PIN() HAL_GPIO_WritePin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN,GPIO_PIN_SET)
8 x" _0 H" e+ U- H2 B9 | - #define RESET_SI7020_IIC_SDA_PIN() HAL_GPIO_WritePin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN,GPIO_PIN_RESET)
& z: v5 y0 U. p9 i) y; \* r
- W( a, a/ K; ]+ D: H- #define SET_SI7020_IIC_SCL_PIN() HAL_GPIO_WritePin(SI7020_IIC_SCL_PORT,SI7020_IIC_SCL_PIN,GPIO_PIN_SET)5 W: V. C) c, o: L% j; h+ R
- #define RESET_SI7020_IIC_SCL_PIN() HAL_GPIO_WritePin(SI7020_IIC_SCL_PORT,SI7020_IIC_SCL_PIN,GPIO_PIN_RESET)
5 z$ s' T; i) p9 D -
' h. Q9 h+ z8 j1 S8 t; h8 u5 M4 p - //IIC所有操作函数
+ T) d. E; _+ i, y - void delay(unsigned int j);
, }0 E" j* Y0 j+ [/ m - void SI7020_IIC_Init(void); //初始化IIC的IO口
$ h1 {) D. R! s$ Y' |$ b - void SI7020_IIC_Start(void); //发送IIC开始信号8 `" P. ~8 @" m& P) v4 d
- void SI7020_IIC_Stop(void); //发送IIC停止信号( D+ E( r3 L+ m% a: q
- void SI7020_IIC_Send_Byte(uint8_t txd); //IIC发送一个字节; U+ {: T+ Q" P$ b
- uint8_t SI7020_IIC_Read_Byte(unsigned char ack);//IIC读取一个字节. N- u. K& E h& L+ x7 b* d
- uint8_t SI7020_IIC_Wait_Ack(void); //IIC等待ACK信号1 m& F; v. }1 q4 J/ ~+ v( x O/ X
- void SI7020_IIC_Ack(void); //IIC发送ACK信号
: d3 X) Y# U1 Q4 O; i: d - void SI7020_IIC_NAck(void); //IIC不发送ACK信号
, }9 ]! Q1 ~7 Z+ } - #endif+ a2 y; k# r+ L5 A9 k9 h
复制代码 si7020_iic.c
7 _7 w8 Z) w: w: q2 p# B% A J1 p. \+ n3 } t
- #include "Hal_SI7020_IIC/si7020_iic.h"
' \ \$ H3 _0 J! J L1 q9 V - #include "delay/delay.h") |8 _6 s, ?+ c( j% a9 K
- #include "common.h"/ h- O! i, F4 l- E4 N1 @8 b+ f
- //////////////////////////////////////////////////////////////////////////////////
( W2 U5 ^' @$ ] - //本程序只供学习使用,未经作者许可,不得用于其它任何用途" c9 X0 E8 g2 v
- //IIC 驱动函数 + [# m$ x9 C) K( \
- //使用普通IO口模拟IIC
; {5 G6 M- f( {% ]5 |6 b - //请根据程序修改相应头文件和延时函数。
) T' i% Y& k3 D. K+ } - //////////////////////////////////////////////////////////////////////////////////$ Q8 ^* E8 X+ I/ m* I7 F% k
- //延时函数如果需要修改请修改此处:us4 K% m6 y, C* g x) E8 K7 H7 ^
- void _delay_us(uint32_t us) 8 ?! x+ z% h& L: X
- {; a6 J1 Z3 |- N& J
- delay_us(us);3 n0 q1 \( F7 n' a! F7 @
- }9 E7 ]! {$ P$ [
- void SI7020_IIC_Init(void); o# h2 P X C
- { $ _* m8 Q5 D5 X0 w2 r1 {
- GPIO_InitTypeDef GPIO_InitStructure;3 `$ q0 i1 f6 m5 j: }
- __HAL_RCC_GPIOB_CLK_ENABLE();* G0 E! l$ h# m" A. p- {" Y3 _, P% p
- 1 y4 ?7 t' ^/ `2 A
- GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
0 _" f, M8 I5 `; B+ Q - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
8 ]$ v. R# T, K5 D6 g$ ]' i: `" N) e - GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;7 I6 Y, _: h( s
- HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);. Y3 D( S# Q6 P, H$ [" ~8 g; @0 ~
- ; K: R. v4 e# R: D1 ^
- GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;/ o* l5 P5 |/ \: R/ F$ t5 A" g
- GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
# [/ ~# V% k7 ^ O - GPIO_InitStructure.Pin = SI7020_IIC_SCL_PIN;
3 H5 `* [( l5 ?, @! D - HAL_GPIO_Init(SI7020_IIC_SCL_PORT, &GPIO_InitStructure);
# V6 A" d# H9 T& N0 _ - % b+ d+ V: ]! Q* g( l
- HAL_GPIO_WritePin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN,GPIO_PIN_SET);
$ V+ V7 p/ W9 w5 s p - HAL_GPIO_WritePin(SI7020_IIC_SCL_PORT,SI7020_IIC_SCL_PIN,GPIO_PIN_SET);$ j1 ^. p" t( `$ K; m
0 y3 }7 L( j( c0 B* U- }
- |" Z5 }) {6 Y, O9 D7 D - void SI7020_SDA_IN()
! J( l0 @0 y# ?& V* _7 q - {7 f, e Y; _& a9 i) [' x/ H
- GPIO_InitTypeDef GPIO_InitStructure;
/ Y3 E. @- A- W* O6 f1 x& ] - __HAL_RCC_GPIOB_CLK_ENABLE();" d" A* n/ b) d/ j0 Q- y; b
- GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
5 p. ?. ?7 ?; q) y Q) ? - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;6 n$ r9 f2 L( [) i e
- GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;2 ~6 _( b/ O+ k" r" H6 r6 C
- HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);9 r" ?2 H: Q* j; Y2 h
- }& Z$ W/ a0 I, g4 D( m
- void SI7020_SDA_OUT()$ v1 I+ V- l1 y1 T% o7 g0 W
- {% I$ \: Z4 T* V6 M/ B2 N5 o
- GPIO_InitTypeDef GPIO_InitStructure;( k! H* {5 T/ H/ \! k6 \3 n
- __HAL_RCC_GPIOB_CLK_ENABLE();
! }7 y9 M1 K F o/ i: w6 s - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;) p3 b+ `8 c+ f9 P; [
- GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
0 t `4 c& S% g, N3 Y- x+ p2 Z - GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;1 y2 o( Z1 G5 E( I
- HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);
1 g, w0 M1 ^' L - }
/ z/ Q( O& B& }7 p. M' o - e, m% v1 i. M5 {/ U
- //产生IIC起始信号
0 l* G& M' ~7 c- L) o - void SI7020_IIC_Start(void)4 {7 Q! [4 T8 |
- {& k: T7 B G5 F1 Z/ w
- SI7020_SDA_OUT(); //sda线输出3 h, ^' P3 m. N# t: A
- SET_SI7020_IIC_SCL_PIN();" s- H# {/ I& H l" d
- SET_SI7020_IIC_SDA_PIN();
! r" d8 Z% I% I9 O - _delay_us(3);
! i x/ j1 Y3 ]! [! x - RESET_SI7020_IIC_SDA_PIN();( V, ]8 q- r9 P) ?4 j5 t/ o
- _delay_us(3);
& r2 \- ^* u b& F" c$ n- x5 h - RESET_SI7020_IIC_SCL_PIN(); //钳住I2C总线,准备发送或接收数据
. W$ v) [- o6 k2 h0 K - _delay_us(3);) y" f9 D' X' i2 y. G
- } 1 s4 Q7 I0 U4 }% [5 ~: G
- //产生IIC停止信号; I4 s7 ?6 d; @% f# {
- void SI7020_IIC_Stop(void)3 w# p# d- H- w1 T" e; B
- {: u, B/ h, O" M
- SI7020_SDA_OUT();//sda线输出
1 v# s9 V/ L% }2 O - RESET_SI7020_IIC_SDA_PIN();
3 g, Q: z/ z: F/ J5 W) ~3 ~, @ - SET_SI7020_IIC_SCL_PIN();
! p- R& }3 \# H4 V - _delay_us(4);8 I& k' f& o! g# g0 d
- SET_SI7020_IIC_SDA_PIN();
; H% Y" _3 l$ u+ C - _delay_us(4);
" n0 c; H1 W) Y' r/ X6 F6 @; _ - }
* i% i$ B- I% K' S `* S - //等待应答信号到来
1 v9 ]# f y4 r - //返回值:ACK,接收到应答
! l! W7 |- O: g9 [& J$ o5 F - // NACK,未接收到应答. e. K1 r2 ^" R5 C
- uint8_t SI7020_IIC_Wait_Ack(void)
2 d: b8 X _3 z* b# W4 Y- n$ {: ~1 G: ~ - {
) H; m4 E3 h) `0 o9 c1 O$ B - uint8_t ucErrTime=0;
& Z: Q; T3 I; f! h$ b - SI7020_SDA_IN(); //SDA设置为输入
$ v5 _! t0 H1 q) Y, \* ~ - SET_SI7020_IIC_SCL_PIN();
2 j/ h' _1 d9 L2 i - _delay_us(5); 4 E) o# z/ p& Y( ?! Y; E
- // while(HAL_GPIO_ReadPin((GPIO_TypeDef*)SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))( f2 E; K" i* |) `" b5 L: E
- // {- C: A' B3 ^0 j* H& s& r
- // ucErrTime++;
4 L! ?/ M! L6 S) z; }& W$ N. r - // if(ucErrTime>250) G) Y" S8 z: Y% C* h6 Q6 i
- // {9 m1 N* M7 ~- B# h- ^; \5 W
- // SI7020_IIC_Stop();5 X+ o- [) T1 a- w1 C' K7 G: T) d
- // return 1;//接收应答失败2 E9 d2 G; Y3 }# K; ]1 P( n
- // }3 Y0 c1 s1 ?+ r
- // }2 w0 [8 G! V, G! C9 }. L& o, [
- if(HAL_GPIO_ReadPin((GPIO_TypeDef*)SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))" ^" ]: d2 q. A7 Q' y
- return ACK;
7 B! u6 D6 X5 M5 a% Q8 u - RESET_SI7020_IIC_SCL_PIN(); 8 ?, z9 \" ^1 \# y# ~' G
- _delay_us(5);& O1 q. s8 n, l" ^8 P. t
- return NACK; : F8 b# ?* J% \. e' D
- }
& `9 `, O- e7 y# S) X: |; T - //产生ACK应答3 Z/ j. P |4 q
- void SI7020_IIC_Ack(void)2 B4 g1 w$ u! q5 d+ L
- {7 y: ]# @: f. p4 B! m5 t" ` Q
- RESET_SI7020_IIC_SCL_PIN();7 ?% K& a9 ]2 n- }( o9 k n% c9 T
- SI7020_SDA_OUT();% W. i2 `6 |5 s8 X: L2 n5 `
- RESET_SI7020_IIC_SDA_PIN();# ~4 ^! B2 G+ ?" U" G3 W8 J ^
- _delay_us(2);- r3 @& `0 V' v) P" d3 `
- SET_SI7020_IIC_SCL_PIN();
; y! k. w+ {) {$ L - _delay_us(2);& j+ g0 c; Z2 v+ q. f1 L
- RESET_SI7020_IIC_SCL_PIN();0 y$ R3 S9 U) y% T( ]% f. G$ C. Q
- }# F. q$ T1 ?7 {" N9 e# k
- //不产生ACK应答 0 m& W1 i7 h4 B, m& O3 `3 J* ?, p
- void SI7020_IIC_NAck(void)
. u8 C* w0 ^; c4 l+ S - {, I8 N/ M3 E- F
- RESET_SI7020_IIC_SCL_PIN();% @. ?8 n$ ?( b5 E
- SI7020_SDA_OUT();% X% d, J2 q$ c& a) _) Y" w
- SET_SI7020_IIC_SDA_PIN();9 p# _ j# x) ]) s J
- _delay_us(2);
5 N7 X7 n- Y* [ \2 ~: t - SET_SI7020_IIC_SCL_PIN();7 {; ~+ m6 u3 h
- _delay_us(2);7 b) G. ?3 x$ m1 R" U
- RESET_SI7020_IIC_SCL_PIN();: Q% O1 u, [) c! E; m3 R5 `
- }
& H7 P+ w) L$ s& F, Q - //IIC发送一个字节3 F- U. m5 ^ u/ `% @% Z
- void SI7020_IIC_Send_Byte(uint8_t txd) r% Z) f+ z" I) z# E; m
- {
( P* P7 r3 A" Y; @6 P5 e - uint8_t t;
+ F- t5 e4 X4 b* x - SI7020_SDA_OUT();
" x- S/ v9 o; r# O s% @ - SET_SI7020_IIC_SDA_PIN();
+ E4 n3 h# @2 K - for(t=0;t<8;t++)+ x" R! o# J3 ?6 _- M9 P. G, f0 K# n# ?
- { 9 }. L' u+ Z+ |% d
- if(txd&0x80)
% |" C+ ~/ s6 l- V - SET_SI7020_IIC_SDA_PIN();
0 O3 U G* i+ G' c6 u9 e - else . c+ [- V' ]% J: a$ d- T. i
- RESET_SI7020_IIC_SDA_PIN();: w6 r4 S Y& H
- txd<<=1;
6 k0 _% b4 F$ X - _delay_us(2); //对TEA5767这三个延时都是必须的& C8 a& _4 O6 k( H' |* l; m
- SET_SI7020_IIC_SCL_PIN();
- _4 k; ~. v4 h - _delay_us(2); ( Q/ m" `- |' K, ?! b6 O
- RESET_SI7020_IIC_SCL_PIN();
0 @( Q& P9 _: `; o0 T: P9 w) n0 x: X - _delay_us(2);% N9 L3 f% w. x5 j; \
- }
- E# n: i5 y1 s0 A9 v8 K - } * Y6 s) {# B9 X2 K; L8 |' U2 e
- //读1个字节,ack=1时,发送ACK,ack=0,发送nACK ' E4 {. x( e! }; M
- uint8_t SI7020_IIC_Read_Byte(unsigned char ack)9 h, X/ m! E' L y0 I" T
- {$ a6 K! c- f. m. M/ P9 D
- unsigned char i,receive=0;$ a4 V8 Y/ R) E% u3 ^
- SI7020_SDA_IN();//SDA设置为输入7 D( H. R3 o. F9 a2 q) p% Z
- for(i=0;i<8;i++ )/ y" i; W& H2 O8 k! k- {
- {
l0 J8 B- a" `, r+ Y, D2 e+ I - RESET_SI7020_IIC_SCL_PIN();) q G P0 Q! |: w' C
- _delay_us(2);4 I" V- |& B7 M/ A* S
- SET_SI7020_IIC_SCL_PIN();7 X0 l" B1 I# F; l8 k/ C
- receive<<=1;
1 z# J7 y. E6 X6 \ - if(HAL_GPIO_ReadPin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))receive++;
9 l; G- G O: s$ N z; B/ g2 C - _delay_us(2);
+ C1 X) b# U: H w) _ - } 1 \ \2 d# b( D, b; T% @
- if (!ack)4 Y' @% Y9 G0 `
- SI7020_IIC_NAck();//发送nACK
; @3 ^3 k1 r) Z - else. f9 W2 h, f1 b5 A
- SI7020_IIC_Ack(); //发送ACK
- X) E4 n5 _- e8 r7 j) u+ Q/ D - return receive;9 Z8 [8 E1 p+ v. ?! L' \
- }
复制代码 si7020.h
9 ]3 z# x4 W6 ^7 _; [' x- #ifndef __SI7020_H7 Z" C/ H3 H- d) Y
- #define __SI7020_H6 j5 m" j) U0 T- K9 ]
- #include <stdio.h>1 `: P) a6 w. B, r1 y5 ?
- #include <stdint.h>
& V! Q8 L3 h# S - #include <stm32f1xx.h>
$ R3 J; O+ _6 q# g - typedef uint8_t u8;9 a4 l2 ]) l+ Z) ~0 x
- typedef uint16_t u16;: j R9 h9 M/ P4 n7 V$ @; ]" X4 a
- typedef uint32_t u32;7 v( N ]/ N5 k% t# b
- #define SI7020_ADDRESS 0X80 //SI7020器件地址
# P; }: K# y% b( g" {: t, X - #define SI7020_READ 0X01 //读数据 c# o; t2 F0 G- \) d! F
# F+ A$ X: j; R0 Y; s# p- #define SI7020_TEMPERATURE 0xE3
l3 @, m6 q+ P8 v) @* _* h1 K - #define SI7020_HUMIDITY 0xE55 x+ ]$ v' }! h5 \
- #define SI7020_SOFT_RESET 0xFE
$ b, ~8 c1 v, X1 E' ?: n
0 a' j5 @; L7 y- void SI7020_Init(void); //初始化IIC
8 Y* _1 _% s8 r$ d: r/ }, V - uint16_t SI7020_ReadOneByte(uint8_t ReadAddr);
- k6 [4 w! N/ d' @6 E( u - int16_t SI7020_Read_Humidity(void);
9 ]$ s. E( h `& d - int16_t SI7020_Read_Temperture(void);. p+ R0 v/ M/ f9 g/ @! q
- % I8 ?5 A* E n9 {6 R9 `/ {
- #endif
复制代码 si7020.c
* m* R- R( c. v$ z! s" f- #include "Hal_SI7020/si7020.h" 7 |+ D* ?) w: V6 e D6 t, b
- #include "Hal_SI7020_IIC/si7020_iic.h"
9 Y9 n" e# _" x9 A - //#include "delay.h"
+ e& j6 Q9 Z4 A - //#include "delay.h"
5 Q, j. [; @( f! q8 y - #include "Hal_OLED/oled.h"
9 g$ T H* W, Z1 E - #include "delay/delay.h"1 G. c0 a# ]8 Z! R) N
- #include "common.h". p4 F6 b$ X/ S
- //SI7020串口初始化" N( Z7 ?; a( J+ ~2 P: ?0 C
- void SI7020_Init(void)
! i9 L! K* [9 f* d - {6 g. `7 s1 k/ N y, E
- SI7020_IIC_Init();% h/ d% d% n, R* N( V! J
- }7 |& e) C# g* G0 D( v) s/ a
- //在SI7020指定地址读出一个数据. H8 E1 O% u. D# |* c
- //ReadAddr:读取温度或温度
) `1 [: S0 Q* D3 b - //返回值 :读到的数据7 i( B6 w% {) W# s9 _6 A, V/ S
- uint16_t SI7020_ReadOneByte(uint8_t ReadAddr)
% S; c) U+ k0 k5 f0 b! n& B - { 4 ?, ]$ e8 F% n
- uint8_t error=1;3 z5 b* T5 \, _. T
- uint8_t temp[2];
F- U' i3 M( |$ |" L- N - uint16_t value=0;
$ p+ y9 `, k e, e1 ~. U; s - SI7020_IIC_Start();
# d0 B4 h! c" g3 E7 h: d - SI7020_IIC_Send_Byte(SI7020_ADDRESS);0 a! c& g0 [# e5 M( }- k5 Y6 T
- SI7020_IIC_Wait_Ack();
" P4 N1 D( i7 t- f - SI7020_IIC_Send_Byte(ReadAddr);
9 o+ ^# y5 h" T9 r/ E. f - SI7020_IIC_Wait_Ack();
$ h' B! ]8 S# Q# M - SI7020_IIC_Start();
/ Y' J& J+ ?" ]) B# c6 G, k - SI7020_IIC_Send_Byte(SI7020_ADDRESS|SI7020_READ);
+ e% A. `/ Z2 P$ J8 P - SI7020_IIC_Wait_Ack();
& E) b+ F* n r8 J& R - delay_ms(20); //延时一段时间,不可少。' i6 C: n* o/ d
- // SI7020_IIC_Start(); //若使用No Hold Master Mode模式请使用此3行程序/ b) ?3 e: S1 U! t" d
- // SI7020_IIC_Send_Byte(SI7020_ADDRESS|SI7020_READ);
6 E$ \( x" d2 x$ \ - // SI7020_IIC_Wait_Ack();
1 ? Z& A" M0 c( v* ?5 U5 T' h - temp[1]=SI7020_IIC_Read_Byte(1);
- A$ w6 t- @& L - temp[0]=SI7020_IIC_Read_Byte(0);& {- E$ c/ q9 i H) l! m2 Y
- SI7020_IIC_Stop();//产生一个停止条件3 ?5 S7 ?0 ^4 v- \9 T9 o' M
- value=temp[0]|(temp[1]<<8);% \! F# G2 Q w
- return value;6 u l/ F$ |4 Y. h) A% k! ~. \: s
- }. b* \4 ]' m1 F6 w! _& o: @
- //读取湿度8 E# G" O$ h; o* S C
- //返回值为湿度
: ?& L" H# J$ y# v - int16_t SI7020_Read_Humidity(void)& \2 G5 b) ~# `+ ]8 a
- {
4 b2 q$ E1 _; \; a" ^ - uint16_t value=0;
5 G& d7 F% a { - double temp;
; L8 P9 B' S9 j - value=SI7020_ReadOneByte(SI7020_HUMIDITY);9 E g/ P3 ?! _4 T- N
- temp=(double)value;0 d H( u8 S, O; X3 l
- temp=(temp/65536.0f)*125.0f-6.0f;% ?3 K: n8 p0 Z" U' y. j! ~/ X2 Y
- GIZWITS_LOG("Humidity = %.2lf \n", temp);//机智云的串口打印
/ y3 `8 r: V& ^ - return (int16_t)(temp*10); //返回湿度值,此处放大了10倍
% m3 L' M1 `5 g" G: i# y( N - }& q/ G3 M: U) N e H- G
- //读取湿度* j, W- V) D, I" H
- //返回值为湿度
: |* W" W( |( G/ n. c! m" n( H0 V - int16_t SI7020_Read_Temperture(void)
6 W7 O6 b _- [$ C - {6 d0 D; m( A8 d, X$ F& F2 f4 o. p/ h
- ( s9 m3 T& w9 v1 K
- uint16_t value=0;
0 a) h) i. o) j, ^8 D' {! z - double temp;( \$ [# [, b/ C. V- q! G
- value=SI7020_ReadOneByte(SI7020_TEMPERATURE);
0 g) h& [( M& P+ V! B* u0 C - temp=(double)value;) Z! w9 x4 e" ~6 r8 n/ T
- temp=(temp/65536.0f) * 175.72f - 46.85f;7 `5 @% \0 @, {) c3 [3 v0 Q
- GIZWITS_LOG("Temperature = %.2lf \n", temp);//机智云的串口打印+ i6 ^9 I& t+ i4 u( N
- return (int16_t)(temp*10); //返回温度值,此处放大了10倍
]( y0 V" i, n6 C8 B- i! C0 ~ - 8 w+ a% ?* N9 r! g# `. A/ V" A6 b4 \; \
- }* T% ], x0 O- K
-
; k* A7 J2 K. a' _* X7 W - 7 I5 q: O6 s% {% \ S# d
- , S' d( p' s+ J3 ~# L9 j
4 w2 _9 q* W ^$ _: g
, {5 I! x+ ] b m$ ]/ T- . Q, ]; O6 h9 B
- 4 l" ^7 h( ?, Y6 A; a7 i1 \
- # B; s% o. q; t- b/ J) U% s6 N
% \' E3 t& x4 K# _; l- ) W3 J( x, q. k2 [- U! h
- + H7 B( k5 v9 B5 G
- 5 ]* P4 v4 n8 c7 x
复制代码 下面附上附件
$ v' T' \" H7 W
* y, d. r) c' R; t& k) `" `- S
Hal_SI7020.zip
(1.27 KB, 下载次数: 37)
|