流程图如下:
$ U$ ^ \2 B2 u( j* j
|
; v- e* Z# q7 q0 T) w' Y | RE:STM32 I2C 硬件中断方式实现方法,带流程图 
# P5 n: q9 C3 Y l% j v7 l# N" U# w: V
I2C 中断处理函数如下:4 r( K1 T2 x4 N+ ^! C
- <table class="t_table"><tbody><tr><td><div align="center"><table class="t_table"><tbody><tr><td>/**' R8 y' o' R: ~% f( \9 A: j" f6 A
- * @brief This function handles I2C1 Event interrupt request, tx, rx
- ~1 a: ^% X& g3 I7 F2 G5 w - * buffer and number of bytes will be changed.' b- n( `& P" W5 ~
- * @param None+ [5 w' H8 R, W6 e2 {* S
- * @retval None
6 j/ \4 C/ A& _) y* V/ v: {- J - */
' K; v' V. y* h5 S - void I2C1_EV_IRQHandler(void); k- ]5 a0 i3 m+ s9 |
- {0 `! [3 X' h5 n; }0 T- J5 d; R
- #ifdef ARC_I2C_IRQ
, ^9 L$ l4 _8 m' J; S - uint32_t i2cEvent;
$ O$ ^$ z% K6 N: o/ o" T - I2C_param_struct __IO *pI2C_param;3 |( x$ ]: z; N0 L
- " f8 x5 `3 f0 _2 F6 Z5 l
- pI2C_param = ARC_get_I2C_param();7 Y v: m0 Y5 m5 h8 Z- M
- i2cEvent = I2C_GetLastEvent(I2C1);
2 l& \' Q, S. u- I -
|$ `, g8 G' C - switch (i2cEvent)( K7 E7 b' K# T' N! U" K0 g
- {+ z4 D4 \% z& I. z
- case I2C_EVENT_MASTER_MODE_SELECT:/* EV5 */. g7 f4 R% O+ p4 F8 v
- if(pI2C_param->I2C_DIRECTION == ARC_I2C_DIRECTION_TX)$ N# a5 Q" R0 G& p
- {
* {# \* |- P2 S* m. y4 n' ^2 ^ - I2C_Send7bitAddress(I2C1, pI2C_param->DeviceAddr, I2C_Direction_Transmitter);& K7 t0 q- b0 v2 q+ v$ V! _4 T5 e; Z, M1 x
- }0 r5 l8 v) _: y. w8 v n, y* I
- else8 y" `5 b% t: \5 U
- {
# P, e U1 j* A - I2C_Send7bitAddress(I2C1, pI2C_param->DeviceAddr, I2C_Direction_Receiver);7 A; A: t( E& V/ Z
- }
( x4 O9 o! Y% |" V# m, `1 { - break;
* h" s( F3 I# S. H$ f - . H7 `0 }) ^+ g+ f+ W
- /* Master Transmitter -------------------------------------------------------*/; v9 ]8 o4 j- S' Y" t" O! K" M
- case I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED:: O. a8 a* _: s L1 a
- I2C_SendData(I2C1, pI2C_param->SubAddr);) H& S$ ^/ @( Y. U l, f; d8 F* h$ O
- if(pI2C_param->TxNumOfBytes == 0)- x8 X8 b, C5 ^9 l* R9 _
- I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE);
+ C. t' Q/ E) c$ `* w2 Z) k - break;: q7 a$ u6 X A9 x8 r1 i( I. K
-
; M% F# J6 `, g - case I2C_EVENT_MASTER_BYTE_TRANSMITTING: /* Without BTF, EV8 */ 5 R& Y7 U. |( \# g+ M
- if(pI2C_param->TX_I2C_Index < pI2C_param->TxNumOfBytes)
/ ~5 a- R8 r9 n% l9 ~3 R! V - {+ c# Y7 g! [% R- `, d, [6 B
- I2C_SendData(I2C1, pI2C_param->TxData[pI2C_param->TX_I2C_Index++]);
5 w9 u7 q/ E& V ~7 l8 U. R - }
* f, o% U5 R7 }0 j6 W6 E7 V - else
' Y0 _3 ] n+ r7 d7 ]6 B - { 2 i, q. S8 k6 y+ A5 J+ Q
- I2C_ITConfig(I2C1, I2C_IT_BUF, DISABLE);
" F/ ~/ r( s" E- Q4 P - }
$ a( n' X6 f i9 k9 W1 [ - break;% j! a- |( m9 g- t( e
! {/ _1 d; Q: u& ~( {- case I2C_EVENT_MASTER_BYTE_TRANSMITTED: /* With BTF EV8-2 */2 ?% r9 I. c' J3 Z8 o- k8 J
- if(pI2C_param->TX_Generate_stop == 1)$ S, w* i3 }: h, z V. k5 M
- {
2 j7 P3 Y. u6 |6 h% G) q - I2C_GenerateSTOP(I2C1, ENABLE);
, E9 }! `2 G2 @5 ] - I2C_ITConfig(I2C1, I2C_IT_EVT, DISABLE);& [3 R) E# b3 i* Y% k" C/ e0 R
- }
& X# H% K- m/ x2 x( l - else" v1 n8 w6 u/ v% z* W9 w. h2 ~
- {
, D1 c9 ] ]- C5 {4 t9 _3 P& g - pI2C_param->I2C_DIRECTION = ARC_I2C_DIRECTION_RX;
7 _2 h" e% |: r, R* M: p - I2C_ITConfig(I2C1, I2C_IT_BUF, ENABLE);
2 L: M7 H: g3 L& F$ G& L - I2C_GenerateSTART(I2C1, ENABLE);
0 @1 B/ p4 m% L1 s f' Q - }3 r6 U& V7 m* W0 [
- break;9 N. P. l! m. b' M
- - U1 @& Y4 i# c R" s; {9 F
- /* Master Receiver -------------------------------------------------------*/
3 r0 k) H3 m# g8 U - case I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED:2 g& ]9 E9 z6 ]
- if(pI2C_param->RX_I2C_Index == (pI2C_param->RxNumOfBytes - 1))
' |/ A, h$ }/ {7 n* n - {
$ B" N5 W% G9 D, D# E0 w8 h' N - I2C_AcknowledgeConfig(I2C1, DISABLE);
0 L% o# e. C) K - I2C_GenerateSTOP(I2C1, ENABLE);: T$ g# d7 w) P' Y, j
- }
% P, r1 V4 G' G - break;
4 V+ v% g3 ~ t- x' W% x - 7 r. D& Z, v# F- h$ c* c
- case I2C_EVENT_MASTER_BYTE_RECEIVED:
, o! `6 z8 `, M Q. M - pI2C_param->RxData[pI2C_param->RX_I2C_Index++] = I2C_ReceiveData (I2C1);3 S9 y. F4 Q- e; Z
- if(pI2C_param->RX_I2C_Index == (pI2C_param->RxNumOfBytes - 1))
" J4 `3 S0 s7 Y# l; a - {
8 K9 g: d: x- x - I2C_AcknowledgeConfig(I2C1, DISABLE);
: T) w2 Z- `7 }) O: X - I2C_GenerateSTOP(I2C1, ENABLE);; W% {) ^* e& ~7 r
- }
: a8 S1 F5 k% h! b! d - break;4 V+ j5 N2 `, R. v
- ( f ]3 o$ c9 h1 P! P7 m
- default:: x# w* y1 o# O) w: v2 X) `; i
- break;
3 r5 Q/ `7 i# ?- ]- v2 K" R4 M - }' B) B6 Q% J8 U/ Q
- ! `1 t# t1 m* m6 H* M
- #endif
5 D T9 _/ l2 o! |1 ?: b - }</td></tr></tbody></table></div></td></tr></tbody></table>
复制代码
8 o) k. d6 _( e5 d9 { |
|
|