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
+ [) 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' `
& 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 |
, 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* ]
" |: \* 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 ]
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
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
' P$ r# Q+ ~* [% I' ?' |
- U* Q# z) j, e
! 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! }- uint8_t SI7006_Init(void)+ w2 L+ B* Q/ p, K2 Y! |8 Q
3 t* N, g9 r( |! m$ p- {& e- S8 v6 i/ T
8 q& ~- S0 V3 p! \0 u- HAL_I2C_Init(&hi2c1);3 i% P: t) b: e0 m* a, L
2 Y3 L* j. L. m5 m- SI7006_WriteByte(SI7006CMD_RESET);
+ m8 s: ]1 M& q+ u# B; y
u6 \$ K8 N& T( }8 w. U% f- HAL_Delay(50);
$ ~1 C8 Y, s& d/ W9 u! z' y - ' R" r4 P& J3 V
- return 0;
' m) [5 l7 |' ]- p% e
2 D7 ~4 ?6 C: e/ B2 g6 z- }, T" `& |1 K4 [, s
7 t2 t) ]/ M+ I. u7 P+ P! `) y- void SI7006_ReadDataTest(void)5 O( W& P8 n! Y" F/ v
0 h) q& j; i+ r; y; m- {
& [3 m2 v9 f- w$ o# ]
% \5 T1 w0 y; S0 L7 C5 j& J- X- uint16_t hum = 0, tem = 0,tem_1 = 0,tem_2 = 0;" R% O- v8 g1 m+ s7 B0 ?; r' w7 N$ l
+ g3 x3 X; \$ w8 h- hum = SI7006_Read_Data(SI7006CMD_RH_HOLD);% k- H% |' g9 V, O0 [, C
- 5 {, r; X1 s3 C! ?& h- r! A
- tem = SI7006_Read_Data(SI7006CMD_TEMP_HOLD);3 m8 r+ t7 m A2 c
- " b6 J/ R, h7 J$ q9 A& Z
- tem = ((17572*tem)/65536 - 4685);
' K7 s! o( y! B O - 5 f7 K4 F9 @3 f. H0 X% i B# }2 E
- hum = (125*hum/65536 - 6);
, p! t/ h, v& i1 `
/ s9 k. u! i2 N' R) i! T, o. u+ k5 p- tem_1 = tem/100;6 [4 I6 t H9 V6 h! Q
- ' H% `; P" [. m! L6 C. L7 `
- tem_2 = tem%100;5 o' }: b1 M$ O# R
- 8 r+ X, z6 ^& z) [( U& |
- printf("\r hum = %d%% \n", hum);
9 Z$ u1 ]$ @, u/ A. z* V( {( p- m - ! [! G9 J5 }- i5 q
- printf("\r tem = %d.%d\n", tem_1,tem_2);
# K0 J5 J$ V+ F t
8 ~5 `9 F0 f5 R. N+ E& f- }8 C# c' [& C& s' I; @
7 o# @% b" A& k. a- uint8_t SI7006_WriteByte(uint8_t reg)
+ A) w B3 n# P1 L& k; D. ?
2 t+ n5 h$ f5 W4 _- {
% H" v4 V: V6 R" n; ?8 U' ~% V5 O$ ] - ( ]: @, P& O; f) Q! ]+ f, E
- uint8_t write_data = reg;1 G b7 a' }) J* k5 N/ @8 j9 l. ~
- - K4 ]5 B. w$ v7 |' [( V& i! V
- 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
0 s5 N$ X! b; R- {( w( ^' A" Q* D
, m/ q% ], F8 o0 x4 o% v- Error_Handler();
0 h% T. e4 b9 `5 a: B6 E. i, `# Q - ! y: q5 u' r6 n1 g2 D6 t% p" a
- }
+ `" N6 q$ r6 B; t4 Z
4 o4 a& ?" R% S4 d) C- while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
- r6 {+ f2 x' [8 {9 q' D' W - / I* m3 ~0 {8 y8 W, \- Z$ P# R
- return 0;
6 t b) a+ g1 E3 l+ X9 h) F4 F' o - ) f: t4 P# ?1 d& H5 [; G6 U. E- J9 N
- }
3 t0 L7 ^. a/ t: R3 A- a
8 l1 [, q% f' T- |6 ]6 R2 O- uint16_t SI7006_ReadWord(uint8_t reg)' f% v+ i6 m0 E7 x% L6 ]; U3 Q& O
- 7 r8 r, r% f3 G; W( l$ N
- {
. t' V( c' l0 w$ o2 K$ j: T - / m; a4 X4 D. Y! b5 l( \
- uint16_t read_data = 0;9 R% k3 i% g$ E* m2 W
) Q" A/ i; q& x" Y) p% \' G( v- 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 - 0 ^* O; u+ J9 T( d. b. A ?
- {! _6 ~) _( E9 p
- C- `/ B* l4 ] P- Error_Handler();
( g3 b+ g$ x' O7 x2 r: R; w
% o9 M5 K& P. q j+ T5 e8 k- }% G* n4 e* r) ?% Q
, m: T+ i5 \5 b$ T% |9 H* [2 _; E- while (HAL_I2C_GetState(&hi2c1) != HAL_I2C_STATE_READY);
3 M; M% } E! _$ P - 7 W" f$ G: |! r, U" T) P
- 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
- 8 m7 f2 w6 J+ f! e$ Q9 m) ]% |
- {
" k- b6 z, x& V
9 d4 ^6 G8 z/ v% m8 ?+ A# M7 z- Error_Handler();- k# P: {! Y& s0 b
- # k- @# i: L$ ?% q' X( G
- }
/ z( d# I0 ]* q/ R. h: _
3 o$ }* r. H$ W- return read_data;# q Z" @! X f& n
- % n: b4 g. i+ A; ~6 _
- }& V# J6 r# R- g" C d) M# q( e
0 l4 `- Z+ H$ f5 B* G) u3 w5 ?- uint16_t SI7006_Read_Data(uint16_t cmd)* T" b5 K# Y2 m) n
5 l0 Y) p7 B2 w! s( M- {
9 l9 h E( ~& j7 p) e
: F! Q' @8 b s3 A- Q' x+ c- uint16_t data = 0,data_low = 0,data_high = 0;8 \3 g0 n: h$ C( p1 h6 V* N2 U: H
7 K! T, q& U* Y2 X1 j, t- data = SI7006_ReadWord(cmd); //采集温湿度
$ u5 k+ |+ N9 D, K
w( t# o7 n# D/ m- {) m0 i1 t2 ]- data_low = (data & 0xff); //进行高低字节转换
" E( D, R( u. ~& Q
s* [+ U8 Z" U, Z1 J6 ?- data_high = (data >> 8) & 0xff;
0 t6 f! B/ I( `# M2 c
+ C% H" J- C7 t7 y+ d- data = (data_low << 8) + data_high;
& `8 a& A$ G' b - / w" ~ I- x7 i/ {
- return data;
% D$ P8 T# N, o$ J$ g2 G" C6 c - 5 E2 W; E* R' G# ?
- }
复制代码
+ @" ^& }+ [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+ ~/ [ |