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