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

STM32模拟IIC程序--SI7020验证

[复制链接]
haifeng-388081 发布时间:2017-12-22 17:07
使用STM32F030C8T6普通IO口模拟IIC程序,已经实验验证可以使用。使用时请修改相应的管脚和延时函数即可。各个函数在程序中有备注就不一一说明了。还有一个是使用IIC读SI7020的示例程序。大家可以去使用。 QQ截图20171222170728.jpg
' z5 X3 g; L1 y3 c" {si7020_iic.h/ r- S9 N% }% d. x

2 ~! G7 X6 t- l/ M. [
  1. #ifndef __SI7020_IIC_H3 R6 _/ U: i9 @3 b
  2. #define __SI7020_IIC_H# a+ {( I% |- F0 K, O. c& N
  3. #include <stdio.h>
    8 D5 m/ w, V& D4 X: D
  4. #include <stdint.h>
    7 J/ D  S! ~7 k
  5. #include <stm32f1xx.h>7 t8 I0 E' e) l5 E$ t
  6. //////////////////////////////////////////////////////////////////////////////////         
      q2 ]# W, @( c" L3 D3 z
  7. //本程序只供学习使用,未经作者许可,不得用于其它任何用途& f# x) C; O- @! }; j6 y
  8. //IIC 驱动函数头文件          
    ' G$ K$ m4 x) M" ], t& L! b, ?5 X6 q
  9. //使用普通IO口模拟IIC/ N8 E5 H: |+ V! D8 F
  10. ////////////////////////////////////////////////////////////////////////////////// ' G# F; `/ j/ p
  11. ) S. C' g. o) _& F# j" L
  12. typedef enum
    . B3 a0 {: Z. |% C1 g& u, l& H
  13. {; n9 l: N+ Z( S6 d4 B5 @
  14.         NACK = 0,7 s( M  @3 V, R2 e: h
  15.         ACK =! NACK,7 ]$ P: O6 l1 `- }* n  e2 A. K
  16. } AckStatus;
    8 m' u1 [3 ^# W
  17. #define SI7020_IIC_SDA_CLK    RCC_APB2Periph_GPIOB
    5 {% F( B  a2 A; S# B8 ?: v
  18. #define SI7020_IIC_SDA_PORT   GPIOB6 _! ?' I: I- `( T) M7 }) d
  19. #define SI7020_IIC_SDA_PIN    GPIO_PIN_5, s7 `4 L9 t; y& e# a
  20. 8 a" m# {4 j) ]
  21. #define SI7020_IIC_SCL_CLK    RCC_APB2Periph_GPIOB" {0 @, k! u. [9 N7 s. A/ t# E( h
  22. #define SI7020_IIC_SCL_PORT   GPIOB
    ' _$ r' W" t3 w- B" |: H7 C
  23. #define SI7020_IIC_SCL_PIN    GPIO_PIN_6
    ' |& H9 x, I: R) w) |: g( S
  24.                                  6 K* c( b. _5 v
  25. //IO方向设置
    8 ~5 F0 q( O! H: d
  26. #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
  27. #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

  28. ' V. f4 N& o7 R$ b" k
  29. #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
  30. #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
  31.     & l" r" ?9 @8 c' z/ g. W& {
  32. //IIC所有操作函数
    6 e' ?4 q. g! l% Q
  33. void delay(unsigned int j);9 F! F7 Y6 ~1 b  n3 n
  34. void SI7020_IIC_Init(void);                //初始化IIC的IO口                                 1 I3 L. b$ g) _8 d4 |: F
  35. void SI7020_IIC_Start(void);                                //发送IIC开始信号# F( D+ I) H. n  T" N* F
  36. void SI7020_IIC_Stop(void);                                  //发送IIC停止信号
    / z9 d: w3 K: m9 s
  37. void SI7020_IIC_Send_Byte(uint8_t txd);                        //IIC发送一个字节' A! l) b3 y. X3 l+ I: Q3 t. E3 V
  38. uint8_t SI7020_IIC_Read_Byte(unsigned char ack);//IIC读取一个字节& }" d+ C& Q. v5 [) k- i! ^5 f
  39. uint8_t SI7020_IIC_Wait_Ack(void);                                 //IIC等待ACK信号1 q" }; K) W2 {% o0 q& E$ o* D
  40. void SI7020_IIC_Ack(void);                                        //IIC发送ACK信号
    7 o( D/ d  I8 ?/ p- C
  41. void SI7020_IIC_NAck(void);                                //IIC不发送ACK信号  
    ' I/ B% C5 a7 g. k  f% |) `) X
  42. #endif& G+ A2 N8 u7 R
复制代码
si7020_iic.c
7 r6 V0 [( U. a
6 ^" z9 O# Z; X% o7 |
  1. #include "Hal_SI7020_IIC/si7020_iic.h"& K2 ~+ |- U* b! C* G
  2. #include "delay/delay.h"7 ~" {$ @+ ]& X" t! X
  3. #include "common.h"
    ) L2 p, a, J$ g
  4. //////////////////////////////////////////////////////////////////////////////////         ' k8 D3 p# u7 l, B- t7 @  z
  5. //本程序只供学习使用,未经作者许可,不得用于其它任何用途) H3 y4 ?5 _* n, _: ~
  6. //IIC 驱动函数           1 e0 J6 l! c  h, N# `/ w& `) u
  7. //使用普通IO口模拟IIC
    % e6 C* H* i% s/ Q  X. z, p& d2 g8 U
  8. //请根据程序修改相应头文件和延时函数。
    $ r% Q% K% P% i% u
  9. //////////////////////////////////////////////////////////////////////////////////" v7 i) t% |" B6 o5 s( ^
  10. //延时函数如果需要修改请修改此处:us
    4 u4 C5 f4 O' W5 Q" t: n7 l
  11. void _delay_us(uint32_t us) 9 }4 z1 g, u$ R7 q1 S0 ^  i) v- E7 q
  12. {9 `* S* R" s# F, r3 a
  13.         delay_us(us);( ^; ~' I5 ^! D% p5 T
  14. }
    ( a' Y/ w) c3 v4 {. i
  15. void SI7020_IIC_Init(void)
    8 L, N! z- d, G8 I5 e3 w  ?
  16. {                                             
    & c, R# I$ {5 ?. L( Y
  17.         GPIO_InitTypeDef GPIO_InitStructure;4 b* U% ?% d/ b
  18.         __HAL_RCC_GPIOB_CLK_ENABLE();
    4 Y* Z+ |9 G3 B( s& s3 j
  19.        
    # `4 A+ ?9 F  I0 Z
  20.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    0 s9 a  _. r5 x
  21.     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    ! e5 u! Z1 a  R% s. i
  22.     GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;2 z% z! o- S" ]( r
  23.     HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);  w8 b" p" V! X2 B4 O
  24.        
    : P3 Y$ L. j& X5 O% N% }7 F% W. K
  25.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;! d" ?# j8 ]1 h) t: Q- Q
  26.     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;; y* x- ]/ l. Y) |: V5 U
  27.     GPIO_InitStructure.Pin = SI7020_IIC_SCL_PIN;6 @. W* f# M- D! i, h$ X* T) F& L
  28.     HAL_GPIO_Init(SI7020_IIC_SCL_PORT, &GPIO_InitStructure);2 G9 M; W# p4 F) G3 Z; ?

  29. 9 v. `9 a$ f/ U. w+ L6 \' I
  30.         HAL_GPIO_WritePin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN,GPIO_PIN_SET);
    : e) a+ ]5 m( k% I
  31.         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

  32. 8 G) }+ l* k: N2 ^4 ~  S
  33. }8 ?0 W: |7 B6 r1 _
  34. void SI7020_SDA_IN()
    & F7 }$ z1 W; J- {) c. ^0 ]& u3 P
  35. {" E& X0 X5 s: |8 v: |
  36.         GPIO_InitTypeDef GPIO_InitStructure;
    ! p6 w, i2 q3 D3 O9 O. I8 u$ _1 Z
  37.         __HAL_RCC_GPIOB_CLK_ENABLE();
    3 ]' N6 P+ P$ V. d- M1 E; @
  38.     GPIO_InitStructure.Mode = GPIO_MODE_INPUT;, ?* q" R. H8 L
  39.     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;" o5 T+ g: v' k9 j; D1 w) S1 q; ^
  40.     GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;
    6 N  O9 U- n3 b. f( M
  41.     HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);3 d4 S% q+ X' t% L8 m$ B# C, |
  42. }
    ' b% P  f! \6 t% b0 U; T
  43. void SI7020_SDA_OUT()
    / V# G: z% H$ g6 a4 F8 _  N
  44. {& C/ K# T; d$ {- C) |
  45.         GPIO_InitTypeDef GPIO_InitStructure;
    ; ]- o$ {( U" d# A- S
  46.         __HAL_RCC_GPIOB_CLK_ENABLE();
    ! m; v7 h  `5 P: P9 a
  47.     GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    $ K% {" V) |3 e, m( T9 W
  48.     GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH;
    * B% ]) P' k6 ?
  49.     GPIO_InitStructure.Pin = SI7020_IIC_SDA_PIN;
    : H7 r( V- c' a8 F, A
  50.     HAL_GPIO_Init(SI7020_IIC_SDA_PORT, &GPIO_InitStructure);& F3 B3 t2 r7 Q5 Z& g1 U) T$ ~
  51. }7 M/ j3 n/ U* l7 I1 P9 z3 e9 x

  52. , B6 W' R/ `4 W. b* w4 t
  53. //产生IIC起始信号: S7 b1 I" f  O4 q
  54. void SI7020_IIC_Start(void)5 s" ]- M3 X! g& {1 m
  55. {3 b6 m. G* ]" q
  56.         SI7020_SDA_OUT();     //sda线输出
    : o3 C9 `0 e1 F2 \5 p. S
  57.         SET_SI7020_IIC_SCL_PIN();% h5 v  U! L" H1 M1 _( Q
  58.         SET_SI7020_IIC_SDA_PIN();& M' T; Q" e+ N
  59.         _delay_us(3);- ~- J/ ?' c, l# \- G( E3 o
  60.         RESET_SI7020_IIC_SDA_PIN();- r0 t; F- I7 r1 A
  61.         _delay_us(3);. B" `9 L6 ?$ r) D0 M
  62.         RESET_SI7020_IIC_SCL_PIN(); //钳住I2C总线,准备发送或接收数据 6 _; F% A) o6 Z6 R
  63.         _delay_us(3);7 g: m. @; t3 P: U) [
  64. }          
    4 |+ [$ V3 G3 o* t. Y7 s: X9 ]
  65. //产生IIC停止信号
    8 Y  a% G& \/ ~/ M# _
  66. void SI7020_IIC_Stop(void)+ a( d* L: v$ l: l7 t; x+ |; B, C
  67. {
    ! Q& o8 h0 ?; A$ ]
  68.         SI7020_SDA_OUT();//sda线输出
    % a. W2 F! b/ `1 U' _* R
  69.         RESET_SI7020_IIC_SDA_PIN();, D. y4 w# d2 a
  70.         SET_SI7020_IIC_SCL_PIN();" Z/ b* X  q+ Y9 _
  71.         _delay_us(4);
    3 g! c5 U  ^1 N- H$ |$ ~  P0 q
  72.         SET_SI7020_IIC_SDA_PIN();, I- n3 [' q1 K7 p* U
  73.         _delay_us(4);                                                                  
    ) s8 K2 A, k* A3 M) h0 s, M
  74. }- |1 P0 z% J4 o7 k3 y' w! f
  75. //等待应答信号到来
    4 C/ w) ]: d% }) j, S% p' r
  76. //返回值:ACK,接收到应答
    * Y2 E! S) z- j4 A4 C" \! Y8 U
  77. //        NACK,未接收到应答
    2 m, `8 t/ U1 R5 j! [  Q
  78. uint8_t SI7020_IIC_Wait_Ack(void)0 `2 B# i: j# x% j6 I
  79. {% i  c) I! ?  r; o  @
  80.         uint8_t ucErrTime=0;* \2 L9 _+ |9 l! y
  81.         SI7020_SDA_IN();      //SDA设置为输入    6 B; x% w7 B' @5 ^; G, _
  82.         SET_SI7020_IIC_SCL_PIN();
    , n& Z+ N9 h6 i% Y
  83.         _delay_us(5);         , s. P& [) M2 `5 [
  84. //        while(HAL_GPIO_ReadPin((GPIO_TypeDef*)SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))
    6 |  b; r  C+ L. @
  85. //        {5 B- _- a9 M% ?+ c
  86. //                ucErrTime++;" G4 {6 v% S" W8 N- t( ]" }( b
  87. //                if(ucErrTime>250)
    ; k: y4 j1 b* {2 z9 x2 R6 _
  88. //                {8 ^- T' r8 T/ R/ d3 L: h5 \" k
  89. //                        SI7020_IIC_Stop();/ m. e8 q/ X. Z- r% J" `
  90. //                        return 1;//接收应答失败" p7 Y: g" u5 F  [. }) T8 {
  91. //                }
    0 u) l, l+ h4 E4 l& [5 G
  92. //        }
    5 ^, Y6 I( f3 h6 n6 L) A" O3 C& U& }
  93.         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
  94.                 return ACK;. N$ F' O! S, P* V- h) Q6 @
  95.         RESET_SI7020_IIC_SCL_PIN();        5 ~* Z9 }7 N1 E* L% B
  96.         _delay_us(5);
    5 B; l5 U& q, k! B2 n
  97.         return NACK;    W& w  _6 y4 K3 U. H4 ^9 s
  98. } 0 n4 o% M! L7 ]6 L
  99. //产生ACK应答
    . p/ j2 j9 F7 D$ g* M  M& X
  100. void SI7020_IIC_Ack(void)3 n' j0 ]+ N% O) M; r! e3 y
  101. {/ G5 F8 G: v6 Z3 v/ q
  102.         RESET_SI7020_IIC_SCL_PIN();0 p8 Q- o, D- o- I8 t+ m" k* y7 @
  103.         SI7020_SDA_OUT();
    & Q1 r- `6 }, \' _3 L% E8 Y* j% q1 u
  104.         RESET_SI7020_IIC_SDA_PIN();  [) h1 a6 U9 z" x0 n* t5 K
  105.         _delay_us(2);% y: e- B1 ]0 F
  106.         SET_SI7020_IIC_SCL_PIN();+ k8 ~- G. U0 Y% v  n3 M3 j5 S
  107.         _delay_us(2);
    ) a' V5 v) Q' {1 u% ~1 v% ^9 X, e
  108.         RESET_SI7020_IIC_SCL_PIN();  \  t% P& X+ T# x3 n
  109. }8 o6 [5 ^( S6 U2 x. J* }
  110. //不产生ACK应答                    
    6 f) A" A$ W* D# y9 |
  111. void SI7020_IIC_NAck(void)
    & T3 |4 P1 I- B, T9 R
  112. {) @9 z: j* X0 t4 t3 S
  113.         RESET_SI7020_IIC_SCL_PIN();& Q0 z" v  E: I: J9 R( ~
  114.         SI7020_SDA_OUT();
    + q8 T* I( y6 ]$ J$ j9 i0 d
  115.         SET_SI7020_IIC_SDA_PIN();, `: d& f+ ?- H. D6 n  u. P
  116.         _delay_us(2);* U6 M( e' H9 M! R
  117.         SET_SI7020_IIC_SCL_PIN();
    5 n+ Y) y" w4 u; p0 c# ^7 G/ V8 Z6 Q
  118.         _delay_us(2);/ g7 s6 ]" x4 h1 H0 U0 w
  119.         RESET_SI7020_IIC_SCL_PIN();& J1 o1 w) E+ k1 B* _4 h' q& [
  120. }                                                                              
    6 ~& z/ i4 u, s: m
  121. //IIC发送一个字节9 u8 A& K. ]7 c0 R- M
  122. void SI7020_IIC_Send_Byte(uint8_t txd)& O0 e$ D' t, n- C0 c4 P
  123. {                        
    6 O  `  M' n& n# y. x
  124.         uint8_t t;   5 X9 ^. c" m# ^+ b3 m
  125.         SI7020_SDA_OUT();             , v. u* l  t6 f0 m
  126.         SET_SI7020_IIC_SDA_PIN();
    8 X- q0 p5 A3 r! f0 P. A3 l5 y
  127.     for(t=0;t<8;t++)
    + ^8 I* s0 R  ?' k3 h- j2 k* B4 A
  128.     {              0 S+ H& {/ e5 D# G& l: ]8 w
  129.                 if(txd&0x80)
    % N' u8 S% B6 c$ W6 E: ^! O0 m% ?
  130.                         SET_SI7020_IIC_SDA_PIN();4 ?) i; n1 e2 e$ N( p3 s9 `
  131.                 else ( H- H7 k% a- H# l. g) b
  132.                         RESET_SI7020_IIC_SDA_PIN();- T  Y/ s2 `7 S/ n* z0 _
  133.         txd<<=1;           , U" e6 n5 R! m, `$ d' J& b8 a
  134.                 _delay_us(2);   //对TEA5767这三个延时都是必须的
      P: O$ L& c- I3 }3 V5 r; ?
  135.                 SET_SI7020_IIC_SCL_PIN();
    - x5 ?  ?3 {0 k3 y5 `
  136.                 _delay_us(2);
    9 p3 l) B  Y$ ]8 Y! ]
  137.                 RESET_SI7020_IIC_SCL_PIN();- B% b0 w: Q/ K
  138.                 _delay_us(2);+ c2 A6 r6 Z4 \2 u, \* ~- h
  139.     }' Y. T3 O8 r4 ]
  140. }             
    ' n# ]. s$ J4 \4 `
  141. //读1个字节,ack=1时,发送ACK,ack=0,发送nACK   ; L+ B0 C4 z  {2 J
  142. uint8_t SI7020_IIC_Read_Byte(unsigned char ack)
    4 L6 `7 G! e. w* E0 d  w( Y9 B3 l) J0 Z
  143. {
    . N; O: d# r+ O( [0 s8 r+ u
  144.         unsigned char i,receive=0;! J5 ?, m3 S9 E5 Y8 H2 e, p
  145.         SI7020_SDA_IN();//SDA设置为输入
    ' f3 J1 J3 U9 m! l7 ~  w
  146.     for(i=0;i<8;i++ )
    5 @" X% t3 n( a8 J
  147.         {
    0 X% D: R3 _, `
  148.                 RESET_SI7020_IIC_SCL_PIN();
    1 T0 _) E9 E3 E. ~- N
  149.         _delay_us(2);" S4 O1 f/ c/ s* x  K4 p2 ]
  150.                 SET_SI7020_IIC_SCL_PIN();5 H; j$ d# E$ E- _
  151.         receive<<=1;
    2 T1 ~  L) q) u! E; h
  152.         if(HAL_GPIO_ReadPin(SI7020_IIC_SDA_PORT,SI7020_IIC_SDA_PIN))receive++;   
    8 a+ |3 ^9 b- E
  153.                 _delay_us(2);
    6 ^4 P# L: A* g5 c4 b$ b
  154.     }                                         9 t" K7 `9 t1 Y
  155.     if (!ack)
    ' B7 t0 F. S$ e1 a* w' @
  156.         SI7020_IIC_NAck();//发送nACK
      T6 J1 H/ N' G
  157.     else& N& m; `1 l  x
  158.         SI7020_IIC_Ack(); //发送ACK   3 G6 O  S' P2 W$ C
  159.     return receive;" R1 e( j! Y# ^; I% H
  160. }
复制代码
si7020.h6 m; X- i* v3 @, }3 F2 ~: S" z
  1. #ifndef __SI7020_H
    5 e* C; E# b  M# f- ?
  2. #define __SI7020_H
    5 R7 ~. U  v$ O8 h
  3. #include <stdio.h>
    7 m" W9 R' K9 X8 e* c) k. r
  4. #include <stdint.h>
    / J5 G( n0 L9 [2 K7 S5 g
  5. #include <stm32f1xx.h>8 S7 |) D; [/ L! v' G
  6. typedef  uint8_t u8;% ]9 L6 ]  J4 D( N8 `
  7. typedef  uint16_t u16;
    % v  w1 ]  ]* V' R3 @
  8. typedef  uint32_t u32;
    * i2 U# d4 f4 r$ K$ |+ F8 J& J5 Q% N
  9. #define SI7020_ADDRESS 0X80 //SI7020器件地址5 @2 x, Y; x. I* |% a3 U- f
  10. #define SI7020_READ 0X01        //读数据
    9 L' h) O- P0 M

  11. ( O: ^9 E) g+ g# k* K1 z% C
  12. #define SI7020_TEMPERATURE      0xE3
    8 c; Q/ M6 y1 C" V4 {. p
  13. #define SI7020_HUMIDITY         0xE5. c  |# k7 y/ e* Z" y6 p
  14. #define SI7020_SOFT_RESET       0xFE
    - l  x2 ~8 p$ X: G

  15. , e7 v' S) N5 l' ?" ?8 M5 X. L3 W, ]
  16. void SI7020_Init(void); //初始化IIC
    ( ~& K! a/ j4 T# Y: A5 Z
  17. uint16_t SI7020_ReadOneByte(uint8_t ReadAddr);
    9 m; r( q! k8 `! ~. ?; O5 V3 Z& I
  18. int16_t SI7020_Read_Humidity(void);1 H1 q( C6 L2 g2 Y1 S5 T6 B' ^
  19. int16_t SI7020_Read_Temperture(void);
    ) x& t- o/ U# s  j5 c& t- Q& f. w( f
  20. ; {! x, G1 v- Z" N
  21. #endif
复制代码
si7020.c
" H# ~7 J+ ?1 u; \0 D9 _5 _
  1. #include "Hal_SI7020/si7020.h"
    ! y3 y: H8 i3 w
  2. #include "Hal_SI7020_IIC/si7020_iic.h"* |7 I$ T7 ]& \2 m
  3. //#include "delay.h" - u6 O1 Y% L/ V4 k
  4. //#include "delay.h"
    ' M" ^/ n  F3 }- u7 f: G
  5. #include "Hal_OLED/oled.h"
      h5 E5 A4 O& \$ l7 m7 o
  6. #include "delay/delay.h"5 j9 x- k0 |( w2 E% ~& Q$ L
  7. #include "common.h"
    * G4 J9 t8 t* t! P" [- k! _
  8. //SI7020串口初始化0 p7 z8 C" Q0 M9 i
  9. void SI7020_Init(void)
    8 m7 ^. G- ]1 F/ X8 a6 Y3 r
  10. {! F2 [% V. M! E; I- s
  11.         SI7020_IIC_Init();
    4 N1 M+ y8 U1 s4 \% N3 K8 T8 d
  12. }7 ?7 i& C4 E; T$ [. `
  13. //在SI7020指定地址读出一个数据: n% W9 I4 j+ J; x3 w1 ?
  14. //ReadAddr:读取温度或温度  + r: Q( u+ {' k+ a; ?
  15. //返回值  :读到的数据# c( S  N" E8 ?
  16. uint16_t SI7020_ReadOneByte(uint8_t ReadAddr)
    5 ]1 y5 }9 @+ A" s
  17. {                                  
    ' b& J" R6 a7 s% R% `8 i
  18.         uint8_t error=1;7 M% \* e  F: _% K/ ~
  19.         uint8_t temp[2];
    $ ~3 `7 E2 E% s9 [
  20.         uint16_t value=0;. {& H2 L2 I8 H9 c" [* Y
  21.         SI7020_IIC_Start();
    7 r; @: v, N. B5 q) w! Q
  22.         SI7020_IIC_Send_Byte(SI7020_ADDRESS);4 C) y3 w0 j% {. Y5 e
  23.         SI7020_IIC_Wait_Ack();" R) a/ z/ ~  D' b9 }8 ~5 I( X4 ^: h
  24.         SI7020_IIC_Send_Byte(ReadAddr);& h: h( g# c" f( Z$ M9 j4 N) @
  25.         SI7020_IIC_Wait_Ack();# R: ]5 P1 I! N/ |$ Q  `
  26.         SI7020_IIC_Start();- K  o% L8 ^. v# V* P$ Z( ?8 y7 q
  27.         SI7020_IIC_Send_Byte(SI7020_ADDRESS|SI7020_READ);3 ?; h/ E5 w8 ^) a
  28.         SI7020_IIC_Wait_Ack();* B% T# W4 ~6 d4 N- ?3 C! Y9 h
  29.         delay_ms(20);                                                //延时一段时间,不可少。
    6 U1 T( W1 |8 D5 N" b4 [& E# z, j
  30. //        SI7020_IIC_Start();                                        //若使用No Hold Master Mode模式请使用此3行程序
    ( X6 [, [0 ?5 `5 G- [; n( m" N
  31. //        SI7020_IIC_Send_Byte(SI7020_ADDRESS|SI7020_READ);
    & ]5 P2 u) F. q7 g
  32. //        SI7020_IIC_Wait_Ack();6 y  M7 z4 }- r* l
  33.         temp[1]=SI7020_IIC_Read_Byte(1);$ q  E2 _" r. X
  34.         temp[0]=SI7020_IIC_Read_Byte(0);1 f' L: E" t4 S) s  ~
  35.         SI7020_IIC_Stop();//产生一个停止条件
    ' L+ f9 ^2 b/ w. d6 i& j9 Z
  36.         value=temp[0]|(temp[1]<<8);
    9 V, ~1 E# _; t" N" r1 [4 K
  37.         return value;# U( V3 W: ?1 z) e
  38. }
    9 d- G( C+ m1 Y, L: I/ [1 O# F
  39. //读取湿度" v7 q* x; u( _+ U( X
  40. //返回值为湿度: F) z5 [0 J! ~$ [$ D1 Q1 p" {
  41. int16_t SI7020_Read_Humidity(void)
    . f5 D0 K( Y& D8 J
  42. {       
    6 \: c* M8 |! d+ E* \/ h
  43.         uint16_t value=0;
    2 [6 ]4 a1 C4 e) ]6 t7 O
  44.         double temp;9 \5 \0 o- U) Q& ~9 T
  45.         value=SI7020_ReadOneByte(SI7020_HUMIDITY);
    % y5 f& t5 W7 v! H' x" d+ g- t) x
  46.         temp=(double)value;
    ( R: ], M/ f. M0 s
  47.         temp=(temp/65536.0f)*125.0f-6.0f;
    4 M! i1 r1 `1 k! Q# ?2 z7 L8 a
  48.         GIZWITS_LOG("Humidity = %.2lf \n", temp);//机智云的串口打印, B4 c; b1 f1 ?- W
  49.         return (int16_t)(temp*10);                                //返回湿度值,此处放大了10倍
    * Z) |+ H3 |7 N% @$ x
  50. }
    1 q8 ?% F" o! d$ T
  51. //读取湿度
    % V( G+ q# c3 }; f" P9 \6 W1 A, U
  52. //返回值为湿度
    $ g9 n4 A7 k/ h) v) E
  53. int16_t SI7020_Read_Temperture(void)
      |7 V$ v* F' i7 o
  54. {. ?5 _( x- P! |: s0 V6 S  z
  55. , z6 R5 a: f# A0 h$ j& q4 \$ G
  56.         uint16_t value=0;
    5 r2 ]5 M8 r: ]% l+ m0 K
  57.         double temp;$ E1 y" ?8 z2 y' x' ~; T* W
  58.         value=SI7020_ReadOneByte(SI7020_TEMPERATURE);% V9 X7 l8 a" w/ O7 d& v3 g) }
  59.         temp=(double)value;" Q( _" w8 _8 M' i
  60.         temp=(temp/65536.0f) * 175.72f - 46.85f;5 M) v5 B5 e" P" C, U: b
  61.         GIZWITS_LOG("Temperature = %.2lf \n", temp);//机智云的串口打印* h5 [! r6 H' t  ]; C) w
  62.         return (int16_t)(temp*10);                                        //返回温度值,此处放大了10倍% U( d6 I! h3 Q" w* o3 o4 N
  63.         3 O2 C0 k& F3 W! a9 h8 I4 ]
  64. }2 i# H- b2 D5 b! T
  65. , O, {2 q( V+ y1 _4 v& x- W
  66. ' |: r' h8 ^; m  N# X& c

  67. , ~! m$ b. F( |4 }) N4 r5 ]
  68. . I  y$ W$ ?  z3 c4 y

  69. , B8 S9 ^6 H! j4 z3 ^! v' s
  70. - ^, ^; n2 ]& W1 z) ?' \. }% [: p

  71. 0 L# U4 {* J4 w8 c' P
  72. . ~% {9 i& m, M+ C( G5 j+ [
  73. ' E$ M8 |! B$ B" n# r$ K

  74. - v) C- Z4 Z" n2 _5 @5 x+ K

  75. : Y. ^' _- ^. |! ]3 Q& j' H

  76. 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)

评分

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

查看全部评分

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

举报

0个回答

所属标签

相似分享

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