这个I2C库的资料也整理好了。有需要的看一看吧。这是用cube生成的文件整理的。Hal的库。3 q8 e/ j, i3 O9 l& u8 I
2 @2 V- ?. c) {1 }
- /*I2C配置结构定义*/3 O! p. H9 d. N R5 a
- typedef struct- w/ a* \. [# n
- {, P8 F* ?8 ?+ G, f
- uint32_t Timing; /*指定I2C_TIMINGR_register值。该参数通过参考I2C初始化计算得出*/
* Z; c. J5 Y6 }3 \4 M
$ {7 [3 y! f4 U* Q% @9 Q- uint32_t OwnAddress1; /*指定第一个设备自己的地址。此参数可以是7位或10位地址。*/
9 A+ v% {5 N4 q" O% h; R - 0 [4 K" y0 u$ m3 `! F
- uint32_t AddressingMode; /*指定是选择7位还是10位寻址模式。此参数可以是I2C_ADDRESSING_MODE*/的值
7 ^3 O# t9 }$ @" C& v8 G( t
+ l9 G3 |5 |) n& x- uint32_t DualAddressMode; /*指定是否选择双重寻址模式。此参数可以是I2C_DUAL_ADDRESSING_MODE*/2 k9 Q! @4 {( I" o# p
. r, w; c* K) F# b5 w- uint32_t OwnAddress2; /*如果选择双寻址模式,则指定第二个设备自己的地址此参数可以是7位地址。*/( h5 f2 ^" o8 S4 m, q" y; e5 d1 W
- 5 A6 a [$ |7 H6 m
- uint32_t OwnAddress2Masks;/*如果选择双重寻址模式,则指定确认掩码地址第二个设备自己的地址,此参数可以是I2C_OWN_ADDRESS2_MASKS的值*/' ]" x2 L5 a& k
+ x, _, D5 E& s- uint32_t GeneralCallMode; /*指定是否选择常规呼叫模式。此参数可以是I2C_GENERAL_CALL_ADDRESSING_MODE的值*/9 C4 o4 {# ]( h* ], [" g/ C$ P
1 ^0 U. t# G6 P8 I4 h# F- uint32_t NoStretchMode; /*指定是否选择nostretch模式。此参数可以是I2C_NOSTRETCH_MODE的值*/
9 c9 }* J2 o; g; y4 U; S1 ~/ v
" x/ S5 ^1 _* v$ G/ y4 {% C: F- }I2C_InitTypeDef;
4 p( z# t9 i+ h9 n5 |+ H/ | - * m' }9 c9 @2 h
# X* R. D* B# |- /*HAL状态结构定义% w2 M+ F7 g! h) i
- *HALI2C状态值编码遵循下面描述的位图:\n
- ?3 }$ o& p7 O( c4 ]. i - * b7-b6错误信息\n8 `) f' \( B6 \$ J
- * 00:无错误\n9 u# k, V2 k! z7 x# |6 q, r- S' p
- * 01:中止(正在进行中的用户请求中止)\n
9 @3 C# U, Y0 v3 C+ D7 C - * 10:超时\n
5 l; [: y; ]" q) R - * 11:错误\n R0 ^& W' g- D0 q3 V+ `
- * b5 外围设备初始化状态\n
- Z1 [) r2 S. I! H X6 O - * 0:重置(外围设备未初始化)\n
' W! {. L6 Q% w- f' j4 t - * 1:已完成初始化(已初始化外围设备并准备使用。已调用HALI2CInit函数)\n: k& q* Z f% z2 e, l" A! L& L: l
- * b4(未使用)\n
) k2 v+ Z6 j3 }$ b- D3 s - * x:应设置为0\n! ~4 F7 N' I$ W3 w' P, ^* F/ e+ [
- * b3\n
8 n7 A3 @& J! b! ~1 M6 O# l - * 0:就绪或忙碌(无监听模式正在进行中)\n
3 y( E4 R5 |4 ]* u! r0 V9 p" c - * 1:监听(地址监听模式中的外围设备)\n
% Q8 X0 k5 ]7 _. h; ]1 z$ Y - * b2内部过程状态\n( K9 [- E5 R- ]! Y0 m7 b9 ~
- * 0:就绪\n
3 w8 a9 ?/ s& [% x% h% I - * 1:忙(外围设备忙于某些配置或内部操作)\n
! h2 d. y2 L' Q) R% U" i+ } - * b1接收状态\n
+ f9 X/ D9 [4 F6 Z1 M - * 0:就绪(无正在进行的接收操作)\n- x& \: S0 P d( g# u+ V& d
- * 1:忙(正在进行Rx操作)\n$ ~. |4 N) A, }! p d, e
- * b0Tx状态\n2 \" r8 ]! k9 o+ ^7 Q9 m
- * 0:就绪(没有正在进行的发送操作)\n
# [% t) q" J% v6 K1 G - * 1:忙(正在进行发送操作)
; I7 P3 A2 V/ L w1 b: v/ x% [ - ! O/ n# T& q; V2 M9 N" R5 y) l% l
- */
! P5 W8 ~/ g4 y - typedef enum! L% [, S0 a7 x
- {$ ]. z1 _- o+ n( w1 _* V% `1 D
- HAL_I2C_STATE_RESET = 0x00U, /*外围设备尚未初始化*/, y& ^% l# Q5 l! s r7 }% I$ S
- HAL_I2C_STATE_READY = 0x20U, /*已初始化外围设备并准备使用*/9 B4 t( ^' Z4 S% k0 Z5 Y( Z3 u! C
- HAL_I2C_STATE_BUSY = 0x24U, /*内部进程正在进行*/
* {) S: _% [5 S& q; A - HAL_I2C_STATE_BUSY_TX = 0x21U, /*数据传输过程正在进行*/( [, \$ z1 o5 Z/ p. {1 U- f
- HAL_I2C_STATE_BUSY_RX = 0x22U, /*数据接收过程正在进行*/+ i6 X* v5 V$ t: | w
- HAL_I2C_STATE_LISTEN = 0x28U, /*地址监听模式正在进行*/
4 l5 ~9 r" R9 d" ~5 s2 Z0 s - HAL_I2C_STATE_BUSY_TX_LISTEN = 0x29U, /*地址监听模式和数据传输正在进行中*/
4 G0 l O& ^) X: E/ ~ - HAL_I2C_STATE_BUSY_RX_LISTEN = 0x2AU, /*地址监听模式和数据接收正在进行中*/
9 ^+ m4 [0 t7 q8 i5 F" d - HAL_I2C_STATE_ABORT = 0x60U, /*正在中止用户请求*/
; q& t) H! [' B0 B - HAL_I2C_STATE_TIMEOUT = 0xA0U, /*超时状态*/
7 ~) [& |3 r" }, R7 l V - HAL_I2C_STATE_ERROR = 0xE0U /*错误*/
9 a! _* Q1 Z" y& d1 y
4 d2 l9 ^0 b; b, M6 @- S. A! z2 j- }HAL_I2C_StateTypeDef;# h0 g# H K6 R. Q$ c2 @. w$ B
- 8 d6 a2 u5 O, u' D9 q% w I
, c7 |' y6 a! l3 s9 N
& n3 M x5 d) ~% r9 [( j3 H- /*HAL模式结构定义4 w1 ?2 e9 l. i' d. W, d
- *HALI2C模式值编码遵循下面描述的位图:\n% Z# Z& K- ]- @' j( b/ G
- * b7(未使用)\n. L& J2 k+ m% t" z+ A) a( T
- * x:应设置为0\n
; y, [ G5 y7 G( {0 V - * b6\n
0 } A9 j$ J+ f8 M: {7 [: P3 k - * 0:无\n( U J# a! f" K5 O/ I* M/ Q. l
- * 1:内存(HALI2C通信处于内存模式)\n
! s% P1 K, J) a' z9 w* i - * b5\n
2 I7 j! ` t# j - * 0:无\n
( [* ?, [' D4 K- v9 V+ Z, m - * 1:从站(HALI2C通信处于从站模式)\n
7 u' n" B3 s0 `7 G' q2 ? - * b4\n7 ?* _) s* I$ n" O
- * 0:无\n* i1 S4 a1 \* _. v
- * 1:主机(HALI2C通讯处于主机模式)\n0 Y6 j) O+ h& o
- * b3-b2-b1-b0(未使用)\n. {" P+ f2 X" s' I. r# S/ q
- * xxxx:应设置为0000& s3 @( z+ Z! ~9 c
- + K1 s5 H; }$ W2 \8 ?; T
- */* |. R0 G. w2 `3 V/ t
- typedef enum
8 ] U! B4 Y8 D! V. n/ y - {
' n3 l$ s3 T8 o! V8 X - HAL_I2C_MODE_NONE =0x00U, /*进行中没有I2C通信*/
% Z0 T( Z4 V3 L( B - HAL_I2C_MODE_MASTER =0x10U,/*I2C通讯处于主模式*/ N/ J3 t y: l( z& |1 D
- HAL_I2C_MODE_SLAVE =0x20U,/*I2C通信处于从模式*/
4 o) y d$ d" `+ X: A1 w0 R8 t - HAL_I2C_MODE_MEM =0x40U /*I2C通信处于内存模式*/0 Z7 M7 J1 V; I) P4 I |
- ; _( |! H/ h5 P$ h6 C
- }HAL_I2C_ModeTypeDef;7 r9 H5 {! T3 E0 p" h( G4 U
- 3 l# u3 e. Z% e) w4 B8 n5 T `
. n7 a6 x% ?: {" u
3 t6 l1 y8 O0 q* }2 v- /*的I2C错误代码定义*/
, `# F5 Q+ c) ]- _+ [ - #定义HAL_I2C_ERROR_NONE (0x00000000U) /*没有错误*/+ x6 X, m6 I" v' F# R8 y7 J f
- #定义HAL_I2C_ERROR_BERR (0x00000001U) /*错误错误*/* \) P/ c4 ]' d6 h% k
- #定义HAL_I2C_ERROR_ARLO (0x00000002U) /*ARLO错误*/
. s4 d% H' ~* ^7 D, F7 v - #定义HAL_I2C_ERROR_AF (0x00000004U) /*ACKF错误*/ C o/ O: Z, U- k
- #定义HAL_I2C_ERROR_OVR (0x00000008U) /*OVR错误*/( N8 i. z Y' G1 x7 A" M5 n9 f
- #定义HAL_I2C_ERROR_DMA (0x00000010U) /*DMA传输错误*/$ B, j4 I+ f4 w7 D0 I
- #定义HAL_I2C_ERROR_TIMEOUT (0x00000020U) /*超时错误*/2 i3 f$ D d# {% ~% Y- S4 G
- #定义HAL_I2C_ERROR_SIZE (0x00000040U) /*大小管理错误*/
* ^4 l5 I( s; ~7 m {. l - #定义HAL_I2C_ERROR_DMA_PARAM (0x00000080U) /*DMA参数错误*/
* R0 o0 T6 f3 v5 U( l. a% S2 ~ - #if(USE_HAL_I2C_REGISTER_CALLBACKS==1)
( V9 y" g6 q' g# d, V% S - #define HAL_I2C_ERROR_INVALID_CALLBACK (0x00000100U) /*无效的回调错误*/( X, ^0 K5 W8 N: O
- #endif/*USE_HAL_I2C_REGISTER_CALLBACKS*/
' Z8 T; r9 _7 b$ _+ I' L5 `: [ - #define HAL_I2C_ERROR_INVALID_PARAM (0x00000200U) /*无效参数错误*/+ ^$ H$ @- t* n: Z9 k6 J4 K5 W2 Z
1 g! j( n" z3 _( q. V# y4 o- % \3 I0 l" J' i1 X
- /*I2C句柄结构定义*/7 ?( v1 d& H3 _! X& C b" J
- typedef struct __I2C_HandleTypeDef* Y# v, n$ W" E/ w7 e9 n0 |
- {
- j6 [8 [ E$ g- I1 F - I2C_TypeDef *Instance; /*I2C注册基地址*/7 X4 Q) J/ Q) b) P) u; D/ n. u' N, h" g1 B
3 o9 y: t" v4 {- I2C_InitTypeDef Init; /*I2C通讯参数*/0 U! X% L9 e/ G5 @% g
- 7 t; [. u2 a0 c) I9 ~' l
- uint8_t *pBuffPtr; /*指向I2C传输缓冲区的指针*/. M: M0 J, g$ J. i5 N
+ ^! V7 r+ E, Y. F1 }2 [/ B- uint16_t XferSize; /*I2C传输大小*/
1 K g6 k. r, |% p" I: L+ ~" F! M6 a - + ~. Y- [" a3 i: r4 E4 S3 M6 y" H
- __IOuint16_t XferCount; /*I2C传输计数器*/9 ^, U* t5 N3 Z, {+ R
- - h) G9 F& |- Q& D" G
- __IOuint32_t XferOptions; /*I2C连续传输选项,此参数可以是I2C_XFEROPTIONS的值*/) X( ?0 m; K M( h, R
; S) H' K* b/ ~/ ]- __IOuint32_t PreviousState; /*I2C通信先前状态*/
0 u0 J: k1 K; l" F9 T! \: S, |6 R
9 G) d& w. F7 I) t) a, R" j- HAL_StatusTypeDef(*XferISR)(struct__I2C_HandleTypeDef*hi2c,uint32_tITFlags,uint32_tITSources);/*I2C传输IRQ处理程序函数指针*/
7 t& Z1 A) A8 H; O. w4 z8 i
% `+ J. A7 D- ]3 n( V! _- DMA_HandleTypeDef *hdmatx; /*I2CTxDMA句柄参数*/
6 `) Z! i# {2 o1 c
* G5 e0 W1 n3 Y* s- DMA_HandleTypeDef *hdmarx; /*I2CRxDMA句柄参数*/
: z) i! k, d6 V7 v( K" T: b' ~
) P: B& i( B, g" s- HAL_LockTypeDef Lock; /*I2C锁定对象*/
; T* q* [6 P- y0 I4 J6 e
$ i0 c9 e* g. W0 S) n- __IOHAL_I2C_StateTypeDef State; /*I2C通讯状态*/
* V( w& z4 |) ~9 _9 F6 @4 d6 Q6 U
3 v& U! P- b, M5 ^- __IOHAL_I2C_ModeTypeDef Mode; /*I2C通讯模式*/" g: g9 J/ ]% N/ x9 N9 d8 C
' H v l p l$ A/ N- __IOuint32_t ErrorCode; /*I2C错误代码*/
# W3 F- S& n( t2 _# e" l
3 Q/ ~& f6 f9 D% L9 {- __IOuint32_t AddrEventCount;/*I2C地址事件计数器*/
: R2 Q& x; J, L) x. t0 P- K$ P0 d9 N
$ ^. W- x1 p, T7 J% c5 w- #if(USE_HAL_I2C_REGISTER_CALLBACKS==1)
# u. O( [8 o( m0 Z! N
6 ?3 h8 f5 q6 A: [+ q: ^/ u% d- void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2C主Tx传输完成的回调*/: n9 R3 U" y! ?) J& {
- void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2C主Rx传输完成的回调*/% v m2 @ _. X" J
- void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2C从机Tx传输完成回调*/, T* w1 f' T" ]. H4 i% _
- void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2C从Rx传输完成回调*/
0 P Q3 L' K1 ^4 V5 ^$ y) g - void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2C监听完成回调*/
1 A& d1 P* w2 @ - void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2C内存发送传输完成回调*/" S3 r; [) k) {0 a5 o8 n
- void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2C内存接收传输完成回调*/+ m8 A M. F6 _( y. R) }: M$ P
- void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2C错误回调*/1 Z1 f. {+ ?* W. W I, e8 D! c/ e! Z
- void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2C中止回调*/( V6 }6 U! Y/ L- R
- void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*I2C从站地址匹配回调*/
8 f1 [* g5 N& v; E. O' ?' x - void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2CMsp初始化回调*/& l) c& O, S* Y; S. z+ S" `4 H+ d
- void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c); /*I2CMspDeInit回调*/' P; s9 y; C$ \2 k; x
- 3 z- i+ v) K1 Z" Q0 i
- #endif/*USE_HAL_I2C_REGISTER_CALLBACKS*/
( y6 H1 `$ k& A0 o/ ? - }I2C_HandleTypeDef;
$ ^. F; Z3 }2 S6 m0 u4 ^ - ' C; H! n% w4 y6 c
- ( e0 V. T0 x& |) J4 _
- /*HALI2C回调ID枚举定义*/9 z& T8 X4 R P4 p" ]
- typedef enum
* b) @$ w) H+ L* w8 V' T; q - {
8 K( p1 y' a8 m - HAL_I2C_MASTER_TX_COMPLETE_CB_ID =0x00U, /*I2C主Tx传输完成的回调ID*/$ I" _7 e4 U7 h3 x9 _# Y
- HAL_I2C_MASTER_RX_COMPLETE_CB_ID =0x01U, /*I2C主Rx传输完成的回调ID*/
5 l7 Y6 o! N- _2 r9 S, Q+ |- Q - HAL_I2C_SLAVE_TX_COMPLETE_CB_ID =0x02U, /*I2C从机Tx传输完成的回调ID*/" n w" ~: r: {! I V# y3 Q
- HAL_I2C_SLAVE_RX_COMPLETE_CB_ID =0x03U, /*I2C从站Rx传输完成的回调ID*/
4 J$ X4 O( j' V& o0 P' s2 e. X - HAL_I2C_LISTEN_COMPLETE_CB_ID =0x04U, /*I2C监听完成回调ID*/! m1 S+ e. R( _. }, |
- HAL_I2C_MEM_TX_COMPLETE_CB_ID =0x05U, /*I2C内存Tx传输回调ID*/- Y) P, e0 B4 r7 \ o- A9 C
- HAL_I2C_MEM_RX_COMPLETE_CB_ID =0x06U, /*I2C内存接收传输完成的回调ID*/. X8 s0 `4 r' f2 ?0 d! g
- HAL_I2C_ERROR_CB_ID =0x07U, /*I2C错误回调ID*/
. ~- A# K) v! O: G - HAL_I2C_ABORT_CB_ID =0x08U, /*I2C中止回调ID*/9 i- D# _4 J- L5 N
- HAL_I2C_MSPINIT_CB_ID =0x09U, /*I2CMsp初始化回调ID*/* q2 P6 i# i/ `4 a7 D: R/ [' R
- HAL_I2C_MSPDEINIT_CB_ID =0x0AU /*I2CMspDeInit回调ID*/- { P8 l/ A/ ?! ~
- }HAL_I2C_CallbackIDTypeDef;+ l* `; j. s5 u1 X% L1 ?
' @- q& y) B% f+ w c$ p- /*HALI2C回调指针定义*/8 d; M/ k; D+ C6 w- Y
- typedef void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*指向I2C回调函数的指针*/% h i7 r2 m6 B! m0 D) v. c$ M8 M
- typedef void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*指向I2C地址匹配回调函数的指针*/2 n4 u2 {2 r, S9 E$ C1 V4 y; P
5 B( v( N5 c1 ~: u: G! i& j- 1 i7 I* E u; O% `/ p
- /*I2C顺序传输选项*/6 ?5 B( x9 H, s) ?
- #define I2C_FIRST_FRAME ((uint32_t)I2C_SOFTEND_MODE)
7 j% t! [' z, ]0 B; p0 L+ `/ v5 I. d - #define I2C_FIRST_AND_NEXT_FRAME ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))( {6 J: h3 m2 i" {
- #define I2C_NEXT_FRAME ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))1 j. F3 L V( i, [5 V$ l; ^, }
- #define I2C_FIRST_AND_LAST_FRAME ((uint32_t)I2C_AUTOEND_MODE)
1 g( r6 f7 O( v - #define I2C_LAST_FRAME ((uint32_t)I2C_AUTOEND_MODE)
( N7 B5 F" S( \: C- C( j! j - #define I2C_LAST_FRAME_NO_STOP ((uint32_t)I2C_SOFTEND_MODE)
. ^! V( s! a1 D/ T4 m7 N
. g' [0 f* `+ ?" s
- H% }- `" W& C7 g+ W' i/ w- /*I2C寻址模式*/
" f' T; s1 W0 Y$ |/ |' l# z - #define I2C_ADDRESSINGMODE_7BIT (0x00000001U)3 y0 j& Q% U. h* M" d6 M: I
- #define I2C_ADDRESSINGMODE_10BIT (0x00000002U)0 v! c4 h8 ?8 x. o) B, T
) _; Q- v5 G$ Q, d0 e- ; C2 A7 x' C: D/ ], z- M: N
- /*I2C双寻址模式*/
) Z* w- I( e, U: D8 [ - #define I2C_DUALADDRESS_DISABLE (0x00000000U)
8 l. ?; z- c0 r2 b( ?4 v - #define I2C_DUALADDRESS_ENABLE I2C_OAR2_OA2EN
7 {7 r0 l1 r4 v
9 y7 Z: S$ N4 U- : a; F Z ~9 W9 _% B
- /*I2C自己地址的2个掩码*/
0 _4 z: a1 Q; s1 C/ F. t7 G9 P# Y/ ?; q - #define I2C_OA2_NOMASK ((uint8_t)0x00U)
; z( Q- V% {/ R; Z1 ^& k - #define I2C_OA2_MASK01 ((uint8_t)0x01U)
3 `7 l/ S4 } y0 @ - #define I2C_OA2_MASK02 ((uint8_t)0x02U)
: }' ^& N) I0 b+ s" F - #define I2C_OA2_MASK03 ((uint8_t)0x03U)
% k( x$ `8 p; g3 F - #define I2C_OA2_MASK04 ((uint8_t)0x04U)
4 R% i4 N8 Z% p# J1 ]+ x - #define I2C_OA2_MASK05 ((uint8_t)0x05U)
% |% N! I: u3 R - #define I2C_OA2_MASK06 ((uint8_t)0x06U)
, R+ X' T2 G. S [! _ - #define I2C_OA2_MASK07 ((uint8_t)0x07U)
8 F9 P+ @- M$ O! _* ~- C0 f
& A& P0 x) j5 D( j; B) X3 A
& G: G* V/ C6 l" d# q- /*I2C常规呼叫寻址模式*/
3 x3 d- s( C9 r' o! R% j2 A - #define I2C_GENERALCALL_DISABLE (0x00000000U)
/ @; G- Z1 T9 `/ u* H - #define I2C_GENERALCALL_ENABLE I2C_CR1_GCEN, J4 W% J2 C9 W" \4 Q h/ y3 `
( Q1 X) X/ ]8 e2 A
5 C- k/ D" d" ~+ Q$ f# Z- Q" j$ t- /*I2C无拉伸模式*/
% b Y0 o& _9 I# f" T+ m - #define I2C_NOSTRETCH_DISABLE (0x00000000U)
4 b8 m/ \+ ]! z9 D - #define I2C_NOSTRETCH_ENABLE I2C_CR1_NOSTRETCH
: S' d( ^' `# }6 `: H
! _- i/ i9 `/ _2 O4 M+ y: Z- 6 u$ V+ }) }6 M) x7 s
- /*I2C内存地址大小*/* Z, D. p( \& C: B" H6 \* e
- #define I2C_MEMADD_SIZE_8BIT (0x00000001U)4 T) l* I: ~; V5 u& c ^* v
- #define I2C_MEMADD_SIZE_16BIT (0x00000002U)
) c- z( z$ g2 j6 P
2 V' N5 ^* k( G- @7 O1 p' ~$ W) q- 3 b0 O3 E! B9 U, o8 N
- /*I2C传输方向主视点*/
8 a5 ~4 I K6 l6 f - #define I2C_DIRECTION_TRANSMIT (0x00000000U)
( q. y5 {- j, i0 f - #define I2C_DIRECTION_RECEIVE (0x00000001U)5 @$ {1 P% t" S! @$ g6 j( g1 L$ }
p5 h% H6 P* t& D( P4 [- . _/ B) p1 e1 Q: z, W1 d
- /*I2C重新加载结束模式*/
% X; k2 I; v0 _" O [( v, I& j; a - #define I2C_RELOAD_MODE I2C_CR2_RELOAD
6 V6 |6 f$ g% `6 K$ q" K - #define I2C_AUTOEND_MODE I2C_CR2_AUTOEND3 g+ D7 u: m5 x6 u Q6 |
- #define I2C_SOFTEND_MODE (0x00000000U)( `, H2 O2 Z' T& J0 h2 w
0 E/ b* {* Y T4 p5 G7 A- 8 G3 j" f4 V7 ^# P- @
- /*I2C启动或停止模式*/7 X) z5 O% u, I: N- F% [
- #define I2C_NO_STARTSTOP (0x00000000U)
2 k2 H2 _: y% I7 e3 n - #define I2C_GENERATE_STOP (uint32_t)(0x80000000U | I2C_CR2_STOP)1 E1 w* I1 l- X) ?
- #define I2C_GENERATE_START_READ (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN), l* k- k& \6 p! c/ o
- #define I2C_GENERATE_START_WRITE (uint32_t)(0x80000000U | I2C_CR2_START)
6 Q, V) N9 }$ F6 x' v, j" I2 H - ( N" f# G+ D( ?0 n
. t& X+ E' }* X, g' f# V- /*I2C中断配置定义*/- g& }2 Y+ H! g6 |9 Z
- #define I2C_IT_ERRI I2C_CR1_ERRIE, x( n1 l9 c4 s+ @9 i9 Y
- #define I2C_IT_TCI I2C_CR1_TCIE: G# t' }3 L9 Q+ F, p
- #define I2C_IT_STOPI I2C_CR1_STOPIE8 C" s0 |; Q6 V4 I% K8 ]
- #define I2C_IT_NACKI I2C_CR1_NACKIE
8 \- O2 T- t% G - #define I2C_IT_ADDRI I2C_CR1_ADDRIE( h$ B6 @2 T Q8 ^: c
- #define I2C_IT_RXI I2C_CR1_RXIE( d }" P2 m A8 h* f) y0 y
- #define I2C_IT_TXI I2C_CR1_TXIE) l- A: |* \# i- h+ d, Q& N
# H" y! V& Y7 s5 r! Z3 X- / M( D- x; a4 ^( p
- /*I2C标志定义*/
" ?4 y4 h: e# e5 i9 `1 J - #define I2C_FLAG_TXE I2C_ISR_TXE
0 a6 j% @1 U' i/ v; ^$ |5 v3 o - #define I2C_FLAG_TXIS I2C_ISR_TXIS! J& k9 r8 J$ f8 t$ j
- #define I2C_FLAG_RXNE I2C_ISR_RXNE, {1 f1 f, L4 q" B& r5 [
- #define I2C_FLAG_ADDR I2C_ISR_ADDR5 x: l% i6 h3 P, L* q6 _/ P
- #define I2C_FLAG_AF I2C_ISR_NACKF
. m- w, R/ v& I% T" a8 h - #define I2C_FLAG_STOPF I2C_ISR_STOPF
" s3 b3 G I; g1 z7 U4 L! K$ o2 u - #define I2C_FLAG_TC I2C_ISR_TC
% A' k- X; s9 q. [ - #define I2C_FLAG_TCR I2C_ISR_TCR
8 c3 X1 d) M0 Y4 g6 R) a - #define I2C_FLAG_BERR I2C_ISR_BERR
8 X) h' p- m. U6 O' \2 o$ J; i4 H. N) i - #define I2C_FLAG_ARLO I2C_ISR_ARLO
1 l5 P; _) q# ]! o - #define I2C_FLAG_OVR I2C_ISR_OVR1 p# n# v# o9 N4 @& Y; Q
- #define I2C_FLAG_PECERR I2C_ISR_PECERR; s+ f' h' m$ M8 O/ f0 N
- #define I2C_FLAG_TIMEOUT I2C_ISR_TIMEOUT
0 |! A$ [& O* V% V! k - #define I2C_FLAG_ALERT I2C_ISR_ALERT
' M0 F: D0 U" {# y* n. y* k - #define I2C_FLAG_BUSY I2C_ISR_BUSY
! Y4 R3 F" Z! S; d0 \) ? D - #define I2C_FLAG_DIR I2C_ISR_DIR5 P: b8 }0 Z% N: X
- & _- k% P7 i& B+ y" B9 p4 M: a
4 r. m7 b0 ?1 B, x( B3 R- 7 e2 h3 P0 m; q; d& O
- /*I2C句柄状态*/( i& R4 b" l# S5 F$ ]
- #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
7 N( T' @4 n' q" _1 s - #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) do{ \
8 ?1 T+ j/ W$ o0 w- i5 m! |) e - (__HANDLE__)->State = HAL_I2C_STATE_RESET; \
' O0 N9 N0 i' l1 O: p# B5 I4 e8 G: j - (__HANDLE__)->MspInitCallback = NULL; \: p$ g+ l8 s8 \9 l' X( ^
- (__HANDLE__)->MspDeInitCallback = NULL; \, q+ q. L2 W4 m' _' k/ I
- } while(0)
* O( ^& c6 h. [ - #else
# E4 b/ s! i3 Z# M' R% a: l - #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_I2C_STATE_RESET)
; K$ B% t! a: G, I$ ^5 q - #endif) ^. B" ?+ W6 J3 j9 ~
+ ^) L% N* @$ b$ a2 Y9 y- /*启用指定的I2C中断。
, u3 K3 p* k. V+ S+ S ] - *__HANDLE__指定I2C句柄。
: s2 A* k& N4 S- K8 Z' Y* c+ v - *__INTERRUPT__指定要启用的中断源。
8 D p# v# m ~( M8 ?2 m/ N+ h% T% M - *此参数可以是下列值之一:
$ Z( L5 w, O' Q: }0 p - *I2C_IT_ERRI错误中断4 o2 X* f& o. m( d; g1 B
- *I2C_IT_TCI传输完成中断
^- ]; T1 Y1 b5 X9 `; H% ] - *I2C_IT_STOPISTOP检测中断1 Z* Z" y! e/ W" c" H2 e. P& I
- *I2C_IT_NACKINACK接收中断1 M L% L) ]$ Z. k+ T1 G; ]
- *I2C_IT_ADDRI地址匹配中断
9 A5 y! }- J# Z, J2 m; r- r, C - *I2C_IT_RXIRX中断
. j6 R: r/ i0 M& L& {3 W! U6 n - *I2C_IT_TXITX中断. }3 u; ]( r% a$ O/ N5 o& R
- */6 h* C2 q( L! V$ x" Z# b. S' u
- #define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR1 |= (__INTERRUPT__))
& H# `! T# L! h- u2 x* A
9 h$ O: L9 E# e7 Y* w8 N8 K. B4 M: k& X- /*禁用指定的I2C中断。
" a6 s8 o4 V; U0 f - *__HANDLE__指定I2C句柄。
2 _4 g6 }! W& _" d - *__INTERRUPT__指定要禁用的中断源。2 K- T; ]/ S* F2 {/ K' E" F+ {
- *此参数可以是下列值之一:
9 t8 J7 u4 j; v- z- B. A - *I2C_IT_ERRI错误中断" {6 I) f }0 D2 ]6 \8 Z
- *I2C_IT_TCI传输完成中断. H) p8 @& W" i
- *I2C_IT_STOPISTOP检测中断
5 F7 N# H( K3 _: B$ f: [ - *I2C_IT_NACKINACK接收中断
, E3 s% | r$ W1 D$ W. M5 a# n - *I2C_IT_ADDRI地址匹配中断& H* U6 C$ ?5 H' j7 u
- *I2C_IT_RXIRX中断
% G& V5 y% b& X - *I2C_IT_TXITX中断% ]8 h( t( d( T) P- K6 `; g
- */, A1 x$ x* U. F% J/ s+ s8 ?
- #define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__) ((__HANDLE__)->Instance->CR1 &= (~(__INTERRUPT__)))
. N" o2 B0 y2 H% ` - . O) o) V& [3 d9 d2 e% p7 c
- /*检查是否启用了指定的I2C中断源。
( m; \" Y7 L6 e' F& e! t# _! k# _ - *__HANDLE__指定I2C句柄。( r0 a+ d/ e- y5 M; d- w& T- Z
- *__INTERRUPT__指定要检查的I2C中断源。
6 x5 `7 l8 v4 [ - *此参数可以是下列值之一:. v9 B7 ?9 g0 H" ^) E- z- \
- *I2C_IT_ERRI错误中断0 {" v2 m1 k7 r; ?4 ?) K
- *I2C_IT_TCI传输完成中断
$ `+ a4 l, P- ?# { w$ E m - *I2C_IT_STOPISTOP检测中断
; b2 H( S6 U- S j( F! `; ?9 H - *I2C_IT_NACKINACK接收中断
+ c6 o, k& t7 P: R/ J7 [$ l - *I2C_IT_ADDRI地址匹配中断' n* K* c& j" M
- *I2C_IT_RXIRX中断
6 o5 L N7 t, B8 e; [9 Y( w) z( ^, r - *I2C_IT_TXITX中断 T/ y! A: J$ _ t( z
- */
+ T* [9 n* j6 Z5 {9 W+ r - #define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) ((((__HANDLE__)->Instance->CR1 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)$ |/ n; f9 l* `. o- g; ?
- ) h" M0 ]% [1 E0 e( c; R1 m8 M* t6 i
- /*检查是否设置了指定的I2C标志。) i7 y1 l) [2 Z* {& V' O4 w- B
- *__HANDLE__指定I2C句柄。7 B6 J9 F: \5 z8 m
- *__FLAG__指定要检查的标志。( \. k0 t2 I4 I6 ]+ h
- *此参数可以是下列值之一: e) L, I m' K& Q4 I
- *I2C_FLAG_TXE发送数据寄存器为空
! B- A8 g, f4 e" @& I, J9 `" y - *I2C_FLAG_TXIS发送中断状态
/ Z+ C# C+ q2 L: x5 W, w0 Z+ J m+ R - *I2C_FLAG_RXNE接收数据寄存器不为空3 n R0 j* G0 f! j* C% o! c
- *I2C_FLAG_ADDR地址匹配(从模式)/ M) J- ]' r, O9 Y$ H: u5 w
- *I2C_FLAG_AF收到确认失败标志4 C( g" w' ?& L8 K" X
- *I2C_FLAG_STOPF停止检测标志
6 Y* V; J1 T# e6 Q' P5 C% T* f8 c$ W) U - *I2C_FLAG_TC传输完成(主模式)
* S9 U3 U. y _% ` I1 q - *I2C_FLAG_TCR传输完成重新加载
4 @0 U" v9 w0 G9 \. d& q( V9 ? - *I2C_FLAG_BERR总线错误
8 e" h" F2 e/ r: { - *I2C_FLAG_ARLO仲裁丢失
" u6 b' ]& O6 ^, b1 |, ^ - *I2C_FLAG_OVR超限/不足
: m& G, l8 @9 _ - *I2C_FLAG_PECERR接收中的PEC错误' h+ C/ m, S C, p% n3 r+ \
- *I2C_FLAG_TIMEOUT超时或低速检测标志
f$ g1 g0 A n$ T3 q - *I2C_FLAG_ALERTSMBus警报
5 j% Y$ _& N- }/ ?8 ^4 V - *I2C_FLAG_BUSY总线忙
1 z3 P3 f5 b2 o4 l7 o - *I2C_FLAG_DIR传输方向(从模式)
3 Z3 M- a! z8 R) W - */
% I: I& G: y5 v - #define I2C_FLAG_MASK (0x0001FFFFU)4 p. l# G: O9 V6 z- E
- #define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) (((((__HANDLE__)->Instance->ISR) & (__FLAG__)) == (__FLAG__)) ? SET : RESET)8 J# Y. x% c2 i. l# _* I8 u& E
- ; N- Q5 H9 I7 Z8 i* o9 E
- /*清除I2C挂起标志,该标志通过在特定位写入1来清除。1 z2 ^( r% H$ s: @4 A
- *__HANDLE__指定I2C句柄。/ _4 i7 O+ O ]( {# F' x$ A
- *__FLAG__指定要清除的标志。# s: k# p$ O7 |/ z, e) A) z
- *此参数可以是以下值的任意组合:
. E2 `; {' }- E - *I2C_FLAG_TXE发送数据寄存器为空
$ l1 i1 {6 I6 o1 o - *I2C_FLAG_ADDR地址匹配(从模式)( c: h7 X2 ^' ^ j+ ?# U
- *I2C_FLAG_AF收到确认失败标志
$ K! g! z: }* A' Z7 U9 \7 d5 x - *I2C_FLAG_STOPF停止检测标志- l1 o+ y$ ?4 P* O! L: @" l
- *I2C_FLAG_BERR总线错误, P$ J' c2 j" a$ h9 m k% V
- *I2C_FLAG_ARLO仲裁丢失
8 c" Z5 m0 t- i- B3 Y5 r - *I2C_FLAG_OVR超限/不足
$ S% T) i) Y& N* e4 v - *I2C_FLAG_PECERR接收中的PEC错误
3 d$ }3 @3 j+ \/ o0 }* v5 V5 O - *I2C_FLAG_TIMEOUT超时或低速检测标志1 b4 r- K4 n" `" f6 Y4 J
- *I2C_FLAG_ALERTSMBus警报
% F5 y/ I( C: ~7 S/ p - */
6 J* O* O8 X. H( W - #define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__FLAG__) == I2C_FLAG_TXE) ? ((__HANDLE__)->Instance->ISR |= (__FLAG__)) \
* S' n( p, Z, t" J - : ((__HANDLE__)->Instance->ICR = (__FLAG__)))# f9 R) E& U/ r9 X* O! v3 t
- p- _. H& K e' W
- /*启用指定的I2C外设。*/( }0 ^' P" @$ Q" D
- #define __HAL_I2C_ENABLE(__HANDLE__) (SET_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE)) S" Z$ |+ b# |& D! A- }
1 T+ s1 a z0 l! \
, F8 b9 V: X4 k- /*禁用指定的I2C外设。*/
; F3 z f2 f) ]) j - #define __HAL_I2C_DISABLE(__HANDLE__) (CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE)). [6 u; H+ u4 a# w; K
- " t& t3 `9 i/ F# G3 l
- /*在从模式下生成一个非确认I2C外设。*/
$ K( H8 {3 f% J6 g& u - #define __HAL_I2C_GENERATE_NACK(__HANDLE__) (SET_BIT((__HANDLE__)->Instance->CR2, I2C_CR2_NACK))
, a. k9 q( |! S& i
; C: H- |! i+ E& v6 `9 {
" b1 Q: u9 V$ U% w
: X9 i5 M. n# k% W
( R X. c" \2 \7 E0 h- /*初始化和取消初始化功能**********************************/
- z H. T f; B - HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);. n; D& _( D+ F% M0 j
- HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);" o9 ?5 J8 e. B8 e/ ]. }9 z; d
- void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);; p! w7 [* d8 D" z" x. |/ v& U
- void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);' \7 X3 `* x8 R0 m* @/ H# w' B
- 3 p6 F( ]/ A0 N7 F& a8 G5 o5 O1 E, I" r
- /*回调注册/取消注册功能***********************************/$ h3 z! Z9 o* c3 v
- #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)0 w$ f8 J. z+ j$ d9 G
- HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback);
1 o% X8 N$ b9 G& O. [1 G3 y' n1 | - HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID);' j5 w) }3 i/ y: h+ v* C
- : j$ N7 D# m$ @
- HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback);7 Q2 Z* Z" X2 Q3 M% W
- HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c);
, q2 S6 Z" q: i8 }; g - #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */, `. \# t8 Q. X3 f( Z& Q1 B p
" @' O. {4 L( z" e+ ]0 D3 x7 c0 Y
/ [* _. X' @- F- q- /*输入和输出操作函数*/6 Z M3 J( k% A& @% k
- /*IO操作功能****************************************************/
" { k. D* {4 n* |6 Q( m - /*阻止模式:轮询*/
. Z+ d# ]) k+ T+ S9 s$ k- c8 r - HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
$ w% H. A0 _1 z) j' ^) U: g - HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);, e+ Y9 c {+ U2 z
- HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
2 m5 m' O9 e- T5 `/ Y% h5 r - HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
2 _) G# s$ O# K2 i9 d9 ^ - HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);; I# F# o' X& B5 g5 g% m% x
- HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);1 p R5 J: ?& z6 i5 K
- HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);
- _: x& o" W# Q7 K9 j
3 |) z3 {! b6 T* ^' {- /*非阻塞模式:中断*/
' [0 q6 J* e# J1 c - HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);; @4 n" u& W/ l I
- HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
7 z. X1 n+ _% L0 `! q/ ^* c# u - HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);2 y( V& ^8 k8 J# n+ R( f+ W
- HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size); r F- V! p1 W* v! K! J; W
- HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
; O3 I4 R+ |- B3 G) c - HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);+ r1 [1 l2 a: `
6 X$ h! u9 G9 P* h1 M- HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
! ?" ]. \ }4 u - HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);5 v. y9 y! A# \, ^% o. D
- HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
, B: O* f6 [ n1 ~; s - HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);! \7 A5 O# k4 {0 X X7 K8 W3 ]+ j k
- HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);) z: P( r1 A z X: W
- HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);
; U7 x: M |1 h4 Z' w2 ` - HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);! }( C2 |/ I* f2 J, s3 B' I
0 [1 n; n" S9 Y; C7 \1 v9 v2 H- P b- /*非阻塞模式:DMA*/
2 n$ x+ ^7 [" T! o, i8 B$ f; w* }% L - HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);2 Y W" P* V/ z3 n; M k5 c
- HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);0 Q5 ^5 _7 \; d; S* Y4 K
- HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);" n% C9 @0 m8 y/ W6 G# z. H
- HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);2 u; L0 s0 h5 R! v3 R# [$ x$ h
- HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
8 g" g+ @2 h: \# {0 b) t - HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
) F6 Y' J) F6 X0 k; m2 W - : N1 y7 _" j# n1 C
- HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);6 X3 x7 `$ |, P( z, d
- HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
9 O. h" Q2 U( W o( j8 g# V& |5 ] - HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);' h7 Y: X% I( | V
- HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);/ Y6 L& p" Y: X2 a3 e
- - q, I1 r7 l9 ?# { M# J7 s! c
! z) Y, C7 M" ?7 R6 L, I- /*在非阻塞模式(中断和DMA)中使用的I2C IRQHandler和回调*/
2 i5 j; S. {# L - void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c);
. x' _, a6 c: X - void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c);
3 w! C- n* X. L2 Y4 f8 ~. r - void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
& |7 k4 O! `; b r. Q - void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
/ U6 J* H" D( Y6 K3 X - void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c);
6 G$ |1 l8 S* B$ z1 v @ - void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c);4 ?# \* y0 H- x3 I
- void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);+ E7 v# v5 G% [% _- i
- void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c);$ k' [8 j, Q4 H. y
- void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);# u( j8 V+ n* u5 X; @
- void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
+ N; J& j+ \ w2 K5 u - void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);. g8 f o4 ]2 {8 u v! C5 b h. n
- void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);. H. p5 c5 u* ^
- , `2 E& r* u$ Y# i" J7 `
- 8 b2 D: t' \7 ]2 C2 i3 `
- /*外围状态,模式和错误功能*********************************/
# `- a H( D5 W- u+ {! a1 w - HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c);+ J0 ~% r7 q! K* I6 h" _9 m
- HAL_I2C_ModeTypeDef HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c);
8 o. L7 f0 Y7 |7 W$ y. p - uint32_t HAL_I2C_GetError(I2C_HandleTypeDef *hi2c);
# r' M3 k+ B: R, O* w
& A6 _2 D/ _5 j3 E' h- & P( F' n. ^4 m% l T: m! w
- 3 Q7 ]" [4 D. \8 G
4 S2 H, `# e% s- /*I2C专用宏*/+ X4 X) V) K# }5 k+ N5 ^
- #define IS_I2C_ADDRESSING_MODE(MODE) (((MODE) == I2C_ADDRESSINGMODE_7BIT) || \/ f0 @# v e1 P
- ((MODE) == I2C_ADDRESSINGMODE_10BIT))% S5 ^; |8 C* U J
( o! w6 q& K! I' n- #define IS_I2C_DUAL_ADDRESS(ADDRESS) (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \) C, R2 p- [/ ~3 W9 @' h
- ((ADDRESS) == I2C_DUALADDRESS_ENABLE))
3 Z( ~/ |$ K$ R - , l& h1 Y8 S* |* a. y2 W
- #define IS_I2C_OWN_ADDRESS2_MASK(MASK) (((MASK) == I2C_OA2_NOMASK) || \, X) m4 D/ s( T3 w
- ((MASK) == I2C_OA2_MASK01) || \& T% r& K- I0 Y; g5 `7 q
- ((MASK) == I2C_OA2_MASK02) || \
3 I9 q3 j: x, y1 J5 Z1 R2 X - ((MASK) == I2C_OA2_MASK03) || \8 U' D! t2 V0 U7 t' j% a# L0 }
- ((MASK) == I2C_OA2_MASK04) || \3 l2 u j" ]$ K9 r* C* t+ ~
- ((MASK) == I2C_OA2_MASK05) || \) g6 w h$ y/ Q2 r& p1 ~
- ((MASK) == I2C_OA2_MASK06) || \
% M5 f5 {" c+ d8 o9 B7 B, A! E - ((MASK) == I2C_OA2_MASK07))
& D2 Q& B2 U, P2 Z% D - * l, `7 z( j. ?% \8 p
- #define IS_I2C_GENERAL_CALL(CALL) (((CALL) == I2C_GENERALCALL_DISABLE) || \2 S/ H. Z( J& [9 K
- ((CALL) == I2C_GENERALCALL_ENABLE))) [ D1 y1 v5 c$ l; }$ D9 a- G/ `2 n
- ! J2 W0 j0 o+ W) i% L6 @
- #define IS_I2C_NO_STRETCH(STRETCH) (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \$ D+ L' E! w4 T. S! v
- ((STRETCH) == I2C_NOSTRETCH_ENABLE))1 n& T! Q% X5 ~9 M6 y D2 o6 C. ~
- , \2 _& R$ U8 l& [9 j& B- Y
- #define IS_I2C_MEMADD_SIZE(SIZE) (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \
) v: M4 O. {5 p/ r - ((SIZE) == I2C_MEMADD_SIZE_16BIT))' B. Y, ?; J# c. ~4 {
- : k$ u% P. ^) h# y! g
- #define IS_TRANSFER_MODE(MODE) (((MODE) == I2C_RELOAD_MODE) || \
) N1 M" b# ?4 w( Q - ((MODE) == I2C_AUTOEND_MODE) || \" K2 L) S; T) d
- ((MODE) == I2C_SOFTEND_MODE))
1 p6 @* X- z( e d# O - % {( T9 u+ A. `7 M. _! ^3 g
- #define IS_TRANSFER_REQUEST(REQUEST) (((REQUEST) == I2C_GENERATE_STOP) || \
0 d8 ]: b2 _. X1 x' A7 \+ H7 }2 e5 n - ((REQUEST) == I2C_GENERATE_START_READ) || \2 l% [+ J3 e! z* F4 b$ h0 ?$ S: k6 [
- ((REQUEST) == I2C_GENERATE_START_WRITE) || \% c- p/ n9 y+ C0 o. ?( p- ^
- ((REQUEST) == I2C_NO_STARTSTOP))1 M7 S G. j7 S$ N9 }5 R3 S
- $ @$ P/ j+ a* i" W2 E4 P
- #define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_FIRST_FRAME) || \
) ]- M9 b& R$ T1 S1 {) G - ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \
( F' L8 Y) g' E V0 V8 C - ((REQUEST) == I2C_NEXT_FRAME) || \1 i( H! x1 e8 m# W
- ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \
; {2 S Q; `5 m7 l- E% O' ^ - ((REQUEST) == I2C_LAST_FRAME) || \ O" w! \7 S4 l1 Z; R, D! K
- ((REQUEST) == I2C_LAST_FRAME_NO_STOP) || \! ?9 V7 [' a7 V# t( G
- IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST))
7 `5 r- t" }7 O% q$ N - ! M9 X1 Y6 x" r) J2 J' L* {
- #define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME) || \- B" O5 q3 c2 U) j5 g& A
- ((REQUEST) == I2C_OTHER_AND_LAST_FRAME))! D+ p" F; h3 ]2 c. q' a4 c. ]
- 7 ^; _; {# R5 Y6 k
- #define I2C_RESET_CR2(__HANDLE__) ((__HANDLE__)->Instance->CR2 &= (uint32_t)~((uint32_t)(I2C_CR2_SADD | I2C_CR2_HEAD10R | I2C_CR2_NBYTES | I2C_CR2_RELOAD | I2C_CR2_RD_WRN)))
$ g- h' d3 ~; w- | J: g* r
& r$ |" R5 O$ T1 M( n- #define I2C_GET_ADDR_MATCH(__HANDLE__) ((uint16_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_ADDCODE) >> 16U))
6 }# n6 |& I4 f) U7 F - #define I2C_GET_DIR(__HANDLE__) ((uint8_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_DIR) >> 16U))* u1 ]# P4 U) @/ c- b, T
- #define I2C_GET_STOP_MODE(__HANDLE__) ((__HANDLE__)->Instance->CR2 & I2C_CR2_AUTOEND)
1 p* a z4 r- U2 K+ J& x$ E - #define I2C_GET_OWN_ADDRESS1(__HANDLE__) ((uint16_t)((__HANDLE__)->Instance->OAR1 & I2C_OAR1_OA1)), o; u- y# c- V6 M n/ K O# ?
- #define I2C_GET_OWN_ADDRESS2(__HANDLE__) ((uint16_t)((__HANDLE__)->Instance->OAR2 & I2C_OAR2_OA2))* m# o/ c# w7 e5 M) t
- 3 G% J2 B& b) Y5 ]: \7 E
- #define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x000003FFU)& s& B1 m4 n) b
- #define IS_I2C_OWN_ADDRESS2(ADDRESS2) ((ADDRESS2) <= (uint16_t)0x00FFU)! J! X: h3 B5 k& \$ J5 {! h
- 8 g' m8 t- Q* ]4 a9 e7 [
- #define I2C_MEM_ADD_MSB(__ADDRESS__) ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0xFF00U))) >> 8U)))
) b$ \" F6 M, B9 c$ X6 K - #define I2C_MEM_ADD_LSB(__ADDRESS__) ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU))))
- T# }6 m* c, k# j3 n( y
# m' ~1 q9 A0 S! f; a7 C, b0 r+ T- #define I2C_GENERATE_START(__ADDMODE__,__ADDRESS__) (((__ADDMODE__) == I2C_ADDRESSINGMODE_7BIT) ? (uint32_t)((((uint32_t)(__ADDRESS__) & (I2C_CR2_SADD)) | (I2C_CR2_START) | (I2C_CR2_AUTOEND)) & (~I2C_CR2_RD_WRN)) : \
0 o! x2 M1 a+ M: E/ I% x6 c4 y - (uint32_t)((((uint32_t)(__ADDRESS__) & (I2C_CR2_SADD)) | (I2C_CR2_ADD10) | (I2C_CR2_START)) & (~I2C_CR2_RD_WRN)))
, O/ \+ z2 I5 l9 I6 Y2 A3 o
# n# D$ E2 V7 e! m6 f V/ v- #define I2C_CHECK_FLAG(__ISR__, __FLAG__) ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)
( Y- j; s3 N& j0 m, q - #define I2C_CHECK_IT_SOURCE(__CR1__, __IT__) ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET)4 {+ l" Z: u2 N) j8 h! T+ g
4 e/ e0 z% a2 J
复制代码 5 k/ k* G- e& Q
$ d, `) {; {4 o% W( N/ T' f$ ~5 n: H( A! Y
|