IIC(Inter-Integrated Circuit)是一种常见的串行通信协议,广泛应用于各种嵌入式系统中,包括STM32单片机。在STM32中,IIC通信可以通过硬件IIC和软件IIC两种方式实现。本文将介绍IIC的基本原理,然后重点探讨STM32中硬件IIC和软件IIC的区别。; h; P( c9 l- T8 o3 d; q' w
/ _: H" i, D5 x; S
5 W7 `0 s- C+ ?6 t# \1 b
/ ~; T% C# E4 j' _) F/ {/ e& nIIC基本原理:IIC是由飞利浦(Philips)公司提出的一种串行通信协议,适用于在同一电缆上连接多个设备。它采用两根线进行通信,即SDA(数据线)和SCL(时钟线)。设备之间通过这两根线实现数据传输,其中SDA用于传输数据,SCL用于同步时钟。
: d; f: _( a, V8 h: a) T8 D+ N5 x% y! ?
2 d; Q' j: ~" J+ k$ l
7 w$ L8 k+ D/ i& G1 E# _" U5 x4 ^0 `, \一对IIC总线上面可以挂载多个设备并且多个设备之间有不同的地址,所以我们可以根据不同设备的地址来实现不同设备之间的通信。
5 ^( t. A) C9 D$ p! r. r/ `2 j6 g) t
软件IIC" L! f5 l+ E/ s& M; `5 n
在STM32中,软件IIC是一种通过程序控制GPIO口模拟实现IIC通信的方法。这种实现方式常用于一些资源有限的应用场景,或者在需要更灵活控制IIC通信时使用。( g' [/ m: O2 Y/ F: f& t6 u
' b7 j0 m7 @) b; @' F; d8 C( w
- E, l( h2 I. h% S! B( g
1 J9 B2 v9 h& h5 D2 y总而言之,软件IIC是利用GPIO的翻转,一个IO模拟SCL线,一个IO模拟SDA线实现IIC通信协议的实现。# S1 }. [: ^0 k
; ~* ~+ i5 S# a8 o* p0 d) L, b2 z软件IIC不需要对IO有特殊的要求,只需要两个普通的GPIO即可实现,因此较为方便也方便移植,不同设备只需要重写IIC的基本通讯即可。
7 `- n4 X1 @7 D! R- // 定义IIC的GPIO口和引脚
0 v) B: w3 k* m8 J1 R. b - #define IIC_SCL_PIN GPIO_PIN_61 H# L! S6 p O. y0 u
- #define IIC_SCL_PORT GPIOB2 e$ c% J$ j; Y1 a1 @7 x% M0 Q
8 M+ o+ U# v" I9 {4 f5 m- H- + F4 a# L, h2 i+ o$ @6 E9 c
- #define IIC_SDA_PIN GPIO_PIN_9
M7 _' ]% |: u' e- W4 a - #define IIC_SDA_PORT GPIOB
% P$ c& b/ m$ a2 T2 v: [
: e4 f; r$ P( `. O2 {& U3 Z9 T3 e- K- : V) r6 z1 V- n' i4 g |% k
- // 定义读写控制位
" E9 M$ y& m9 j7 x3 a - #define IIC_READ 1
9 d8 _5 M& t$ R* y% O% H* M - #define IIC_WRITE 0
2 ]/ `3 I2 d9 G) ]' C
, T7 Y s1 B8 J0 u5 l. Z
% `! u3 k( [$ C% k/ L- // 定义函数$ L- e* @) B2 S
- void IIC_Start(void);8 ]% A- x5 X! } E
- void IIC_Stop(void);, C+ w, p: z/ q9 _4 \' t
- void IIC_SendByte(uint8_t byte);
/ ?8 D& w1 Y4 w( K - uint8_t IIC_ReadByte(uint8_t ack);
; C1 N4 c" O4 T+ _+ Z9 \. M7 f" H+ } - : ]" w* e- ?8 ^& M
- / b6 d' M3 ^% A6 L B; B
- " A' z+ Q0 v/ u
- + H. n. ^( r7 o1 K8 u' K
- // 启动IIC总线
! B# {& F/ w* K. n - void IIC_Start(void)$ V" |2 H: Z. y3 U+ z; z9 `$ L: J
- {0 c! E0 } c( T9 \) F
- HAL_GPIO_WritePin(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_PIN_SET);
8 F4 z1 o' Z: ~# W - HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_SET);) I% ~& z, f+ B. [$ \ e# W
- HAL_Delay(2); // 稍微延时,确保时序正确& G; S4 n( {0 L. g0 j3 g$ O
- HAL_GPIO_WritePin(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_PIN_RESET);
# r4 \- Q: ?% E) g - HAL_Delay(2);
3 X8 o! |. a3 b9 a1 t4 a - HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_RESET);
7 |! D# D8 B8 U; I2 `& `4 [ - }+ L7 s5 D8 R- X& i, k
$ [: ?( I6 g) x* t% x; L' {- y; G$ `* s. `: [1 t6 n5 i7 i7 X
- // 结束IIC总线
$ m5 P4 }( G& S& w# Z# l - void IIC_Stop(void)
p) S/ D, m- y5 p g+ S( z/ p0 Q - { r; K! o* V5 n, K0 ~8 \
- HAL_GPIO_WritePin(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_PIN_RESET);
: A5 N* K- m5 J) T3 l# U - HAL_Delay(2);6 Y( W5 ]4 r8 U' u0 Y% [
- HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_SET);
8 O* P" t+ O e! f# r1 Z+ r! J4 Q" S - HAL_Delay(2);8 _0 E- s# Z+ A
- HAL_GPIO_WritePin(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_PIN_SET);
, s7 W! \% G. ~0 i" z - HAL_Delay(2);
! @( B7 I3 {, ~' X& M2 Z- c - }
3 @' R+ K2 [2 R& V2 O' d
. Q" v. R# ~% U( o
( K4 E& T7 X0 ], \. G- // 发送一个字节
& D& P/ y5 d4 e7 M+ \: c8 z4 ]$ S - void IIC_SendByte(uint8_t byte)$ }& N/ @6 n1 ^3 a$ G: H. T
- {
( J7 Y) J4 X) }1 A1 q6 v2 { - for (int8_t i = 7; i >= 0; i--); k! u+ L& |. y2 Y7 ^ L
- {
* u: O% O& N. p m9 G7 L3 e: Q, h2 X - HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_RESET);
# f9 s& w W; A1 E1 U$ G - HAL_GPIO_WritePin(IIC_SDA_PORT, IIC_SDA_PIN, (byte & (1 << i)) ? GPIO_PIN_SET : GPIO_PIN_RESET);. i, M+ S- k" J& s2 j4 n5 R
- HAL_Delay(1); // 稍微延时,确保时序正确
# |5 J6 O4 E/ q3 O" H - HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_SET);
5 H1 E. Y" ]& B) ^5 _ }" T - HAL_Delay(1);
' ?2 D! k4 e% y1 Z- S; b - }
3 Z" m$ _1 w1 c$ \ - HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_RESET);
3 R+ l/ g/ g! p$ L9 { - }
8 B) r8 b. S. t* E" \/ v; z! k - 5 [& d8 O: o, l; @+ J1 U! v- f
- ^- q! F t& n% D: \# a
- // 读取一个字节4 Z# K* a8 q5 n6 w. ]
- uint8_t IIC_ReadByte(uint8_t ack) O& f3 s f C1 j( w. M
- {
& F- n0 W- X D. P. y7 A) W - uint8_t byte = 0;9 g% x* W$ C4 T) @
-
* L3 X, i+ b1 v5 M5 t4 i" S - HAL_GPIO_WritePin(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_PIN_SET);
+ b3 \% h1 G3 ^$ v& U6 i; t - for (int8_t i = 7; i >= 0; i--) Z S( F6 P2 ^& I$ s0 }, z( c
- {
1 x# A; I+ V4 i( l! U0 p - HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_RESET);
( Q' X& n) c- Y; y" k& k& f3 k; l" Y - HAL_Delay(1); // 稍微延时,确保时序正确
* g5 u9 G% o( N7 I - HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_SET);
2 n+ y& P" i/ }% z - HAL_Delay(1);
& s2 Y. B- Y v1 q - byte |= (HAL_GPIO_ReadPin(IIC_SDA_PORT, IIC_SDA_PIN) << i);
& C, s0 A% y( r% u3 j4 a1 o" a6 H - }5 d [* M# |3 c, b6 j$ K) w
- 5 y5 Q' L. z% |8 N1 q) a5 I8 I7 f: U
- if (ack)# V! u4 f( }9 c. s3 N! [
- HAL_GPIO_WritePin(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_PIN_RESET); // 发送应答2 ?' ~& p8 K! c0 {' O* W# T. n
- else& K& P5 ^$ y; a( a; _3 b
- HAL_GPIO_WritePin(IIC_SDA_PORT, IIC_SDA_PIN, GPIO_PIN_SET); // 不发送应答( C- Z+ B3 t4 Y. J( M
- 2 }5 Y( m6 T0 s: {
- HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_RESET);
9 T; }0 X1 k4 J" u - HAL_Delay(1); // 稍微延时,确保时序正确/ V6 p7 Y2 A- S+ @
- HAL_GPIO_WritePin(IIC_SCL_PORT, IIC_SCL_PIN, GPIO_PIN_SET);
+ q7 ~- {6 x) A/ i7 L - HAL_Delay(1);4 m, V. v9 t9 [5 E& r9 L
- 7 S" D9 O- |! m0 U& @
- return byte;
$ Z- C5 s3 L U( T+ {* g- b - }
复制代码
$ Q$ @0 i+ @) L/ n/ D5 p例如IIC的启动信号为:SCL为高电平的时候,SDA从高电平转为低电平。
9 D0 H! A; H& r8 R2 L. S' L! A: E2 ~4 ~3 x! F3 }
IIC的结束信号为:在SCL线是高电平时,SDA线从低到高的跳变。
1 v# G, g% u+ e) @# ]3 T: n6 {' v
" l; e9 V, f, u8 ~1 v0 m因此使用这种方法可以模拟IIC时序完成通讯。
) Y6 O: c' F* }7 S" F1 F' h( T: A& C; K! H& F
但是这种方法的弊端也是非常明显的,需要占用CPU,其次这样子并不能确保I2C时序的正确性。所以无论是稳定性还是可移植性还是IIC的效率都欠妥。
) y+ i n* C y! @: ?4 I9 V9 C! B& V" z2 k! _: U8 @
STM32中的硬件IIC
2 {. F: w5 C6 u8 X+ C7 n% s' \STM32系列单片机提供了硬件IIC(Inter-Integrated Circuit)模块,用于支持IIC通信协议。硬件IIC通过专门的硬件模块实现了IIC协议的基本功能,包括起始信号、停止信号、时钟同步等,无需用户通过软件模拟实现。/ G$ F( } O1 F0 d5 c: t- t
8 B' a, H8 m/ U; E0 w
STM32硬件IIC优势:# c9 y) @! D1 z% ]8 N! j
1.高效性: 硬件IIC使用专用硬件模块处理通信,不需要CPU直接参与,提高了通信效率,降低了对CPU的负担。 ~# I" @, q- g5 a- C$ o6 r
2.时序精确控制: 硬件IIC模块能够精确控制时序,确保通信的稳定性,避免了由于软件执行时间不确定性而引起的时序问题。
% y C4 p; h X' i3.多主机模式支持: 硬件IIC模块通常支持多主机模式,能够轻松处理多个设备同时访问总线的情况。
# Y$ L# P: W8 S2 p4.易用性: 由于硬件IIC是芯片内置模块,使用起来相对简单,只需配置相应的寄存器和引脚即可。7 d8 b2 j F6 M3 ]& F' P; d
5.占用资源少: 硬件IIC模块通常占用较少的资源,对于资源有限的嵌入式系统来说,是一种较为理想的选择。
$ k L- B- r5 W
5 ?9 ?! e2 v, u: N. d
% A; W/ J! P$ n" i# m' O7 |
3 `% {, v% |$ i
在CubeMX中配置好硬件IIC即可利用HAL库函数进行IIC通讯。- static void MX_I2C1_Init(void) F( w! N/ w: P% j7 S% b1 a
- {
% y6 z5 H7 D% g4 R7 F - hi2c1.Instance = I2C1;
9 M* W1 y' ^' O- e" d9 j' c( e) B - hi2c1.Init.ClockSpeed = 100000;
6 g6 g. F3 t: C! [6 c. x! r" @/ G( w - hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;6 M9 o' b$ `: f* M
- hi2c1.Init.OwnAddress1 = 0;( j1 ^0 ~) \ D* S$ z: c
- hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
/ O3 J/ u6 z k2 j- V - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;% r3 p3 [5 w; _ K3 }
- hi2c1.Init.OwnAddress2 = 0;
" o# ^" J: S) _5 F3 w1 s' N0 R - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;$ \1 _( T- P* V( Y! ?
- hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;0 G0 H8 d/ L, K$ p# P
- HAL_I2C_Init(&hi2c1);% @- i( I% V) {' M" r. U3 t
- }& _. L8 h# l& }
$ n; ~2 f* ]6 K8 M. A8 \, o3 M6 M4 Q- + t1 F7 J1 e. _- u2 G: I
- uint8_t deviceAddress = 0x50;//设备地址) j6 T- g4 c3 A/ t; b& {1 [1 [' h& d
- uint8_t registerAddress = 0x00;//寄存器地址# U( y# u. @ T
- HAL_I2C_Master_Transmit(&hi2c1, deviceAddress, ®isterAddress, 1, HAL_MAX_DELAY);
复制代码
+ x; z# _( D) ]* a. e% e' c: M2 n, v调用CubeMX的初始化函数,之后就可以使用例如HAL_I2C_Master_Transmit,HAL_I2C_Master_Receive等函数来实现IIC通讯。2 n/ o: ^0 Y# R, _/ i' d
$ c6 g- x0 q" G
9 X& E9 T t+ F
STM32硬件IIC缺点:( S, u+ b8 f! P: B" n" r
1.资源占用: 相比软件IIC,硬件IIC模块可能会占用一定的硬件资源,因此在资源受限的系统中需要谨慎选择。8 n; q0 E+ i x. S, E, M
2.灵活性: 硬件IIC通常由芯片内部硬件模块实现,因此在一些特殊场景下可能缺乏一些灵活性,例如无法更改时序。1 q% d2 v9 U+ V) p$ t$ o1 `0 G
3.部分限制: 不同型号的STM32芯片的硬件IIC模块可能存在一些差异,不同芯片的IO不一样,所以设计时需要谨慎检查。1 i: O0 V3 s" U8 Q% h
% Z/ q: |2 f' |" @5 r
总体而言,STM32的硬件IIC是一种高效、稳定的IIC通信方式,特别适用于对性能要求较高的应用场景,同时在易用性和可靠性上有较大优势。在选择IIC通信方式时,可以根据具体需求权衡硬件IIC和软件IIC的优缺点。, E* {; w- c4 z$ j( [8 ~: ^1 G. u/ N
1 T4 q( s, k8 I7 P. F( ?8 H$ \" L$ }; L E$ W b: j
! p: D5 p! Q4 D* o) z+ q% }. g- ^
转载自:电路小白
, |2 j, n* b5 w如有侵权请联系删除
3 j! R* c6 _/ F v& S& ]1 O: C9 E( }5 x! u/ E" q
|