使用STM32F030C8T6普通IO口模拟IIC程序,已经实验验证可以使用。使用时请修改相应的管脚和延时函数即可。各个函数在程序中有备注就不一一说明了。还有一个是使用IIC读SI7020的示例程序。大家可以去使用。
' z5 X3 g; L1 y3 c" {si7020_iic.h/ r- S9 N% }% d. x
2 ~! G7 X6 t- l/ M. [- #ifndef __SI7020_IIC_H3 R6 _/ U: i9 @3 b
- #define __SI7020_IIC_H# a+ {( I% |- F0 K, O. c& N
- #include <stdio.h>
8 D5 m/ w, V& D4 X: D - #include <stdint.h>
7 J/ D S! ~7 k - #include <stm32f1xx.h>7 t8 I0 E' e) l5 E$ t
- //////////////////////////////////////////////////////////////////////////////////
q2 ]# W, @( c" L3 D3 z - //本程序只供学习使用,未经作者许可,不得用于其它任何用途& f# x) C; O- @! }; j6 y
- //IIC 驱动函数头文件
' G$ K$ m4 x) M" ], t& L! b, ?5 X6 q - //使用普通IO口模拟IIC/ N8 E5 H: |+ V! D8 F
- ////////////////////////////////////////////////////////////////////////////////// ' G# F; `/ j/ p
- ) S. C' g. o) _& F# j" L
- typedef enum
. B3 a0 {: Z. |% C1 g& u, l& H - {; n9 l: N+ Z( S6 d4 B5 @
- NACK = 0,7 s( M @3 V, R2 e: h
- ACK =! NACK,7 ]$ P: O6 l1 `- }* n e2 A. K
- } AckStatus;
8 m' u1 [3 ^# W - #define SI7020_IIC_SDA_CLK RCC_APB2Periph_GPIOB
5 {% F( B a2 A; S# B8 ?: v - #define SI7020_IIC_SDA_PORT GPIOB6 _! ?' I: I- `( T) M7 }) d
- #define SI7020_IIC_SDA_PIN GPIO_PIN_5, s7 `4 L9 t; y& e# a
- 8 a" m# {4 j) ]
- #define SI7020_IIC_SCL_CLK RCC_APB2Periph_GPIOB" {0 @, k! u. [9 N7 s. A/ t# E( h
- #define SI7020_IIC_SCL_PORT GPIOB
' _$ r' W" t3 w- B" |: H7 C - #define SI7020_IIC_SCL_PIN GPIO_PIN_6
' |& H9 x, I: R) w) |: g( S - 6 K* c( b. _5 v
- //IO方向设置
8 ~5 F0 q( O! H: d - #define SET_SI7020_IIC_SDA_PIN() HAL_GPIO_WritePin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN,GPIO_PIN_SET)
2 o8 y9 y, [2 D3 B6 M& ^- H - #define RESET_SI7020_IIC_SDA_PIN() HAL_GPIO_WritePin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN,GPIO_PIN_RESET)
r' J* e5 B, p, J9 x( v* J( N; m
' V. f4 N& o7 R$ b" k- #define SET_SI7020_IIC_SCL_PIN() HAL_GPIO_WritePin(SI7020_IIC_SCL_PORT,SI7020_IIC_SCL_PIN,GPIO_PIN_SET)7 Y6 x/ o- L$ ~/ h/ m1 @. H
- #define RESET_SI7020_IIC_SCL_PIN() HAL_GPIO_WritePin(SI7020_IIC_SCL_PORT,SI7020_IIC_SCL_PIN,GPIO_PIN_RESET)4 u. P( o9 b6 x8 h
- & l" r" ?9 @8 c' z/ g. W& {
- //IIC所有操作函数
6 e' ?4 q. g! l% Q - void delay(unsigned int j);9 F! F7 Y6 ~1 b n3 n
- void SI7020_IIC_Init(void); //初始化IIC的IO口 1 I3 L. b$ g) _8 d4 |: F
- void SI7020_IIC_Start(void); //发送IIC开始信号# F( D+ I) H. n T" N* F
- void SI7020_IIC_Stop(void); //发送IIC停止信号
/ z9 d: w3 K: m9 s - void SI7020_IIC_Send_Byte(uint8_t txd); //IIC发送一个字节' A! l) b3 y. X3 l+ I: Q3 t. E3 V
- uint8_t SI7020_IIC_Read_Byte(unsigned char ack);//IIC读取一个字节& }" d+ C& Q. v5 [) k- i! ^5 f
- uint8_t SI7020_IIC_Wait_Ack(void); //IIC等待ACK信号1 q" }; K) W2 {% o0 q& E$ o* D
- void SI7020_IIC_Ack(void); //IIC发送ACK信号
7 o( D/ d I8 ?/ p- C - void SI7020_IIC_NAck(void); //IIC不发送ACK信号
' I/ B% C5 a7 g. k f% |) `) X - #endif& G+ A2 N8 u7 R
复制代码 si7020_iic.c
7 r6 V0 [( U. a
6 ^" z9 O# Z; X% o7 |- #include "Hal_SI7020_IIC/si7020_iic.h"& K2 ~+ |- U* b! C* G
- #include "delay/delay.h"7 ~" {$ @+ ]& X" t! X
- #include "common.h"
) L2 p, a, J$ g - ////////////////////////////////////////////////////////////////////////////////// ' k8 D3 p# u7 l, B- t7 @ z
- //本程序只供学习使用,未经作者许可,不得用于其它任何用途) H3 y4 ?5 _* n, _: ~
- //IIC 驱动函数 1 e0 J6 l! c h, N# `/ w& `) u
- //使用普通IO口模拟IIC
% e6 C* H* i% s/ Q X. z, p& d2 g8 U - //请根据程序修改相应头文件和延时函数。
$ r% Q% K% P% i% u - //////////////////////////////////////////////////////////////////////////////////" v7 i) t% |" B6 o5 s( ^
- //延时函数如果需要修改请修改此处:us
4 u4 C5 f4 O' W5 Q" t: n7 l - void _delay_us(uint32_t us) 9 }4 z1 g, u$ R7 q1 S0 ^ i) v- E7 q
- {9 `* S* R" s# F, r3 a
- delay_us(us);( ^; ~' I5 ^! D% p5 T
- }
( a' Y/ w) c3 v4 {. i - void SI7020_IIC_Init(void)
8 L, N! z- d, G8 I5 e3 w ? - {
& c, R# I$ {5 ?. L( Y - GPIO_InitTypeDef GPIO_InitStructure;4 b* U% ?% d/ b
- __HAL_RCC_GPIOB_CLK_ENABLE();
4 Y* Z+ |9 G3 B( s& s3 j -
# `4 A+ ?9 F I0 Z - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
0 s9 a _. r5 x - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
! e5 u! Z1 a R% s. i - GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;2 z% z! o- S" ]( r
- HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure); w8 b" p" V! X2 B4 O
-
: P3 Y$ L. j& X5 O% N% }7 F% W. K - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;! d" ?# j8 ]1 h) t: Q- Q
- GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;; y* x- ]/ l. Y) |: V5 U
- GPIO_InitStructure.Pin = SI7020_IIC_SCL_PIN;6 @. W* f# M- D! i, h$ X* T) F& L
- HAL_GPIO_Init(SI7020_IIC_SCL_PORT, &GPIO_InitStructure);2 G9 M; W# p4 F) G3 Z; ?
-
9 v. `9 a$ f/ U. w+ L6 \' I - HAL_GPIO_WritePin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN,GPIO_PIN_SET);
: e) a+ ]5 m( k% I - HAL_GPIO_WritePin(SI7020_IIC_SCL_PORT,SI7020_IIC_SCL_PIN,GPIO_PIN_SET);: l8 B. h! N, N" b$ {( b- r9 x9 O9 h
8 G) }+ l* k: N2 ^4 ~ S- }8 ?0 W: |7 B6 r1 _
- void SI7020_SDA_IN()
& F7 }$ z1 W; J- {) c. ^0 ]& u3 P - {" E& X0 X5 s: |8 v: |
- GPIO_InitTypeDef GPIO_InitStructure;
! p6 w, i2 q3 D3 O9 O. I8 u$ _1 Z - __HAL_RCC_GPIOB_CLK_ENABLE();
3 ]' N6 P+ P$ V. d- M1 E; @ - GPIO_InitStructure.Mode = GPIO_MODE_INPUT;, ?* q" R. H8 L
- GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;" o5 T+ g: v' k9 j; D1 w) S1 q; ^
- GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;
6 N O9 U- n3 b. f( M - HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);3 d4 S% q+ X' t% L8 m$ B# C, |
- }
' b% P f! \6 t% b0 U; T - void SI7020_SDA_OUT()
/ V# G: z% H$ g6 a4 F8 _ N - {& C/ K# T; d$ {- C) |
- GPIO_InitTypeDef GPIO_InitStructure;
; ]- o$ {( U" d# A- S - __HAL_RCC_GPIOB_CLK_ENABLE();
! m; v7 h `5 P: P9 a - GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
$ K% {" V) |3 e, m( T9 W - GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
* B% ]) P' k6 ? - GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;
: H7 r( V- c' a8 F, A - HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);& F3 B3 t2 r7 Q5 Z& g1 U) T$ ~
- }7 M/ j3 n/ U* l7 I1 P9 z3 e9 x
, B6 W' R/ `4 W. b* w4 t- //产生IIC起始信号: S7 b1 I" f O4 q
- void SI7020_IIC_Start(void)5 s" ]- M3 X! g& {1 m
- {3 b6 m. G* ]" q
- SI7020_SDA_OUT(); //sda线输出
: o3 C9 `0 e1 F2 \5 p. S - SET_SI7020_IIC_SCL_PIN();% h5 v U! L" H1 M1 _( Q
- SET_SI7020_IIC_SDA_PIN();& M' T; Q" e+ N
- _delay_us(3);- ~- J/ ?' c, l# \- G( E3 o
- RESET_SI7020_IIC_SDA_PIN();- r0 t; F- I7 r1 A
- _delay_us(3);. B" `9 L6 ?$ r) D0 M
- RESET_SI7020_IIC_SCL_PIN(); //钳住I2C总线,准备发送或接收数据 6 _; F% A) o6 Z6 R
- _delay_us(3);7 g: m. @; t3 P: U) [
- }
4 |+ [$ V3 G3 o* t. Y7 s: X9 ] - //产生IIC停止信号
8 Y a% G& \/ ~/ M# _ - void SI7020_IIC_Stop(void)+ a( d* L: v$ l: l7 t; x+ |; B, C
- {
! Q& o8 h0 ?; A$ ] - SI7020_SDA_OUT();//sda线输出
% a. W2 F! b/ `1 U' _* R - RESET_SI7020_IIC_SDA_PIN();, D. y4 w# d2 a
- SET_SI7020_IIC_SCL_PIN();" Z/ b* X q+ Y9 _
- _delay_us(4);
3 g! c5 U ^1 N- H$ |$ ~ P0 q - SET_SI7020_IIC_SDA_PIN();, I- n3 [' q1 K7 p* U
- _delay_us(4);
) s8 K2 A, k* A3 M) h0 s, M - }- |1 P0 z% J4 o7 k3 y' w! f
- //等待应答信号到来
4 C/ w) ]: d% }) j, S% p' r - //返回值:ACK,接收到应答
* Y2 E! S) z- j4 A4 C" \! Y8 U - // NACK,未接收到应答
2 m, `8 t/ U1 R5 j! [ Q - uint8_t SI7020_IIC_Wait_Ack(void)0 `2 B# i: j# x% j6 I
- {% i c) I! ? r; o @
- uint8_t ucErrTime=0;* \2 L9 _+ |9 l! y
- SI7020_SDA_IN(); //SDA设置为输入 6 B; x% w7 B' @5 ^; G, _
- SET_SI7020_IIC_SCL_PIN();
, n& Z+ N9 h6 i% Y - _delay_us(5); , s. P& [) M2 `5 [
- // while(HAL_GPIO_ReadPin((GPIO_TypeDef*)SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))
6 | b; r C+ L. @ - // {5 B- _- a9 M% ?+ c
- // ucErrTime++;" G4 {6 v% S" W8 N- t( ]" }( b
- // if(ucErrTime>250)
; k: y4 j1 b* {2 z9 x2 R6 _ - // {8 ^- T' r8 T/ R/ d3 L: h5 \" k
- // SI7020_IIC_Stop();/ m. e8 q/ X. Z- r% J" `
- // return 1;//接收应答失败" p7 Y: g" u5 F [. }) T8 {
- // }
0 u) l, l+ h4 E4 l& [5 G - // }
5 ^, Y6 I( f3 h6 n6 L) A" O3 C& U& } - if(HAL_GPIO_ReadPin((GPIO_TypeDef*)SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))0 i/ d b8 Z. O0 u3 S0 I+ n: g
- return ACK;. N$ F' O! S, P* V- h) Q6 @
- RESET_SI7020_IIC_SCL_PIN(); 5 ~* Z9 }7 N1 E* L% B
- _delay_us(5);
5 B; l5 U& q, k! B2 n - return NACK; W& w _6 y4 K3 U. H4 ^9 s
- } 0 n4 o% M! L7 ]6 L
- //产生ACK应答
. p/ j2 j9 F7 D$ g* M M& X - void SI7020_IIC_Ack(void)3 n' j0 ]+ N% O) M; r! e3 y
- {/ G5 F8 G: v6 Z3 v/ q
- RESET_SI7020_IIC_SCL_PIN();0 p8 Q- o, D- o- I8 t+ m" k* y7 @
- SI7020_SDA_OUT();
& Q1 r- `6 }, \' _3 L% E8 Y* j% q1 u - RESET_SI7020_IIC_SDA_PIN(); [) h1 a6 U9 z" x0 n* t5 K
- _delay_us(2);% y: e- B1 ]0 F
- SET_SI7020_IIC_SCL_PIN();+ k8 ~- G. U0 Y% v n3 M3 j5 S
- _delay_us(2);
) a' V5 v) Q' {1 u% ~1 v% ^9 X, e - RESET_SI7020_IIC_SCL_PIN(); \ t% P& X+ T# x3 n
- }8 o6 [5 ^( S6 U2 x. J* }
- //不产生ACK应答
6 f) A" A$ W* D# y9 | - void SI7020_IIC_NAck(void)
& T3 |4 P1 I- B, T9 R - {) @9 z: j* X0 t4 t3 S
- RESET_SI7020_IIC_SCL_PIN();& Q0 z" v E: I: J9 R( ~
- SI7020_SDA_OUT();
+ q8 T* I( y6 ]$ J$ j9 i0 d - SET_SI7020_IIC_SDA_PIN();, `: d& f+ ?- H. D6 n u. P
- _delay_us(2);* U6 M( e' H9 M! R
- SET_SI7020_IIC_SCL_PIN();
5 n+ Y) y" w4 u; p0 c# ^7 G/ V8 Z6 Q - _delay_us(2);/ g7 s6 ]" x4 h1 H0 U0 w
- RESET_SI7020_IIC_SCL_PIN();& J1 o1 w) E+ k1 B* _4 h' q& [
- }
6 ~& z/ i4 u, s: m - //IIC发送一个字节9 u8 A& K. ]7 c0 R- M
- void SI7020_IIC_Send_Byte(uint8_t txd)& O0 e$ D' t, n- C0 c4 P
- {
6 O ` M' n& n# y. x - uint8_t t; 5 X9 ^. c" m# ^+ b3 m
- SI7020_SDA_OUT(); , v. u* l t6 f0 m
- SET_SI7020_IIC_SDA_PIN();
8 X- q0 p5 A3 r! f0 P. A3 l5 y - for(t=0;t<8;t++)
+ ^8 I* s0 R ?' k3 h- j2 k* B4 A - { 0 S+ H& {/ e5 D# G& l: ]8 w
- if(txd&0x80)
% N' u8 S% B6 c$ W6 E: ^! O0 m% ? - SET_SI7020_IIC_SDA_PIN();4 ?) i; n1 e2 e$ N( p3 s9 `
- else ( H- H7 k% a- H# l. g) b
- RESET_SI7020_IIC_SDA_PIN();- T Y/ s2 `7 S/ n* z0 _
- txd<<=1; , U" e6 n5 R! m, `$ d' J& b8 a
- _delay_us(2); //对TEA5767这三个延时都是必须的
P: O$ L& c- I3 }3 V5 r; ? - SET_SI7020_IIC_SCL_PIN();
- x5 ? ?3 {0 k3 y5 ` - _delay_us(2);
9 p3 l) B Y$ ]8 Y! ] - RESET_SI7020_IIC_SCL_PIN();- B% b0 w: Q/ K
- _delay_us(2);+ c2 A6 r6 Z4 \2 u, \* ~- h
- }' Y. T3 O8 r4 ]
- }
' n# ]. s$ J4 \4 ` - //读1个字节,ack=1时,发送ACK,ack=0,发送nACK ; L+ B0 C4 z {2 J
- uint8_t SI7020_IIC_Read_Byte(unsigned char ack)
4 L6 `7 G! e. w* E0 d w( Y9 B3 l) J0 Z - {
. N; O: d# r+ O( [0 s8 r+ u - unsigned char i,receive=0;! J5 ?, m3 S9 E5 Y8 H2 e, p
- SI7020_SDA_IN();//SDA设置为输入
' f3 J1 J3 U9 m! l7 ~ w - for(i=0;i<8;i++ )
5 @" X% t3 n( a8 J - {
0 X% D: R3 _, ` - RESET_SI7020_IIC_SCL_PIN();
1 T0 _) E9 E3 E. ~- N - _delay_us(2);" S4 O1 f/ c/ s* x K4 p2 ]
- SET_SI7020_IIC_SCL_PIN();5 H; j$ d# E$ E- _
- receive<<=1;
2 T1 ~ L) q) u! E; h - if(HAL_GPIO_ReadPin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))receive++;
8 a+ |3 ^9 b- E - _delay_us(2);
6 ^4 P# L: A* g5 c4 b$ b - } 9 t" K7 `9 t1 Y
- if (!ack)
' B7 t0 F. S$ e1 a* w' @ - SI7020_IIC_NAck();//发送nACK
T6 J1 H/ N' G - else& N& m; `1 l x
- SI7020_IIC_Ack(); //发送ACK 3 G6 O S' P2 W$ C
- return receive;" R1 e( j! Y# ^; I% H
- }
复制代码 si7020.h6 m; X- i* v3 @, }3 F2 ~: S" z
- #ifndef __SI7020_H
5 e* C; E# b M# f- ? - #define __SI7020_H
5 R7 ~. U v$ O8 h - #include <stdio.h>
7 m" W9 R' K9 X8 e* c) k. r - #include <stdint.h>
/ J5 G( n0 L9 [2 K7 S5 g - #include <stm32f1xx.h>8 S7 |) D; [/ L! v' G
- typedef uint8_t u8;% ]9 L6 ] J4 D( N8 `
- typedef uint16_t u16;
% v w1 ] ]* V' R3 @ - typedef uint32_t u32;
* i2 U# d4 f4 r$ K$ |+ F8 J& J5 Q% N - #define SI7020_ADDRESS 0X80 //SI7020器件地址5 @2 x, Y; x. I* |% a3 U- f
- #define SI7020_READ 0X01 //读数据
9 L' h) O- P0 M
( O: ^9 E) g+ g# k* K1 z% C- #define SI7020_TEMPERATURE 0xE3
8 c; Q/ M6 y1 C" V4 {. p - #define SI7020_HUMIDITY 0xE5. c |# k7 y/ e* Z" y6 p
- #define SI7020_SOFT_RESET 0xFE
- l x2 ~8 p$ X: G
, e7 v' S) N5 l' ?" ?8 M5 X. L3 W, ]- void SI7020_Init(void); //初始化IIC
( ~& K! a/ j4 T# Y: A5 Z - uint16_t SI7020_ReadOneByte(uint8_t ReadAddr);
9 m; r( q! k8 `! ~. ?; O5 V3 Z& I - int16_t SI7020_Read_Humidity(void);1 H1 q( C6 L2 g2 Y1 S5 T6 B' ^
- int16_t SI7020_Read_Temperture(void);
) x& t- o/ U# s j5 c& t- Q& f. w( f - ; {! x, G1 v- Z" N
- #endif
复制代码 si7020.c
" H# ~7 J+ ?1 u; \0 D9 _5 _- #include "Hal_SI7020/si7020.h"
! y3 y: H8 i3 w - #include "Hal_SI7020_IIC/si7020_iic.h"* |7 I$ T7 ]& \2 m
- //#include "delay.h" - u6 O1 Y% L/ V4 k
- //#include "delay.h"
' M" ^/ n F3 }- u7 f: G - #include "Hal_OLED/oled.h"
h5 E5 A4 O& \$ l7 m7 o - #include "delay/delay.h"5 j9 x- k0 |( w2 E% ~& Q$ L
- #include "common.h"
* G4 J9 t8 t* t! P" [- k! _ - //SI7020串口初始化0 p7 z8 C" Q0 M9 i
- void SI7020_Init(void)
8 m7 ^. G- ]1 F/ X8 a6 Y3 r - {! F2 [% V. M! E; I- s
- SI7020_IIC_Init();
4 N1 M+ y8 U1 s4 \% N3 K8 T8 d - }7 ?7 i& C4 E; T$ [. `
- //在SI7020指定地址读出一个数据: n% W9 I4 j+ J; x3 w1 ?
- //ReadAddr:读取温度或温度 + r: Q( u+ {' k+ a; ?
- //返回值 :读到的数据# c( S N" E8 ?
- uint16_t SI7020_ReadOneByte(uint8_t ReadAddr)
5 ]1 y5 }9 @+ A" s - {
' b& J" R6 a7 s% R% `8 i - uint8_t error=1;7 M% \* e F: _% K/ ~
- uint8_t temp[2];
$ ~3 `7 E2 E% s9 [ - uint16_t value=0;. {& H2 L2 I8 H9 c" [* Y
- SI7020_IIC_Start();
7 r; @: v, N. B5 q) w! Q - SI7020_IIC_Send_Byte(SI7020_ADDRESS);4 C) y3 w0 j% {. Y5 e
- SI7020_IIC_Wait_Ack();" R) a/ z/ ~ D' b9 }8 ~5 I( X4 ^: h
- SI7020_IIC_Send_Byte(ReadAddr);& h: h( g# c" f( Z$ M9 j4 N) @
- SI7020_IIC_Wait_Ack();# R: ]5 P1 I! N/ |$ Q `
- SI7020_IIC_Start();- K o% L8 ^. v# V* P$ Z( ?8 y7 q
- SI7020_IIC_Send_Byte(SI7020_ADDRESS|SI7020_READ);3 ?; h/ E5 w8 ^) a
- SI7020_IIC_Wait_Ack();* B% T# W4 ~6 d4 N- ?3 C! Y9 h
- delay_ms(20); //延时一段时间,不可少。
6 U1 T( W1 |8 D5 N" b4 [& E# z, j - // SI7020_IIC_Start(); //若使用No Hold Master Mode模式请使用此3行程序
( X6 [, [0 ?5 `5 G- [; n( m" N - // SI7020_IIC_Send_Byte(SI7020_ADDRESS|SI7020_READ);
& ]5 P2 u) F. q7 g - // SI7020_IIC_Wait_Ack();6 y M7 z4 }- r* l
- temp[1]=SI7020_IIC_Read_Byte(1);$ q E2 _" r. X
- temp[0]=SI7020_IIC_Read_Byte(0);1 f' L: E" t4 S) s ~
- SI7020_IIC_Stop();//产生一个停止条件
' L+ f9 ^2 b/ w. d6 i& j9 Z - value=temp[0]|(temp[1]<<8);
9 V, ~1 E# _; t" N" r1 [4 K - return value;# U( V3 W: ?1 z) e
- }
9 d- G( C+ m1 Y, L: I/ [1 O# F - //读取湿度" v7 q* x; u( _+ U( X
- //返回值为湿度: F) z5 [0 J! ~$ [$ D1 Q1 p" {
- int16_t SI7020_Read_Humidity(void)
. f5 D0 K( Y& D8 J - {
6 \: c* M8 |! d+ E* \/ h - uint16_t value=0;
2 [6 ]4 a1 C4 e) ]6 t7 O - double temp;9 \5 \0 o- U) Q& ~9 T
- value=SI7020_ReadOneByte(SI7020_HUMIDITY);
% y5 f& t5 W7 v! H' x" d+ g- t) x - temp=(double)value;
( R: ], M/ f. M0 s - temp=(temp/65536.0f)*125.0f-6.0f;
4 M! i1 r1 `1 k! Q# ?2 z7 L8 a - GIZWITS_LOG("Humidity = %.2lf \n", temp);//机智云的串口打印, B4 c; b1 f1 ?- W
- return (int16_t)(temp*10); //返回湿度值,此处放大了10倍
* Z) |+ H3 |7 N% @$ x - }
1 q8 ?% F" o! d$ T - //读取湿度
% V( G+ q# c3 }; f" P9 \6 W1 A, U - //返回值为湿度
$ g9 n4 A7 k/ h) v) E - int16_t SI7020_Read_Temperture(void)
|7 V$ v* F' i7 o - {. ?5 _( x- P! |: s0 V6 S z
- , z6 R5 a: f# A0 h$ j& q4 \$ G
- uint16_t value=0;
5 r2 ]5 M8 r: ]% l+ m0 K - double temp;$ E1 y" ?8 z2 y' x' ~; T* W
- value=SI7020_ReadOneByte(SI7020_TEMPERATURE);% V9 X7 l8 a" w/ O7 d& v3 g) }
- temp=(double)value;" Q( _" w8 _8 M' i
- temp=(temp/65536.0f) * 175.72f - 46.85f;5 M) v5 B5 e" P" C, U: b
- GIZWITS_LOG("Temperature = %.2lf \n", temp);//机智云的串口打印* h5 [! r6 H' t ]; C) w
- return (int16_t)(temp*10); //返回温度值,此处放大了10倍% U( d6 I! h3 Q" w* o3 o4 N
- 3 O2 C0 k& F3 W! a9 h8 I4 ]
- }2 i# H- b2 D5 b! T
- , O, {2 q( V+ y1 _4 v& x- W
- ' |: r' h8 ^; m N# X& c
, ~! m$ b. F( |4 }) N4 r5 ]- . I y$ W$ ? z3 c4 y
, B8 S9 ^6 H! j4 z3 ^! v' s- - ^, ^; n2 ]& W1 z) ?' \. }% [: p
0 L# U4 {* J4 w8 c' P- . ~% {9 i& m, M+ C( G5 j+ [
- ' E$ M8 |! B$ B" n# r$ K
- v) C- Z4 Z" n2 _5 @5 x+ K
: Y. ^' _- ^. |! ]3 Q& j' H
8 V% Z6 w( ~1 h! [: d6 W
复制代码 下面附上附件
$ ?& g$ j6 N" V X- @- x$ h. E+ Y! ]1 a" O
Hal_SI7020.zip
(1.27 KB, 下载次数: 37)
|