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

stm32mp1 Cortex M4开发篇9:扩展板空气温湿度传感器控制

[复制链接]
STMCU小助手 发布时间:2022-10-1 21:43
1.资源扩展板介绍
( \+ ?: g9 G6 T' l1 Y& H; L' N, G0 N+ E
1.1硬件介绍
) Y2 J5 X! C3 l
, ~4 k) p" Z- W8 c$ M, ^5 i9 f# k
2a60597904b14da696b646f8afbdf7d2.png + [) S4 u7 Y% `: Y/ w

0 B7 |2 R6 M  a* {$ c
8 K4 S) m0 |* Q1.2资源扩展板可开发项目
% J0 S' x$ Z5 r0 F
7 l. j# v, C' `
b92e4e61eb734b448ea07a13872f58cf.png
& n! q" z" n) C8 @3 L7 V
0 g: g, s4 v) R# \& S0 B+ ~  I( A- @. K& p
2.扩展板空气温湿度传感器控制
. N* k$ P2 y/ A' s) j2.1实验原理
- E/ Z7 [/ G6 p2 i. l$ b3 b
打开扩展板原理图对照扩展板可以看到扩展板有1个温湿度传感器SI7006,如下图:3 L$ V4 }0 M; V) R+ V7 J& y+ E
. O1 W$ G/ |+ R- U( L6 |
4ccc6112e4c2e07e938fde33aac18dd6.png , u) ~) J5 ^8 ^: `5 }) i
1 m3 p4 Q0 o% p4 H
由上图可见可通过I2C总线与SI7006通信。8 p% v7 B7 k. e9 E' K' S& u

  ?3 U$ f! m- v1 P* ] 264af50930a92abad763ac45aca441d5.png " |: \* U' e" ^4 f5 ], ^+ W

+ v7 e8 l, v7 s4 B. o. R/ K扩展板与底板接口对照图# x3 k4 r% ~0 e! j

, C$ w! K* u% w! M' E查看原理图可知数据线I2C1_SDA、I2C1_SCL和I2C_INT1管脚对应关系如下:
* o% x9 ?/ E. }# O# V, U
; O" M" Y" N0 v1 B1 i2 ] 9e4fe9773fb4ee1ff2fbe5ff66535018.jpg
1 R* P" B# g  |, n' v0 W6 R0 m, I: Z9 k) i  X8 s9 ^2 G
查看SI7006芯片手册确认设备七位从机地址为:0x40
" w& S  c8 W- S! O
# M' o9 K6 W9 Y2 k, c' O' J+ _: z 15fbfb7c676755a5233c161e806243aa.png 0 X  s4 ~' y4 j" w. o
5 z* O3 T) x" X
2.2实验目的* F1 L  p# E) l" p9 z3 f! W6 H: k
了解温湿度传感器工作原理! s* d4 T% \: ~1 \- w

0 c( G# s9 Q& Z, Z学习I2C协议的使用方法,掌握如何利用STM32MP157A芯片控制SI7006温湿度传感器% z: T" J$ _  q  _8 o2 y
" e! c' H& w8 a) v. _/ A* ?. g
2.3实验环境
. r7 G" J/ ]) H0 I6 k! X% k7 w" r
FS-MP1A开发平台
  o8 z! ~# I& T: q& E& \
1 [3 N9 l* A2 @0 OST-Link仿真器% b( J) X% [# |1 D- }' \$ x
) m7 Q8 S& Q7 q" X- p! y5 i6 z: j
STM32CubeIDE开发软件
& X/ o3 A, D: @- ]; g( i" o
3 X6 s5 W! q0 o0 R* T; Q/ h% `PC机 XP、Window7/10 (32/64bit)& ~6 y: g- O( i. e

9 w" N! Y* p( _* \; T! d2.4实验步骤
4 x# W' y  L& I9 x7 k打开STM32CubeIDE,配置CubeMX。' b( ?9 `* s! ^  d2 f2 C6 P( }

% I) K& _3 V% w, O3 T0 ~首先根据前几章内容配置好系统时钟与串口打印,然后对PF14、PF15引脚分别配置成I2C1_SCL与I2C1_SDA,切换到I2C1标签,勾选给“M4”,选中“I2C”,如下图所示。9 `2 O$ s# B- n6 \

$ ~$ W2 m# i3 s" O+ t' ]5 u e4d72570df09cee397653b1b05237457.png ' P$ r# Q+ ~* [% I' ?' |
- U* Q# z) j, e
6578597c8e9d3d3fdfba94d1a5116814.png
! w  c5 [4 A$ i3 n4 j/ v0 ^. t" O. z" b
上述为新建工程配置过程,可参考12.3.2章节进行导入已有工程,工程存放路径【华清远见-FS-MP1A开发资料\02-程序源码\ARM体系结构与接口技术\Cortex-M4\8_EX_I2C_TEM】( R+ f: p+ x3 l* s2 u- q
3 L; ^  k; a! {6 E
代码实现
) J9 i$ J$ M5 @0 A/ X7 ]+ a+ ~2 U9 u6 p
由于使用的是硬件I2C,不需要自己写程序实现I2C时序,我们需要做的仅仅是调用HAL提供的硬件I2C操作函数。其中,调用“HAL_I2C_Master_Transmit”函数发送数据,调用“HAL_I2C_Master_Receive”函数接收数据,创建driver_si_7006.c文件实现传感器的控制。其代码如下
: _4 f# N! M* ^" i4 R8 y- X
3 ^: J3 |7 p2 g7 S! }
  1. uint8_t SI7006_Init(void)+ w2 L+ B* Q/ p, K2 Y! |8 Q

  2. 3 t* N, g9 r( |! m$ p
  3. {& e- S8 v6 i/ T

  4. 8 q& ~- S0 V3 p! \0 u
  5. HAL_I2C_Init(&hi2c1);3 i% P: t) b: e0 m* a, L

  6. 2 Y3 L* j. L. m5 m
  7. SI7006_WriteByte(SI7006CMD_RESET);
    + m8 s: ]1 M& q+ u# B; y

  8.   u6 \$ K8 N& T( }8 w. U% f
  9. HAL_Delay(50);
    $ ~1 C8 Y, s& d/ W9 u! z' y
  10. ' R" r4 P& J3 V
  11. return 0;
    ' m) [5 l7 |' ]- p% e

  12. 2 D7 ~4 ?6 C: e/ B2 g6 z
  13. }, T" `& |1 K4 [, s

  14. 7 t2 t) ]/ M+ I. u7 P+ P! `) y
  15. void SI7006_ReadDataTest(void)5 O( W& P8 n! Y" F/ v

  16. 0 h) q& j; i+ r; y; m
  17. {
    & [3 m2 v9 f- w$ o# ]

  18. % \5 T1 w0 y; S0 L7 C5 j& J- X
  19. uint16_t hum = 0, tem = 0,tem_1 = 0,tem_2 = 0;" R% O- v8 g1 m+ s7 B0 ?; r' w7 N$ l

  20. + g3 x3 X; \$ w8 h
  21. hum = SI7006_Read_Data(SI7006CMD_RH_HOLD);% k- H% |' g9 V, O0 [, C
  22. 5 {, r; X1 s3 C! ?& h- r! A
  23. tem = SI7006_Read_Data(SI7006CMD_TEMP_HOLD);3 m8 r+ t7 m  A2 c
  24. " b6 J/ R, h7 J$ q9 A& Z
  25. tem = ((17572*tem)/65536 - 4685);
    ' K7 s! o( y! B  O
  26. 5 f7 K4 F9 @3 f. H0 X% i  B# }2 E
  27. hum = (125*hum/65536 - 6);
    , p! t/ h, v& i1 `

  28. / s9 k. u! i2 N' R) i! T, o. u+ k5 p
  29. tem_1 = tem/100;6 [4 I6 t  H9 V6 h! Q
  30. ' H% `; P" [. m! L6 C. L7 `
  31. tem_2 = tem%100;5 o' }: b1 M$ O# R
  32. 8 r+ X, z6 ^& z) [( U& |
  33. printf("\r hum = %d%% \n", hum);
    9 Z$ u1 ]$ @, u/ A. z* V( {( p- m
  34. ! [! G9 J5 }- i5 q
  35. printf("\r tem = %d.%d\n", tem_1,tem_2);
    # K0 J5 J$ V+ F  t

  36. 8 ~5 `9 F0 f5 R. N+ E& f
  37. }8 C# c' [& C& s' I; @

  38. 7 o# @% b" A& k. a
  39. uint8_t SI7006_WriteByte(uint8_t reg)
    + A) w  B3 n# P1 L& k; D. ?

  40. 2 t+ n5 h$ f5 W4 _
  41. {
    % H" v4 V: V6 R" n; ?8 U' ~% V5 O$ ]
  42. ( ]: @, P& O; f) Q! ]+ f, E
  43. uint8_t write_data = reg;1 G  b7 a' }) J* k5 N/ @8 j9 l. ~
  44. - K4 ]5 B. w$ v7 |' [( V& i! V
  45. if(HAL_I2C_Master_Transmit(&hi2c1, SI7006_ADDR | SI7006_W , (uint8_t*)&write_data, 1, 300) != HAL_OK)5 ^5 m" c' t$ q# {6 y9 X

  46. 0 s5 N$ X! b; R
  47. {( w( ^' A" Q* D

  48. , m/ q% ], F8 o0 x4 o% v
  49. Error_Handler();
    0 h% T. e4 b9 `5 a: B6 E. i, `# Q
  50. ! y: q5 u' r6 n1 g2 D6 t% p" a
  51. }
    + `" N6 q$ r6 B; t4 Z

  52. 4 o4 a& ?" R% S4 d) C
  53. while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
    - r6 {+ f2 x' [8 {9 q' D' W
  54. / I* m3 ~0 {8 y8 W, \- Z$ P# R
  55. return 0;
    6 t  b) a+ g1 E3 l+ X9 h) F4 F' o
  56. ) f: t4 P# ?1 d& H5 [; G6 U. E- J9 N
  57. }
    3 t0 L7 ^. a/ t: R3 A- a

  58. 8 l1 [, q% f' T- |6 ]6 R2 O
  59. uint16_t SI7006_ReadWord(uint8_t reg)' f% v+ i6 m0 E7 x% L6 ]; U3 Q& O
  60. 7 r8 r, r% f3 G; W( l$ N
  61. {
    . t' V( c' l0 w$ o2 K$ j: T
  62. / m; a4 X4 D. Y! b5 l( \
  63. uint16_t read_data = 0;9 R% k3 i% g$ E* m2 W

  64. ) Q" A/ i; q& x" Y) p% \' G( v
  65. if(HAL_I2C_Master_Transmit(&hi2c1, SI7006_ADDR | SI7006_W , (uint8_t*)®, 1, 300) != HAL_OK) //发送命令
    8 _+ F$ j% n% E" o: S8 i. }- d- f2 G
  66. 0 ^* O; u+ J9 T( d. b. A  ?
  67. {! _6 ~) _( E9 p

  68. - C- `/ B* l4 ]  P
  69. Error_Handler();
    ( g3 b+ g$ x' O7 x2 r: R; w

  70. % o9 M5 K& P. q  j+ T5 e8 k
  71. }% G* n4 e* r) ?% Q

  72. , m: T+ i5 \5 b$ T% |9 H* [2 _; E
  73. while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
    3 M; M% }  E! _$ P
  74. 7 W" f$ G: |! r, U" T) P
  75. if(HAL_I2C_Master_Receive(&hi2c1, SI7006_ADDR | SI7006_R , (uint8_t*)&read_data, 2, 300) != HAL_OK) //接收word数据# L" j- `# P# U+ L7 c
  76. 8 m7 f2 w6 J+ f! e$ Q9 m) ]% |
  77. {
    " k- b6 z, x& V

  78. 9 d4 ^6 G8 z/ v% m8 ?+ A# M7 z
  79. Error_Handler();- k# P: {! Y& s0 b
  80. # k- @# i: L$ ?% q' X( G
  81. }
    / z( d# I0 ]* q/ R. h: _

  82. 3 o$ }* r. H$ W
  83. return read_data;# q  Z" @! X  f& n
  84. % n: b4 g. i+ A; ~6 _
  85. }& V# J6 r# R- g" C  d) M# q( e

  86. 0 l4 `- Z+ H$ f5 B* G) u3 w5 ?
  87. uint16_t SI7006_Read_Data(uint16_t cmd)* T" b5 K# Y2 m) n

  88. 5 l0 Y) p7 B2 w! s( M
  89. {
    9 l9 h  E( ~& j7 p) e

  90. : F! Q' @8 b  s3 A- Q' x+ c
  91. uint16_t data = 0,data_low = 0,data_high = 0;8 \3 g0 n: h$ C( p1 h6 V* N2 U: H

  92. 7 K! T, q& U* Y2 X1 j, t
  93. data = SI7006_ReadWord(cmd); //采集温湿度
    $ u5 k+ |+ N9 D, K

  94.   w( t# o7 n# D/ m- {) m0 i1 t2 ]
  95. data_low = (data & 0xff); //进行高低字节转换
    " E( D, R( u. ~& Q

  96.   s* [+ U8 Z" U, Z1 J6 ?
  97. data_high = (data >> 8) & 0xff;
    0 t6 f! B/ I( `# M2 c

  98. + C% H" J- C7 t7 y+ d
  99. data = (data_low << 8) + data_high;
    & `8 a& A$ G' b
  100. / w" ~  I- x7 i/ {
  101. return data;
    % D$ P8 T# N, o$ J$ g2 G" C6 c
  102. 5 E2 W; E* R' G# ?
  103. }
复制代码

+ @" ^& }+ [9 u) e, o
5 L+ z  b3 b% ?7 `* d其中,使用“HAL_I2C_Master_Receive”接收16位数据时,由于先接收的高字节数据,然后是低字节数据,所以,在使用数据时需要进行高低字节调换。
2 d: a* U' X5 H6 G% s9 M  L( m9 k4 ~( c2 V0 n
在主函数里,先分别初始化I2C与SI7006,再调用“SI7006_ReadDataTest”函数即可以采集温湿度传感器数值。
9 N  y7 {# V( n: k4 F! x; ^6 v9 ?" A————————————————
7 y* z1 ?# j3 F& L版权声明:华清远见IT开放实验室5 P# T# N7 E2 W1 X( j: n

4 h' o3 o) e9 A& x3 s9 A8 o6 c+ ~/ [
赞 收藏 评论0 发布时间:2022-10-1 21:43

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版