请选择 进入手机版 | 继续访问电脑版

你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32模拟IIC程序--SI7020验证

[复制链接]
haifeng-388081 发布时间:2017-12-22 17:07
使用STM32F030C8T6普通IO口模拟IIC程序,已经实验验证可以使用。使用时请修改相应的管脚和延时函数即可。各个函数在程序中有备注就不一一说明了。还有一个是使用IIC读SI7020的示例程序。大家可以去使用。 QQ截图20171222170728.jpg ; h4 b' ]% S- W0 ~
si7020_iic.h3 h2 ^/ r: e4 X, G" b% p
- H$ j1 j( m, c7 a) Y
  1. #ifndef __SI7020_IIC_H8 J2 a7 X, e0 b1 j4 H( n5 r4 C$ G% n
  2. #define __SI7020_IIC_H
    % A4 ?' R- u; s9 p5 O
  3. #include <stdio.h>
    ; Y/ o/ p0 K2 l$ y! Z
  4. #include <stdint.h>  f9 v: j& k  f/ _7 ^7 g" R% [
  5. #include <stm32f1xx.h>
    * V. Z0 N1 x* s" G- c1 l( i0 o  E# [) [
  6. //////////////////////////////////////////////////////////////////////////////////         
    9 q+ \' \5 v& }1 G7 {: L
  7. //本程序只供学习使用,未经作者许可,不得用于其它任何用途, Y0 o- w1 v& G  u; ]( m) G
  8. //IIC 驱动函数头文件           * @2 S6 }) w) g( i8 i
  9. //使用普通IO口模拟IIC
    # m/ @# h% r# d, p- w0 w' o( ^
  10. ////////////////////////////////////////////////////////////////////////////////// % B6 P0 p. p; V; L4 u2 Q, S
  11. # I$ ^. X0 _/ T5 J# u$ {
  12. typedef enum
    ) o# \" _! \# b* `! [
  13. {' P7 q2 Z6 k* S+ \
  14.         NACK = 0,
    + p5 d5 ^( }/ r$ G! S* @
  15.         ACK =! NACK,' O% D6 `/ W. R
  16. } AckStatus;
    , T7 j: @7 C& g
  17. #define SI7020_IIC_SDA_CLK    RCC_APB2Periph_GPIOB8 j6 X0 o# c  R: ?9 w2 {
  18. #define SI7020_IIC_SDA_PORT   GPIOB/ H  s8 `$ X; i0 R$ J; ?5 v
  19. #define SI7020_IIC_SDA_PIN    GPIO_PIN_5
    * H' q2 e8 c6 O& k
  20. 3 |7 s1 Z9 R) ]+ k; p, g5 [
  21. #define SI7020_IIC_SCL_CLK    RCC_APB2Periph_GPIOB+ j9 E7 R1 ^7 n; p
  22. #define SI7020_IIC_SCL_PORT   GPIOB' u; ~! ~+ B+ D  P! Z  e
  23. #define SI7020_IIC_SCL_PIN    GPIO_PIN_6) T* c, q! o9 g. z- q& s' o# e
  24.                                  9 H# t9 X) \* G$ ]: T! l" q. y2 x
  25. //IO方向设置
    4 X4 O+ r; s9 M: r2 w- J8 W
  26. #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 |
  27. #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

  28. - W( a, a/ K; ]+ D: H
  29. #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
  30. #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
  31.    
    ' h. Q9 h+ z8 j1 S8 t; h8 u5 M4 p
  32. //IIC所有操作函数
    + T) d. E; _+ i, y
  33. void delay(unsigned int j);
    , }0 E" j* Y0 j+ [/ m
  34. void SI7020_IIC_Init(void);                //初始化IIC的IO口                                 
    $ h1 {) D. R! s$ Y' |$ b
  35. void SI7020_IIC_Start(void);                                //发送IIC开始信号8 `" P. ~8 @" m& P) v4 d
  36. void SI7020_IIC_Stop(void);                                  //发送IIC停止信号( D+ E( r3 L+ m% a: q
  37. void SI7020_IIC_Send_Byte(uint8_t txd);                        //IIC发送一个字节; U+ {: T+ Q" P$ b
  38. uint8_t SI7020_IIC_Read_Byte(unsigned char ack);//IIC读取一个字节. N- u. K& E  h& L+ x7 b* d
  39. uint8_t SI7020_IIC_Wait_Ack(void);                                 //IIC等待ACK信号1 m& F; v. }1 q4 J/ ~+ v( x  O/ X
  40. void SI7020_IIC_Ack(void);                                        //IIC发送ACK信号
    : d3 X) Y# U1 Q4 O; i: d
  41. void SI7020_IIC_NAck(void);                                //IIC不发送ACK信号  
    , }9 ]! Q1 ~7 Z+ }
  42. #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
  1. #include "Hal_SI7020_IIC/si7020_iic.h"
    ' \  \$ H3 _0 J! J  L1 q9 V
  2. #include "delay/delay.h") |8 _6 s, ?+ c( j% a9 K
  3. #include "common.h"/ h- O! i, F4 l- E4 N1 @8 b+ f
  4. //////////////////////////////////////////////////////////////////////////////////         
    ( W2 U5 ^' @$ ]
  5. //本程序只供学习使用,未经作者许可,不得用于其它任何用途" c9 X0 E8 g2 v
  6. //IIC 驱动函数           + [# m$ x9 C) K( \
  7. //使用普通IO口模拟IIC
    ; {5 G6 M- f( {% ]5 |6 b
  8. //请根据程序修改相应头文件和延时函数。
    ) T' i% Y& k3 D. K+ }
  9. //////////////////////////////////////////////////////////////////////////////////$ Q8 ^* E8 X+ I/ m* I7 F% k
  10. //延时函数如果需要修改请修改此处:us4 K% m6 y, C* g  x) E8 K7 H7 ^
  11. void _delay_us(uint32_t us) 8 ?! x+ z% h& L: X
  12. {; a6 J1 Z3 |- N& J
  13.         delay_us(us);3 n0 q1 \( F7 n' a! F7 @
  14. }9 E7 ]! {$ P$ [
  15. void SI7020_IIC_Init(void); o# h2 P  X  C
  16. {                                             $ _* m8 Q5 D5 X0 w2 r1 {
  17.         GPIO_InitTypeDef GPIO_InitStructure;3 `$ q0 i1 f6 m5 j: }
  18.         __HAL_RCC_GPIOB_CLK_ENABLE();* G0 E! l$ h# m" A. p- {" Y3 _, P% p
  19.         1 y4 ?7 t' ^/ `2 A
  20.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    0 _" f, M8 I5 `; B+ Q
  21.     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    8 ]$ v. R# T, K5 D6 g$ ]' i: `" N) e
  22.     GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;7 I6 Y, _: h( s
  23.     HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);. Y3 D( S# Q6 P, H$ [" ~8 g; @0 ~
  24.         ; K: R. v4 e# R: D1 ^
  25.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;/ o* l5 P5 |/ \: R/ F$ t5 A" g
  26.     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    # [/ ~# V% k7 ^  O
  27.     GPIO_InitStructure.Pin = SI7020_IIC_SCL_PIN;
    3 H5 `* [( l5 ?, @! D
  28.     HAL_GPIO_Init(SI7020_IIC_SCL_PORT, &GPIO_InitStructure);
    # V6 A" d# H9 T& N0 _
  29. % b+ d+ V: ]! Q* g( l
  30.         HAL_GPIO_WritePin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN,GPIO_PIN_SET);
    $ V+ V7 p/ W9 w5 s  p
  31.         HAL_GPIO_WritePin(SI7020_IIC_SCL_PORT,SI7020_IIC_SCL_PIN,GPIO_PIN_SET);$ j1 ^. p" t( `$ K; m

  32. 0 y3 }7 L( j( c0 B* U
  33. }
    - |" Z5 }) {6 Y, O9 D7 D
  34. void SI7020_SDA_IN()
    ! J( l0 @0 y# ?& V* _7 q
  35. {7 f, e  Y; _& a9 i) [' x/ H
  36.         GPIO_InitTypeDef GPIO_InitStructure;
    / Y3 E. @- A- W* O6 f1 x& ]
  37.         __HAL_RCC_GPIOB_CLK_ENABLE();" d" A* n/ b) d/ j0 Q- y; b
  38.     GPIO_InitStructure.Mode = GPIO_MODE_INPUT;
    5 p. ?. ?7 ?; q) y  Q) ?
  39.     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;6 n$ r9 f2 L( [) i  e
  40.     GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;2 ~6 _( b/ O+ k" r" H6 r6 C
  41.     HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);9 r" ?2 H: Q* j; Y2 h
  42. }& Z$ W/ a0 I, g4 D( m
  43. void SI7020_SDA_OUT()$ v1 I+ V- l1 y1 T% o7 g0 W
  44. {% I$ \: Z4 T* V6 M/ B2 N5 o
  45.         GPIO_InitTypeDef GPIO_InitStructure;( k! H* {5 T/ H/ \! k6 \3 n
  46.         __HAL_RCC_GPIOB_CLK_ENABLE();
    ! }7 y9 M1 K  F  o/ i: w6 s
  47.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;) p3 b+ `8 c+ f9 P; [
  48.     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    0 t  `4 c& S% g, N3 Y- x+ p2 Z
  49.     GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;1 y2 o( Z1 G5 E( I
  50.     HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);
    1 g, w0 M1 ^' L
  51. }
    / z/ Q( O& B& }7 p. M' o
  52.   e, m% v1 i. M5 {/ U
  53. //产生IIC起始信号
    0 l* G& M' ~7 c- L) o
  54. void SI7020_IIC_Start(void)4 {7 Q! [4 T8 |
  55. {& k: T7 B  G5 F1 Z/ w
  56.         SI7020_SDA_OUT();     //sda线输出3 h, ^' P3 m. N# t: A
  57.         SET_SI7020_IIC_SCL_PIN();" s- H# {/ I& H  l" d
  58.         SET_SI7020_IIC_SDA_PIN();
    ! r" d8 Z% I% I9 O
  59.         _delay_us(3);
    ! i  x/ j1 Y3 ]! [! x
  60.         RESET_SI7020_IIC_SDA_PIN();( V, ]8 q- r9 P) ?4 j5 t/ o
  61.         _delay_us(3);
    & r2 \- ^* u  b& F" c$ n- x5 h
  62.         RESET_SI7020_IIC_SCL_PIN(); //钳住I2C总线,准备发送或接收数据
    . W$ v) [- o6 k2 h0 K
  63.         _delay_us(3);) y" f9 D' X' i2 y. G
  64. }          1 s4 Q7 I0 U4 }% [5 ~: G
  65. //产生IIC停止信号; I4 s7 ?6 d; @% f# {
  66. void SI7020_IIC_Stop(void)3 w# p# d- H- w1 T" e; B
  67. {: u, B/ h, O" M
  68.         SI7020_SDA_OUT();//sda线输出
    1 v# s9 V/ L% }2 O
  69.         RESET_SI7020_IIC_SDA_PIN();
    3 g, Q: z/ z: F/ J5 W) ~3 ~, @
  70.         SET_SI7020_IIC_SCL_PIN();
    ! p- R& }3 \# H4 V
  71.         _delay_us(4);8 I& k' f& o! g# g0 d
  72.         SET_SI7020_IIC_SDA_PIN();
    ; H% Y" _3 l$ u+ C
  73.         _delay_us(4);                                                                  
    " n0 c; H1 W) Y' r/ X6 F6 @; _
  74. }
    * i% i$ B- I% K' S  `* S
  75. //等待应答信号到来
    1 v9 ]# f  y4 r
  76. //返回值:ACK,接收到应答
    ! l! W7 |- O: g9 [& J$ o5 F
  77. //        NACK,未接收到应答. e. K1 r2 ^" R5 C
  78. uint8_t SI7020_IIC_Wait_Ack(void)
    2 d: b8 X  _3 z* b# W4 Y- n$ {: ~1 G: ~
  79. {
    ) H; m4 E3 h) `0 o9 c1 O$ B
  80.         uint8_t ucErrTime=0;
    & Z: Q; T3 I; f! h$ b
  81.         SI7020_SDA_IN();      //SDA设置为输入   
    $ v5 _! t0 H1 q) Y, \* ~
  82.         SET_SI7020_IIC_SCL_PIN();
    2 j/ h' _1 d9 L2 i
  83.         _delay_us(5);         4 E) o# z/ p& Y( ?! Y; E
  84. //        while(HAL_GPIO_ReadPin((GPIO_TypeDef*)SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))( f2 E; K" i* |) `" b5 L: E
  85. //        {- C: A' B3 ^0 j* H& s& r
  86. //                ucErrTime++;
    4 L! ?/ M! L6 S) z; }& W$ N. r
  87. //                if(ucErrTime>250)  G) Y" S8 z: Y% C* h6 Q6 i
  88. //                {9 m1 N* M7 ~- B# h- ^; \5 W
  89. //                        SI7020_IIC_Stop();5 X+ o- [) T1 a- w1 C' K7 G: T) d
  90. //                        return 1;//接收应答失败2 E9 d2 G; Y3 }# K; ]1 P( n
  91. //                }3 Y0 c1 s1 ?+ r
  92. //        }2 w0 [8 G! V, G! C9 }. L& o, [
  93.         if(HAL_GPIO_ReadPin((GPIO_TypeDef*)SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))" ^" ]: d2 q. A7 Q' y
  94.                 return ACK;
    7 B! u6 D6 X5 M5 a% Q8 u
  95.         RESET_SI7020_IIC_SCL_PIN();        8 ?, z9 \" ^1 \# y# ~' G
  96.         _delay_us(5);& O1 q. s8 n, l" ^8 P. t
  97.         return NACK;  : F8 b# ?* J% \. e' D
  98. }
    & `9 `, O- e7 y# S) X: |; T
  99. //产生ACK应答3 Z/ j. P  |4 q
  100. void SI7020_IIC_Ack(void)2 B4 g1 w$ u! q5 d+ L
  101. {7 y: ]# @: f. p4 B! m5 t" `  Q
  102.         RESET_SI7020_IIC_SCL_PIN();7 ?% K& a9 ]2 n- }( o9 k  n% c9 T
  103.         SI7020_SDA_OUT();% W. i2 `6 |5 s8 X: L2 n5 `
  104.         RESET_SI7020_IIC_SDA_PIN();# ~4 ^! B2 G+ ?" U" G3 W8 J  ^
  105.         _delay_us(2);- r3 @& `0 V' v) P" d3 `
  106.         SET_SI7020_IIC_SCL_PIN();
    ; y! k. w+ {) {$ L
  107.         _delay_us(2);& j+ g0 c; Z2 v+ q. f1 L
  108.         RESET_SI7020_IIC_SCL_PIN();0 y$ R3 S9 U) y% T( ]% f. G$ C. Q
  109. }# F. q$ T1 ?7 {" N9 e# k
  110. //不产生ACK应答                    0 m& W1 i7 h4 B, m& O3 `3 J* ?, p
  111. void SI7020_IIC_NAck(void)
    . u8 C* w0 ^; c4 l+ S
  112. {, I8 N/ M3 E- F
  113.         RESET_SI7020_IIC_SCL_PIN();% @. ?8 n$ ?( b5 E
  114.         SI7020_SDA_OUT();% X% d, J2 q$ c& a) _) Y" w
  115.         SET_SI7020_IIC_SDA_PIN();9 p# _  j# x) ]) s  J
  116.         _delay_us(2);
    5 N7 X7 n- Y* [  \2 ~: t
  117.         SET_SI7020_IIC_SCL_PIN();7 {; ~+ m6 u3 h
  118.         _delay_us(2);7 b) G. ?3 x$ m1 R" U
  119.         RESET_SI7020_IIC_SCL_PIN();: Q% O1 u, [) c! E; m3 R5 `
  120. }                                                                              
    & H7 P+ w) L$ s& F, Q
  121. //IIC发送一个字节3 F- U. m5 ^  u/ `% @% Z
  122. void SI7020_IIC_Send_Byte(uint8_t txd)  r% Z) f+ z" I) z# E; m
  123. {                        
    ( P* P7 r3 A" Y; @6 P5 e
  124.         uint8_t t;   
    + F- t5 e4 X4 b* x
  125.         SI7020_SDA_OUT();             
    " x- S/ v9 o; r# O  s% @
  126.         SET_SI7020_IIC_SDA_PIN();
    + E4 n3 h# @2 K
  127.     for(t=0;t<8;t++)+ x" R! o# J3 ?6 _- M9 P. G, f0 K# n# ?
  128.     {              9 }. L' u+ Z+ |% d
  129.                 if(txd&0x80)
    % |" C+ ~/ s6 l- V
  130.                         SET_SI7020_IIC_SDA_PIN();
    0 O3 U  G* i+ G' c6 u9 e
  131.                 else . c+ [- V' ]% J: a$ d- T. i
  132.                         RESET_SI7020_IIC_SDA_PIN();: w6 r4 S  Y& H
  133.         txd<<=1;           
    6 k0 _% b4 F$ X
  134.                 _delay_us(2);   //对TEA5767这三个延时都是必须的& C8 a& _4 O6 k( H' |* l; m
  135.                 SET_SI7020_IIC_SCL_PIN();
    - _4 k; ~. v4 h
  136.                 _delay_us(2); ( Q/ m" `- |' K, ?! b6 O
  137.                 RESET_SI7020_IIC_SCL_PIN();
    0 @( Q& P9 _: `; o0 T: P9 w) n0 x: X
  138.                 _delay_us(2);% N9 L3 f% w. x5 j; \
  139.     }
    - E# n: i5 y1 s0 A9 v8 K
  140. }             * Y6 s) {# B9 X2 K; L8 |' U2 e
  141. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   ' E4 {. x( e! }; M
  142. uint8_t SI7020_IIC_Read_Byte(unsigned char ack)9 h, X/ m! E' L  y0 I" T
  143. {$ a6 K! c- f. m. M/ P9 D
  144.         unsigned char i,receive=0;$ a4 V8 Y/ R) E% u3 ^
  145.         SI7020_SDA_IN();//SDA设置为输入7 D( H. R3 o. F9 a2 q) p% Z
  146.     for(i=0;i<8;i++ )/ y" i; W& H2 O8 k! k- {
  147.         {
      l0 J8 B- a" `, r+ Y, D2 e+ I
  148.                 RESET_SI7020_IIC_SCL_PIN();) q  G  P0 Q! |: w' C
  149.         _delay_us(2);4 I" V- |& B7 M/ A* S
  150.                 SET_SI7020_IIC_SCL_PIN();7 X0 l" B1 I# F; l8 k/ C
  151.         receive<<=1;
    1 z# J7 y. E6 X6 \
  152.         if(HAL_GPIO_ReadPin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))receive++;   
    9 l; G- G  O: s$ N  z; B/ g2 C
  153.                 _delay_us(2);
    + C1 X) b# U: H  w) _
  154.     }                                         1 \  \2 d# b( D, b; T% @
  155.     if (!ack)4 Y' @% Y9 G0 `
  156.         SI7020_IIC_NAck();//发送nACK
    ; @3 ^3 k1 r) Z
  157.     else. f9 W2 h, f1 b5 A
  158.         SI7020_IIC_Ack(); //发送ACK   
    - X) E4 n5 _- e8 r7 j) u+ Q/ D
  159.     return receive;9 Z8 [8 E1 p+ v. ?! L' \
  160. }
复制代码
si7020.h
9 ]3 z# x4 W6 ^7 _; [' x
  1. #ifndef __SI7020_H7 Z" C/ H3 H- d) Y
  2. #define __SI7020_H6 j5 m" j) U0 T- K9 ]
  3. #include <stdio.h>1 `: P) a6 w. B, r1 y5 ?
  4. #include <stdint.h>
    & V! Q8 L3 h# S
  5. #include <stm32f1xx.h>
    $ R3 J; O+ _6 q# g
  6. typedef  uint8_t u8;9 a4 l2 ]) l+ Z) ~0 x
  7. typedef  uint16_t u16;: j  R9 h9 M/ P4 n7 V$ @; ]" X4 a
  8. typedef  uint32_t u32;7 v( N  ]/ N5 k% t# b
  9. #define SI7020_ADDRESS 0X80 //SI7020器件地址
    # P; }: K# y% b( g" {: t, X
  10. #define SI7020_READ 0X01        //读数据  c# o; t2 F0 G- \) d! F

  11. # F+ A$ X: j; R0 Y; s# p
  12. #define SI7020_TEMPERATURE      0xE3
      l3 @, m6 q+ P8 v) @* _* h1 K
  13. #define SI7020_HUMIDITY         0xE55 x+ ]$ v' }! h5 \
  14. #define SI7020_SOFT_RESET       0xFE
    $ b, ~8 c1 v, X1 E' ?: n

  15. 0 a' j5 @; L7 y
  16. void SI7020_Init(void); //初始化IIC
    8 Y* _1 _% s8 r$ d: r/ }, V
  17. uint16_t SI7020_ReadOneByte(uint8_t ReadAddr);
    - k6 [4 w! N/ d' @6 E( u
  18. int16_t SI7020_Read_Humidity(void);
    9 ]$ s. E( h  `& d
  19. int16_t SI7020_Read_Temperture(void);. p+ R0 v/ M/ f9 g/ @! q
  20. % I8 ?5 A* E  n9 {6 R9 `/ {
  21. #endif
复制代码
si7020.c
* m* R- R( c. v$ z! s" f
  1. #include "Hal_SI7020/si7020.h" 7 |+ D* ?) w: V6 e  D6 t, b
  2. #include "Hal_SI7020_IIC/si7020_iic.h"
    9 Y9 n" e# _" x9 A
  3. //#include "delay.h"
    + e& j6 Q9 Z4 A
  4. //#include "delay.h"
    5 Q, j. [; @( f! q8 y
  5. #include "Hal_OLED/oled.h"
    9 g$ T  H* W, Z1 E
  6. #include "delay/delay.h"1 G. c0 a# ]8 Z! R) N
  7. #include "common.h". p4 F6 b$ X/ S
  8. //SI7020串口初始化" N( Z7 ?; a( J+ ~2 P: ?0 C
  9. void SI7020_Init(void)
    ! i9 L! K* [9 f* d
  10. {6 g. `7 s1 k/ N  y, E
  11.         SI7020_IIC_Init();% h/ d% d% n, R* N( V! J
  12. }7 |& e) C# g* G0 D( v) s/ a
  13. //在SI7020指定地址读出一个数据. H8 E1 O% u. D# |* c
  14. //ReadAddr:读取温度或温度  
    ) `1 [: S0 Q* D3 b
  15. //返回值  :读到的数据7 i( B6 w% {) W# s9 _6 A, V/ S
  16. uint16_t SI7020_ReadOneByte(uint8_t ReadAddr)
    % S; c) U+ k0 k5 f0 b! n& B
  17. {                                  4 ?, ]$ e8 F% n
  18.         uint8_t error=1;3 z5 b* T5 \, _. T
  19.         uint8_t temp[2];
      F- U' i3 M( |$ |" L- N
  20.         uint16_t value=0;
    $ p+ y9 `, k  e, e1 ~. U; s
  21.         SI7020_IIC_Start();
    # d0 B4 h! c" g3 E7 h: d
  22.         SI7020_IIC_Send_Byte(SI7020_ADDRESS);0 a! c& g0 [# e5 M( }- k5 Y6 T
  23.         SI7020_IIC_Wait_Ack();
    " P4 N1 D( i7 t- f
  24.         SI7020_IIC_Send_Byte(ReadAddr);
    9 o+ ^# y5 h" T9 r/ E. f
  25.         SI7020_IIC_Wait_Ack();
    $ h' B! ]8 S# Q# M
  26.         SI7020_IIC_Start();
    / Y' J& J+ ?" ]) B# c6 G, k
  27.         SI7020_IIC_Send_Byte(SI7020_ADDRESS|SI7020_READ);
    + e% A. `/ Z2 P$ J8 P
  28.         SI7020_IIC_Wait_Ack();
    & E) b+ F* n  r8 J& R
  29.         delay_ms(20);                                                //延时一段时间,不可少。' i6 C: n* o/ d
  30. //        SI7020_IIC_Start();                                        //若使用No Hold Master Mode模式请使用此3行程序/ b) ?3 e: S1 U! t" d
  31. //        SI7020_IIC_Send_Byte(SI7020_ADDRESS|SI7020_READ);
    6 E$ \( x" d2 x$ \
  32. //        SI7020_IIC_Wait_Ack();
    1 ?  Z& A" M0 c( v* ?5 U5 T' h
  33.         temp[1]=SI7020_IIC_Read_Byte(1);
    - A$ w6 t- @& L
  34.         temp[0]=SI7020_IIC_Read_Byte(0);& {- E$ c/ q9 i  H) l! m2 Y
  35.         SI7020_IIC_Stop();//产生一个停止条件3 ?5 S7 ?0 ^4 v- \9 T9 o' M
  36.         value=temp[0]|(temp[1]<<8);% \! F# G2 Q  w
  37.         return value;6 u  l/ F$ |4 Y. h) A% k! ~. \: s
  38. }. b* \4 ]' m1 F6 w! _& o: @
  39. //读取湿度8 E# G" O$ h; o* S  C
  40. //返回值为湿度
    : ?& L" H# J$ y# v
  41. int16_t SI7020_Read_Humidity(void)& \2 G5 b) ~# `+ ]8 a
  42. {       
    4 b2 q$ E1 _; \; a" ^
  43.         uint16_t value=0;
    5 G& d7 F% a  {
  44.         double temp;
    ; L8 P9 B' S9 j
  45.         value=SI7020_ReadOneByte(SI7020_HUMIDITY);9 E  g/ P3 ?! _4 T- N
  46.         temp=(double)value;0 d  H( u8 S, O; X3 l
  47.         temp=(temp/65536.0f)*125.0f-6.0f;% ?3 K: n8 p0 Z" U' y. j! ~/ X2 Y
  48.         GIZWITS_LOG("Humidity = %.2lf \n", temp);//机智云的串口打印
    / y3 `8 r: V& ^
  49.         return (int16_t)(temp*10);                                //返回湿度值,此处放大了10倍
    % m3 L' M1 `5 g" G: i# y( N
  50. }& q/ G3 M: U) N  e  H- G
  51. //读取湿度* j, W- V) D, I" H
  52. //返回值为湿度
    : |* W" W( |( G/ n. c! m" n( H0 V
  53. int16_t SI7020_Read_Temperture(void)
    6 W7 O6 b  _- [$ C
  54. {6 d0 D; m( A8 d, X$ F& F2 f4 o. p/ h
  55. ( s9 m3 T& w9 v1 K
  56.         uint16_t value=0;
    0 a) h) i. o) j, ^8 D' {! z
  57.         double temp;( \$ [# [, b/ C. V- q! G
  58.         value=SI7020_ReadOneByte(SI7020_TEMPERATURE);
    0 g) h& [( M& P+ V! B* u0 C
  59.         temp=(double)value;) Z! w9 x4 e" ~6 r8 n/ T
  60.         temp=(temp/65536.0f) * 175.72f - 46.85f;7 `5 @% \0 @, {) c3 [3 v0 Q
  61.         GIZWITS_LOG("Temperature = %.2lf \n", temp);//机智云的串口打印+ i6 ^9 I& t+ i4 u( N
  62.         return (int16_t)(temp*10);                                        //返回温度值,此处放大了10倍
      ]( y0 V" i, n6 C8 B- i! C0 ~
  63.         8 w+ a% ?* N9 r! g# `. A/ V" A6 b4 \; \
  64. }* T% ], x0 O- K

  65. ; k* A7 J2 K. a' _* X7 W
  66. 7 I5 q: O6 s% {% \  S# d
  67. , S' d( p' s+ J3 ~# L9 j

  68. 4 w2 _9 q* W  ^$ _: g

  69. , {5 I! x+ ]  b  m$ ]/ T
  70. . Q, ]; O6 h9 B
  71. 4 l" ^7 h( ?, Y6 A; a7 i1 \
  72. # B; s% o. q; t- b/ J) U% s6 N

  73. % \' E3 t& x4 K# _; l
  74. ) W3 J( x, q. k2 [- U! h
  75. + H7 B( k5 v9 B5 G
  76. 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)

评分

参与人数 1 ST金币 +2 收起 理由
Inc_brza + 2

查看全部评分

1 收藏 1 评论0 发布时间:2017-12-22 17:07

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版