你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

NUCLEO_L552ZE_Q+HAL的I2C库(第五篇)

[复制链接]
qbwww 发布时间:2020-3-22 07:29
这个I2C库的资料也整理好了。有需要的看一看吧。这是用cube生成的文件整理的。Hal的库。3 q8 e/ j, i3 O9 l& u8 I
2 @2 V- ?. c) {1 }
  1. /*I2C配置结构定义*/3 O! p. H9 d. N  R5 a
  2. typedef struct- w/ a* \. [# n
  3. {, P8 F* ?8 ?+ G, f
  4. uint32_t Timing;                  /*指定I2C_TIMINGR_register值。该参数通过参考I2C初始化计算得出*/
    * Z; c. J5 Y6 }3 \4 M

  5. $ {7 [3 y! f4 U* Q% @9 Q
  6. uint32_t OwnAddress1;         /*指定第一个设备自己的地址。此参数可以是7位或10位地址。*/
    9 A+ v% {5 N4 q" O% h; R
  7. 0 [4 K" y0 u$ m3 `! F
  8.   uint32_t AddressingMode;  /*指定是选择7位还是10位寻址模式。此参数可以是I2C_ADDRESSING_MODE*/的值
    7 ^3 O# t9 }$ @" C& v8 G( t

  9. + l9 G3 |5 |) n& x
  10. uint32_t DualAddressMode; /*指定是否选择双重寻址模式。此参数可以是I2C_DUAL_ADDRESSING_MODE*/2 k9 Q! @4 {( I" o# p

  11. . r, w; c* K) F# b5 w
  12. uint32_t OwnAddress2;        /*如果选择双寻址模式,则指定第二个设备自己的地址此参数可以是7位地址。*/( h5 f2 ^" o8 S4 m, q" y; e5 d1 W
  13. 5 A6 a  [$ |7 H6 m
  14. uint32_t OwnAddress2Masks;/*如果选择双重寻址模式,则指定确认掩码地址第二个设备自己的地址,此参数可以是I2C_OWN_ADDRESS2_MASKS的值*/' ]" x2 L5 a& k

  15. + x, _, D5 E& s
  16. uint32_t GeneralCallMode;   /*指定是否选择常规呼叫模式。此参数可以是I2C_GENERAL_CALL_ADDRESSING_MODE的值*/9 C4 o4 {# ]( h* ], [" g/ C$ P

  17. 1 ^0 U. t# G6 P8 I4 h# F
  18. uint32_t NoStretchMode;     /*指定是否选择nostretch模式。此参数可以是I2C_NOSTRETCH_MODE的值*/
    9 c9 }* J2 o; g; y4 U; S1 ~/ v

  19. " x/ S5 ^1 _* v$ G/ y4 {% C: F
  20. }I2C_InitTypeDef;
    4 p( z# t9 i+ h9 n5 |+ H/ |
  21. * m' }9 c9 @2 h

  22. # X* R. D* B# |
  23. /*HAL状态结构定义% w2 M+ F7 g! h) i
  24. *HALI2C状态值编码遵循下面描述的位图:\n
    - ?3 }$ o& p7 O( c4 ]. i
  25. *                b7-b6错误信息\n8 `) f' \( B6 \$ J
  26. *                00:无错误\n9 u# k, V2 k! z7 x# |6 q, r- S' p
  27. *                01:中止(正在进行中的用户请求中止)\n
    9 @3 C# U, Y0 v3 C+ D7 C
  28. *                10:超时\n
    5 l; [: y; ]" q) R
  29. *                11:错误\n  R0 ^& W' g- D0 q3 V+ `
  30. *                b5 外围设备初始化状态\n
    - Z1 [) r2 S. I! H  X6 O
  31. *                0:重置(外围设备未初始化)\n
    ' W! {. L6 Q% w- f' j4 t
  32. *                1:已完成初始化(已初始化外围设备并准备使用。已调用HALI2CInit函数)\n: k& q* Z  f% z2 e, l" A! L& L: l
  33. *                b4(未使用)\n
    ) k2 v+ Z6 j3 }$ b- D3 s
  34. *                x:应设置为0\n! ~4 F7 N' I$ W3 w' P, ^* F/ e+ [
  35. *                b3\n
    8 n7 A3 @& J! b! ~1 M6 O# l
  36. *                0:就绪或忙碌(无监听模式正在进行中)\n
    3 y( E4 R5 |4 ]* u! r0 V9 p" c
  37. *                1:监听(地址监听模式中的外围设备)\n
    % Q8 X0 k5 ]7 _. h; ]1 z$ Y
  38. *                b2内部过程状态\n( K9 [- E5 R- ]! Y0 m7 b9 ~
  39. *                0:就绪\n
    3 w8 a9 ?/ s& [% x% h% I
  40. *                1:忙(外围设备忙于某些配置或内部操作)\n
    ! h2 d. y2 L' Q) R% U" i+ }
  41. *                b1接收状态\n
    + f9 X/ D9 [4 F6 Z1 M
  42. *                0:就绪(无正在进行的接收操作)\n- x& \: S0 P  d( g# u+ V& d
  43. *                1:忙(正在进行Rx操作)\n$ ~. |4 N) A, }! p  d, e
  44. *                b0Tx状态\n2 \" r8 ]! k9 o+ ^7 Q9 m
  45. *                0:就绪(没有正在进行的发送操作)\n
    # [% t) q" J% v6 K1 G
  46. *                1:忙(正在进行发送操作)
    ; I7 P3 A2 V/ L  w1 b: v/ x% [
  47. ! O/ n# T& q; V2 M9 N" R5 y) l% l
  48. */
    ! P5 W8 ~/ g4 y
  49. typedef enum! L% [, S0 a7 x
  50. {$ ]. z1 _- o+ n( w1 _* V% `1 D
  51.         HAL_I2C_STATE_RESET             = 0x00U, /*外围设备尚未初始化*/, y& ^% l# Q5 l! s  r7 }% I$ S
  52.         HAL_I2C_STATE_READY             = 0x20U, /*已初始化外围设备并准备使用*/9 B4 t( ^' Z4 S% k0 Z5 Y( Z3 u! C
  53.         HAL_I2C_STATE_BUSY              = 0x24U, /*内部进程正在进行*/
    * {) S: _% [5 S& q; A
  54.         HAL_I2C_STATE_BUSY_TX           = 0x21U, /*数据传输过程正在进行*/( [, \$ z1 o5 Z/ p. {1 U- f
  55.         HAL_I2C_STATE_BUSY_RX           = 0x22U, /*数据接收过程正在进行*/+ i6 X* v5 V$ t: |  w
  56.         HAL_I2C_STATE_LISTEN            = 0x28U, /*地址监听模式正在进行*/
    4 l5 ~9 r" R9 d" ~5 s2 Z0 s
  57.         HAL_I2C_STATE_BUSY_TX_LISTEN    = 0x29U, /*地址监听模式和数据传输正在进行中*/
    4 G0 l  O& ^) X: E/ ~
  58.         HAL_I2C_STATE_BUSY_RX_LISTEN    = 0x2AU, /*地址监听模式和数据接收正在进行中*/
    9 ^+ m4 [0 t7 q8 i5 F" d
  59.         HAL_I2C_STATE_ABORT             = 0x60U, /*正在中止用户请求*/
    ; q& t) H! [' B0 B
  60.         HAL_I2C_STATE_TIMEOUT           = 0xA0U, /*超时状态*/
    7 ~) [& |3 r" }, R7 l  V
  61.         HAL_I2C_STATE_ERROR             = 0xE0U  /*错误*/
    9 a! _* Q1 Z" y& d1 y

  62. 4 d2 l9 ^0 b; b, M6 @- S. A! z2 j
  63. }HAL_I2C_StateTypeDef;# h0 g# H  K6 R. Q$ c2 @. w$ B
  64. 8 d6 a2 u5 O, u' D9 q% w  I

  65. , c7 |' y6 a! l3 s9 N

  66. & n3 M  x5 d) ~% r9 [( j3 H
  67. /*HAL模式结构定义4 w1 ?2 e9 l. i' d. W, d
  68. *HALI2C模式值编码遵循下面描述的位图:\n% Z# Z& K- ]- @' j( b/ G
  69. *                b7(未使用)\n. L& J2 k+ m% t" z+ A) a( T
  70. *                x:应设置为0\n
    ; y, [  G5 y7 G( {0 V
  71. *                b6\n
    0 }  A9 j$ J+ f8 M: {7 [: P3 k
  72. *                0:无\n( U  J# a! f" K5 O/ I* M/ Q. l
  73. *                1:内存(HALI2C通信处于内存模式)\n
    ! s% P1 K, J) a' z9 w* i
  74. *                b5\n
    2 I7 j! `  t# j
  75. *                0:无\n
    ( [* ?, [' D4 K- v9 V+ Z, m
  76. *                1:从站(HALI2C通信处于从站模式)\n
    7 u' n" B3 s0 `7 G' q2 ?
  77. *                b4\n7 ?* _) s* I$ n" O
  78. *                0:无\n* i1 S4 a1 \* _. v
  79. *                1:主机(HALI2C通讯处于主机模式)\n0 Y6 j) O+ h& o
  80. *                b3-b2-b1-b0(未使用)\n. {" P+ f2 X" s' I. r# S/ q
  81. *                xxxx:应设置为0000& s3 @( z+ Z! ~9 c
  82. + K1 s5 H; }$ W2 \8 ?; T
  83. */* |. R0 G. w2 `3 V/ t
  84. typedef enum
    8 ]  U! B4 Y8 D! V. n/ y
  85. {
    ' n3 l$ s3 T8 o! V8 X
  86. HAL_I2C_MODE_NONE               =0x00U, /*进行中没有I2C通信*/
    % Z0 T( Z4 V3 L( B
  87. HAL_I2C_MODE_MASTER                                =0x10U,/*I2C通讯处于主模式*/  N/ J3 t  y: l( z& |1 D
  88. HAL_I2C_MODE_SLAVE                                =0x20U,/*I2C通信处于从模式*/
    4 o) y  d$ d" `+ X: A1 w0 R8 t
  89. HAL_I2C_MODE_MEM                                =0x40U  /*I2C通信处于内存模式*/0 Z7 M7 J1 V; I) P4 I  |
  90. ; _( |! H/ h5 P$ h6 C
  91. }HAL_I2C_ModeTypeDef;7 r9 H5 {! T3 E0 p" h( G4 U
  92. 3 l# u3 e. Z% e) w4 B8 n5 T  `

  93. . n7 a6 x% ?: {" u

  94. 3 t6 l1 y8 O0 q* }2 v
  95. /*的I2C错误代码定义*/
    , `# F5 Q+ c) ]- _+ [
  96. #定义HAL_I2C_ERROR_NONE                (0x00000000U)        /*没有错误*/+ x6 X, m6 I" v' F# R8 y7 J  f
  97. #定义HAL_I2C_ERROR_BERR                (0x00000001U)        /*错误错误*/* \) P/ c4 ]' d6 h% k
  98. #定义HAL_I2C_ERROR_ARLO                (0x00000002U)        /*ARLO错误*/
    . s4 d% H' ~* ^7 D, F7 v
  99. #定义HAL_I2C_ERROR_AF                        (0x00000004U)        /*ACKF错误*/  C  o/ O: Z, U- k
  100. #定义HAL_I2C_ERROR_OVR                        (0x00000008U)        /*OVR错误*/( N8 i. z  Y' G1 x7 A" M5 n9 f
  101. #定义HAL_I2C_ERROR_DMA                        (0x00000010U)        /*DMA传输错误*/$ B, j4 I+ f4 w7 D0 I
  102. #定义HAL_I2C_ERROR_TIMEOUT                (0x00000020U)        /*超时错误*/2 i3 f$ D  d# {% ~% Y- S4 G
  103. #定义HAL_I2C_ERROR_SIZE                (0x00000040U)        /*大小管理错误*/
    * ^4 l5 I( s; ~7 m  {. l
  104. #定义HAL_I2C_ERROR_DMA_PARAM        (0x00000080U)        /*DMA参数错误*/
    * R0 o0 T6 f3 v5 U( l. a% S2 ~
  105. #if(USE_HAL_I2C_REGISTER_CALLBACKS==1)
    ( V9 y" g6 q' g# d, V% S
  106. #define HAL_I2C_ERROR_INVALID_CALLBACK  (0x00000100U)  /*无效的回调错误*/( X, ^0 K5 W8 N: O
  107. #endif/*USE_HAL_I2C_REGISTER_CALLBACKS*/
    ' Z8 T; r9 _7 b$ _+ I' L5 `: [
  108. #define HAL_I2C_ERROR_INVALID_PARAM     (0x00000200U)  /*无效参数错误*/+ ^$ H$ @- t* n: Z9 k6 J4 K5 W2 Z

  109. 1 g! j( n" z3 _( q. V# y4 o
  110. % \3 I0 l" J' i1 X
  111. /*I2C句柄结构定义*/7 ?( v1 d& H3 _! X& C  b" J
  112. typedef struct __I2C_HandleTypeDef* Y# v, n$ W" E/ w7 e9 n0 |
  113. {
    - j6 [8 [  E$ g- I1 F
  114. I2C_TypeDef                                *Instance;                        /*I2C注册基地址*/7 X4 Q) J/ Q) b) P) u; D/ n. u' N, h" g1 B

  115. 3 o9 y: t" v4 {
  116. I2C_InitTypeDef                        Init;                                /*I2C通讯参数*/0 U! X% L9 e/ G5 @% g
  117. 7 t; [. u2 a0 c) I9 ~' l
  118. uint8_t                                        *pBuffPtr;                        /*指向I2C传输缓冲区的指针*/. M: M0 J, g$ J. i5 N

  119. + ^! V7 r+ E, Y. F1 }2 [/ B
  120. uint16_t                                XferSize;                        /*I2C传输大小*/
    1 K  g6 k. r, |% p" I: L+ ~" F! M6 a
  121. + ~. Y- [" a3 i: r4 E4 S3 M6 y" H
  122. __IOuint16_t                        XferCount;                        /*I2C传输计数器*/9 ^, U* t5 N3 Z, {+ R
  123. - h) G9 F& |- Q& D" G
  124. __IOuint32_t                        XferOptions;                /*I2C连续传输选项,此参数可以是I2C_XFEROPTIONS的值*/) X( ?0 m; K  M( h, R

  125. ; S) H' K* b/ ~/ ]
  126. __IOuint32_t                        PreviousState;                /*I2C通信先前状态*/
    0 u0 J: k1 K; l" F9 T! \: S, |6 R

  127. 9 G) d& w. F7 I) t) a, R" j
  128. HAL_StatusTypeDef(*XferISR)(struct__I2C_HandleTypeDef*hi2c,uint32_tITFlags,uint32_tITSources);/*I2C传输IRQ处理程序函数指针*/
    7 t& Z1 A) A8 H; O. w4 z8 i

  129. % `+ J. A7 D- ]3 n( V! _
  130. DMA_HandleTypeDef                *hdmatx;                        /*I2CTxDMA句柄参数*/
    6 `) Z! i# {2 o1 c

  131. * G5 e0 W1 n3 Y* s
  132. DMA_HandleTypeDef                *hdmarx;                        /*I2CRxDMA句柄参数*/
    : z) i! k, d6 V7 v( K" T: b' ~

  133. ) P: B& i( B, g" s
  134. HAL_LockTypeDef                        Lock;                        /*I2C锁定对象*/
    ; T* q* [6 P- y0 I4 J6 e

  135. $ i0 c9 e* g. W0 S) n
  136. __IOHAL_I2C_StateTypeDef         State;                /*I2C通讯状态*/
    * V( w& z4 |) ~9 _9 F6 @4 d6 Q6 U

  137. 3 v& U! P- b, M5 ^
  138. __IOHAL_I2C_ModeTypeDef                Mode;                /*I2C通讯模式*/" g: g9 J/ ]% N/ x9 N9 d8 C

  139. ' H  v  l  p  l$ A/ N
  140. __IOuint32_t                        ErrorCode;                /*I2C错误代码*/
    # W3 F- S& n( t2 _# e" l

  141. 3 Q/ ~& f6 f9 D% L9 {
  142. __IOuint32_t                        AddrEventCount;/*I2C地址事件计数器*/
    : R2 Q& x; J, L) x. t0 P- K$ P0 d9 N

  143. $ ^. W- x1 p, T7 J% c5 w
  144. #if(USE_HAL_I2C_REGISTER_CALLBACKS==1)
    # u. O( [8 o( m0 Z! N

  145. 6 ?3 h8 f5 q6 A: [+ q: ^/ u% d
  146. void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);         /*I2C主Tx传输完成的回调*/: n9 R3 U" y! ?) J& {
  147. void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);    /*I2C主Rx传输完成的回调*/% v  m2 @  _. X" J
  148. void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);         /*I2C从机Tx传输完成回调*/, T* w1 f' T" ]. H4 i% _
  149. void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);     /*I2C从Rx传输完成回调*/
    0 P  Q3 L' K1 ^4 V5 ^$ y) g
  150. void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c);            /*I2C监听完成回调*/
    1 A& d1 P* w2 @
  151. void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);                  /*I2C内存发送传输完成回调*/" S3 r; [) k) {0 a5 o8 n
  152. void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2C内存接收传输完成回调*/+ m8 A  M. F6 _( y. R) }: M$ P
  153. void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c);                          /*I2C错误回调*/1 Z1 f. {+ ?* W. W  I, e8 D! c/ e! Z
  154. void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2C中止回调*/( V6 }6 U! Y/ L- R
  155. void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*I2C从站地址匹配回调*/
    8 f1 [* g5 N& v; E. O' ?' x
  156. void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2CMsp初始化回调*/& l) c& O, S* Y; S. z+ S" `4 H+ d
  157. void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2CMspDeInit回调*/' P; s9 y; C$ \2 k; x
  158. 3 z- i+ v) K1 Z" Q0 i
  159. #endif/*USE_HAL_I2C_REGISTER_CALLBACKS*/
    ( y6 H1 `$ k& A0 o/ ?
  160. }I2C_HandleTypeDef;
    $ ^. F; Z3 }2 S6 m0 u4 ^
  161. ' C; H! n% w4 y6 c
  162. ( e0 V. T0 x& |) J4 _
  163. /*HALI2C回调ID枚举定义*/9 z& T8 X4 R  P4 p" ]
  164. typedef enum
    * b) @$ w) H+ L* w8 V' T; q
  165. {
    8 K( p1 y' a8 m
  166. HAL_I2C_MASTER_TX_COMPLETE_CB_ID        =0x00U,        /*I2C主Tx传输完成的回调ID*/$ I" _7 e4 U7 h3 x9 _# Y
  167. HAL_I2C_MASTER_RX_COMPLETE_CB_ID        =0x01U,        /*I2C主Rx传输完成的回调ID*/
    5 l7 Y6 o! N- _2 r9 S, Q+ |- Q
  168. HAL_I2C_SLAVE_TX_COMPLETE_CB_ID                =0x02U,        /*I2C从机Tx传输完成的回调ID*/" n  w" ~: r: {! I  V# y3 Q
  169. HAL_I2C_SLAVE_RX_COMPLETE_CB_ID                =0x03U,        /*I2C从站Rx传输完成的回调ID*/
    4 J$ X4 O( j' V& o0 P' s2 e. X
  170. HAL_I2C_LISTEN_COMPLETE_CB_ID                =0x04U,        /*I2C监听完成回调ID*/! m1 S+ e. R( _. }, |
  171. HAL_I2C_MEM_TX_COMPLETE_CB_ID                =0x05U,        /*I2C内存Tx传输回调ID*/- Y) P, e0 B4 r7 \  o- A9 C
  172. HAL_I2C_MEM_RX_COMPLETE_CB_ID                =0x06U,        /*I2C内存接收传输完成的回调ID*/. X8 s0 `4 r' f2 ?0 d! g
  173. HAL_I2C_ERROR_CB_ID                                        =0x07U,        /*I2C错误回调ID*/
    . ~- A# K) v! O: G
  174. HAL_I2C_ABORT_CB_ID                                        =0x08U,        /*I2C中止回调ID*/9 i- D# _4 J- L5 N
  175. HAL_I2C_MSPINIT_CB_ID                                =0x09U,        /*I2CMsp初始化回调ID*/* q2 P6 i# i/ `4 a7 D: R/ [' R
  176. HAL_I2C_MSPDEINIT_CB_ID                                =0x0AU                /*I2CMspDeInit回调ID*/- {  P8 l/ A/ ?! ~
  177. }HAL_I2C_CallbackIDTypeDef;+ l* `; j. s5 u1 X% L1 ?

  178. ' @- q& y) B% f+ w  c$ p
  179. /*HALI2C回调指针定义*/8 d; M/ k; D+ C6 w- Y
  180. typedef  void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*指向I2C回调函数的指针*/% h  i7 r2 m6 B! m0 D) v. c$ M8 M
  181. 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

  182. 5 B( v( N5 c1 ~: u: G! i& j
  183. 1 i7 I* E  u; O% `/ p
  184. /*I2C顺序传输选项*/6 ?5 B( x9 H, s) ?
  185. #define I2C_FIRST_FRAME                 ((uint32_t)I2C_SOFTEND_MODE)
    7 j% t! [' z, ]0 B; p0 L+ `/ v5 I. d
  186. #define I2C_FIRST_AND_NEXT_FRAME        ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))( {6 J: h3 m2 i" {
  187. #define I2C_NEXT_FRAME                  ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))1 j. F3 L  V( i, [5 V$ l; ^, }
  188. #define I2C_FIRST_AND_LAST_FRAME        ((uint32_t)I2C_AUTOEND_MODE)
    1 g( r6 f7 O( v
  189. #define I2C_LAST_FRAME                  ((uint32_t)I2C_AUTOEND_MODE)
    ( N7 B5 F" S( \: C- C( j! j
  190. #define I2C_LAST_FRAME_NO_STOP          ((uint32_t)I2C_SOFTEND_MODE)
    . ^! V( s! a1 D/ T4 m7 N

  191. . g' [0 f* `+ ?" s

  192. - H% }- `" W& C7 g+ W' i/ w
  193. /*I2C寻址模式*/
    " f' T; s1 W0 Y$ |/ |' l# z
  194. #define I2C_ADDRESSINGMODE_7BIT         (0x00000001U)3 y0 j& Q% U. h* M" d6 M: I
  195. #define I2C_ADDRESSINGMODE_10BIT        (0x00000002U)0 v! c4 h8 ?8 x. o) B, T

  196. ) _; Q- v5 G$ Q, d0 e
  197. ; C2 A7 x' C: D/ ], z- M: N
  198. /*I2C双寻址模式*/
    ) Z* w- I( e, U: D8 [
  199. #define I2C_DUALADDRESS_DISABLE         (0x00000000U)
    8 l. ?; z- c0 r2 b( ?4 v
  200. #define I2C_DUALADDRESS_ENABLE          I2C_OAR2_OA2EN
    7 {7 r0 l1 r4 v

  201. 9 y7 Z: S$ N4 U
  202. : a; F  Z  ~9 W9 _% B
  203. /*I2C自己地址的2个掩码*/
    0 _4 z: a1 Q; s1 C/ F. t7 G9 P# Y/ ?; q
  204. #define I2C_OA2_NOMASK                  ((uint8_t)0x00U)
    ; z( Q- V% {/ R; Z1 ^& k
  205. #define I2C_OA2_MASK01                  ((uint8_t)0x01U)
    3 `7 l/ S4 }  y0 @
  206. #define I2C_OA2_MASK02                  ((uint8_t)0x02U)
    : }' ^& N) I0 b+ s" F
  207. #define I2C_OA2_MASK03                  ((uint8_t)0x03U)
    % k( x$ `8 p; g3 F
  208. #define I2C_OA2_MASK04                  ((uint8_t)0x04U)
    4 R% i4 N8 Z% p# J1 ]+ x
  209. #define I2C_OA2_MASK05                  ((uint8_t)0x05U)
    % |% N! I: u3 R
  210. #define I2C_OA2_MASK06                  ((uint8_t)0x06U)
    , R+ X' T2 G. S  [! _
  211. #define I2C_OA2_MASK07                  ((uint8_t)0x07U)
    8 F9 P+ @- M$ O! _* ~- C0 f

  212. & A& P0 x) j5 D( j; B) X3 A

  213. & G: G* V/ C6 l" d# q
  214. /*I2C常规呼叫寻址模式*/
    3 x3 d- s( C9 r' o! R% j2 A
  215. #define I2C_GENERALCALL_DISABLE         (0x00000000U)
    / @; G- Z1 T9 `/ u* H
  216. #define I2C_GENERALCALL_ENABLE          I2C_CR1_GCEN, J4 W% J2 C9 W" \4 Q  h/ y3 `

  217. ( Q1 X) X/ ]8 e2 A

  218. 5 C- k/ D" d" ~+ Q$ f# Z- Q" j$ t
  219. /*I2C无拉伸模式*/
    % b  Y0 o& _9 I# f" T+ m
  220. #define I2C_NOSTRETCH_DISABLE           (0x00000000U)
    4 b8 m/ \+ ]! z9 D
  221. #define I2C_NOSTRETCH_ENABLE            I2C_CR1_NOSTRETCH
    : S' d( ^' `# }6 `: H

  222. ! _- i/ i9 `/ _2 O4 M+ y: Z
  223. 6 u$ V+ }) }6 M) x7 s
  224. /*I2C内存地址大小*/* Z, D. p( \& C: B" H6 \* e
  225. #define I2C_MEMADD_SIZE_8BIT            (0x00000001U)4 T) l* I: ~; V5 u& c  ^* v
  226. #define I2C_MEMADD_SIZE_16BIT           (0x00000002U)
    ) c- z( z$ g2 j6 P

  227. 2 V' N5 ^* k( G- @7 O1 p' ~$ W) q
  228. 3 b0 O3 E! B9 U, o8 N
  229. /*I2C传输方向主视点*/
    8 a5 ~4 I  K6 l6 f
  230. #define I2C_DIRECTION_TRANSMIT          (0x00000000U)
    ( q. y5 {- j, i0 f
  231. #define I2C_DIRECTION_RECEIVE           (0x00000001U)5 @$ {1 P% t" S! @$ g6 j( g1 L$ }

  232.   p5 h% H6 P* t& D( P4 [
  233. . _/ B) p1 e1 Q: z, W1 d
  234. /*I2C重新加载结束模式*/
    % X; k2 I; v0 _" O  [( v, I& j; a
  235. #define  I2C_RELOAD_MODE                I2C_CR2_RELOAD
    6 V6 |6 f$ g% `6 K$ q" K
  236. #define  I2C_AUTOEND_MODE               I2C_CR2_AUTOEND3 g+ D7 u: m5 x6 u  Q6 |
  237. #define  I2C_SOFTEND_MODE               (0x00000000U)( `, H2 O2 Z' T& J0 h2 w

  238. 0 E/ b* {* Y  T4 p5 G7 A
  239. 8 G3 j" f4 V7 ^# P- @
  240. /*I2C启动或停止模式*/7 X) z5 O% u, I: N- F% [
  241. #define  I2C_NO_STARTSTOP               (0x00000000U)
    2 k2 H2 _: y% I7 e3 n
  242. #define  I2C_GENERATE_STOP              (uint32_t)(0x80000000U | I2C_CR2_STOP)1 E1 w* I1 l- X) ?
  243. #define  I2C_GENERATE_START_READ        (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN), l* k- k& \6 p! c/ o
  244. #define  I2C_GENERATE_START_WRITE       (uint32_t)(0x80000000U | I2C_CR2_START)
    6 Q, V) N9 }$ F6 x' v, j" I2 H
  245. ( N" f# G+ D( ?0 n

  246. . t& X+ E' }* X, g' f# V
  247. /*I2C中断配置定义*/- g& }2 Y+ H! g6 |9 Z
  248. #define I2C_IT_ERRI                     I2C_CR1_ERRIE, x( n1 l9 c4 s+ @9 i9 Y
  249. #define I2C_IT_TCI                      I2C_CR1_TCIE: G# t' }3 L9 Q+ F, p
  250. #define I2C_IT_STOPI                    I2C_CR1_STOPIE8 C" s0 |; Q6 V4 I% K8 ]
  251. #define I2C_IT_NACKI                    I2C_CR1_NACKIE
    8 \- O2 T- t% G
  252. #define I2C_IT_ADDRI                    I2C_CR1_ADDRIE( h$ B6 @2 T  Q8 ^: c
  253. #define I2C_IT_RXI                      I2C_CR1_RXIE( d  }" P2 m  A8 h* f) y0 y
  254. #define I2C_IT_TXI                      I2C_CR1_TXIE) l- A: |* \# i- h+ d, Q& N

  255. # H" y! V& Y7 s5 r! Z3 X
  256. / M( D- x; a4 ^( p
  257. /*I2C标志定义*/
    " ?4 y4 h: e# e5 i9 `1 J
  258. #define I2C_FLAG_TXE                    I2C_ISR_TXE
    0 a6 j% @1 U' i/ v; ^$ |5 v3 o
  259. #define I2C_FLAG_TXIS                   I2C_ISR_TXIS! J& k9 r8 J$ f8 t$ j
  260. #define I2C_FLAG_RXNE                   I2C_ISR_RXNE, {1 f1 f, L4 q" B& r5 [
  261. #define I2C_FLAG_ADDR                   I2C_ISR_ADDR5 x: l% i6 h3 P, L* q6 _/ P
  262. #define I2C_FLAG_AF                     I2C_ISR_NACKF
    . m- w, R/ v& I% T" a8 h
  263. #define I2C_FLAG_STOPF                  I2C_ISR_STOPF
    " s3 b3 G  I; g1 z7 U4 L! K$ o2 u
  264. #define I2C_FLAG_TC                     I2C_ISR_TC
    % A' k- X; s9 q. [
  265. #define I2C_FLAG_TCR                    I2C_ISR_TCR
    8 c3 X1 d) M0 Y4 g6 R) a
  266. #define I2C_FLAG_BERR                   I2C_ISR_BERR
    8 X) h' p- m. U6 O' \2 o$ J; i4 H. N) i
  267. #define I2C_FLAG_ARLO                   I2C_ISR_ARLO
    1 l5 P; _) q# ]! o
  268. #define I2C_FLAG_OVR                    I2C_ISR_OVR1 p# n# v# o9 N4 @& Y; Q
  269. #define I2C_FLAG_PECERR                 I2C_ISR_PECERR; s+ f' h' m$ M8 O/ f0 N
  270. #define I2C_FLAG_TIMEOUT                I2C_ISR_TIMEOUT
    0 |! A$ [& O* V% V! k
  271. #define I2C_FLAG_ALERT                  I2C_ISR_ALERT
    ' M0 F: D0 U" {# y* n. y* k
  272. #define I2C_FLAG_BUSY                   I2C_ISR_BUSY
    ! Y4 R3 F" Z! S; d0 \) ?  D
  273. #define I2C_FLAG_DIR                    I2C_ISR_DIR5 P: b8 }0 Z% N: X
  274. & _- k% P7 i& B+ y" B9 p4 M: a

  275. 4 r. m7 b0 ?1 B, x( B3 R
  276. 7 e2 h3 P0 m; q; d& O
  277. /*I2C句柄状态*/( i& R4 b" l# S5 F$ ]
  278. #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
    7 N( T' @4 n' q" _1 s
  279. #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                do{                                                   \
    8 ?1 T+ j/ W$ o0 w- i5 m! |) e
  280.                                                                     (__HANDLE__)->State = HAL_I2C_STATE_RESET;       \
    ' O0 N9 N0 i' l1 O: p# B5 I4 e8 G: j
  281.                                                                     (__HANDLE__)->MspInitCallback = NULL;            \: p$ g+ l8 s8 \9 l' X( ^
  282.                                                                     (__HANDLE__)->MspDeInitCallback = NULL;          \, q+ q. L2 W4 m' _' k/ I
  283.                                                                   } while(0)
    * O( ^& c6 h. [
  284. #else
    # E4 b/ s! i3 Z# M' R% a: l
  285. #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                ((__HANDLE__)->State = HAL_I2C_STATE_RESET)
    ; K$ B% t! a: G, I$ ^5 q
  286. #endif) ^. B" ?+ W6 J3 j9 ~

  287. + ^) L% N* @$ b$ a2 Y9 y
  288. /*启用指定的I2C中断。
    , u3 K3 p* k. V+ S+ S  ]
  289. *__HANDLE__指定I2C句柄。
    : s2 A* k& N4 S- K8 Z' Y* c+ v
  290. *__INTERRUPT__指定要启用的中断源。
    8 D  p# v# m  ~( M8 ?2 m/ N+ h% T% M
  291. *此参数可以是下列值之一:
    $ Z( L5 w, O' Q: }0 p
  292. *I2C_IT_ERRI错误中断4 o2 X* f& o. m( d; g1 B
  293. *I2C_IT_TCI传输完成中断
      ^- ]; T1 Y1 b5 X9 `; H% ]
  294. *I2C_IT_STOPISTOP检测中断1 Z* Z" y! e/ W" c" H2 e. P& I
  295. *I2C_IT_NACKINACK接收中断1 M  L% L) ]$ Z. k+ T1 G; ]
  296. *I2C_IT_ADDRI地址匹配中断
    9 A5 y! }- J# Z, J2 m; r- r, C
  297. *I2C_IT_RXIRX中断
    . j6 R: r/ i0 M& L& {3 W! U6 n
  298. *I2C_IT_TXITX中断. }3 u; ]( r% a$ O/ N5 o& R
  299. */6 h* C2 q( L! V$ x" Z# b. S' u
  300. #define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__)          ((__HANDLE__)->Instance->CR1 |= (__INTERRUPT__))
    & H# `! T# L! h- u2 x* A

  301. 9 h$ O: L9 E# e7 Y* w8 N8 K. B4 M: k& X
  302. /*禁用指定的I2C中断。
    " a6 s8 o4 V; U0 f
  303. *__HANDLE__指定I2C句柄。
    2 _4 g6 }! W& _" d
  304. *__INTERRUPT__指定要禁用的中断源。2 K- T; ]/ S* F2 {/ K' E" F+ {
  305. *此参数可以是下列值之一:
    9 t8 J7 u4 j; v- z- B. A
  306. *I2C_IT_ERRI错误中断" {6 I) f  }0 D2 ]6 \8 Z
  307. *I2C_IT_TCI传输完成中断. H) p8 @& W" i
  308. *I2C_IT_STOPISTOP检测中断
    5 F7 N# H( K3 _: B$ f: [
  309. *I2C_IT_NACKINACK接收中断
    , E3 s% |  r$ W1 D$ W. M5 a# n
  310. *I2C_IT_ADDRI地址匹配中断& H* U6 C$ ?5 H' j7 u
  311. *I2C_IT_RXIRX中断
    % G& V5 y% b& X
  312. *I2C_IT_TXITX中断% ]8 h( t( d( T) P- K6 `; g
  313. */, A1 x$ x* U. F% J/ s+ s8 ?
  314. #define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__)         ((__HANDLE__)->Instance->CR1 &= (~(__INTERRUPT__)))
    . N" o2 B0 y2 H% `
  315. . O) o) V& [3 d9 d2 e% p7 c
  316. /*检查是否启用了指定的I2C中断源。
    ( m; \" Y7 L6 e' F& e! t# _! k# _
  317. *__HANDLE__指定I2C句柄。( r0 a+ d/ e- y5 M; d- w& T- Z
  318. *__INTERRUPT__指定要检查的I2C中断源。
    6 x5 `7 l8 v4 [
  319. *此参数可以是下列值之一:. v9 B7 ?9 g0 H" ^) E- z- \
  320. *I2C_IT_ERRI错误中断0 {" v2 m1 k7 r; ?4 ?) K
  321. *I2C_IT_TCI传输完成中断
    $ `+ a4 l, P- ?# {  w$ E  m
  322. *I2C_IT_STOPISTOP检测中断
    ; b2 H( S6 U- S  j( F! `; ?9 H
  323. *I2C_IT_NACKINACK接收中断
    + c6 o, k& t7 P: R/ J7 [$ l
  324. *I2C_IT_ADDRI地址匹配中断' n* K* c& j" M
  325. *I2C_IT_RXIRX中断
    6 o5 L  N7 t, B8 e; [9 Y( w) z( ^, r
  326. *I2C_IT_TXITX中断  T/ y! A: J$ _  t( z
  327. */
    + T* [9 n* j6 Z5 {9 W+ r
  328. #define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__)      ((((__HANDLE__)->Instance->CR1 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)$ |/ n; f9 l* `. o- g; ?
  329. ) h" M0 ]% [1 E0 e( c; R1 m8 M* t6 i
  330. /*检查是否设置了指定的I2C标志。) i7 y1 l) [2 Z* {& V' O4 w- B
  331. *__HANDLE__指定I2C句柄。7 B6 J9 F: \5 z8 m
  332. *__FLAG__指定要检查的标志。( \. k0 t2 I4 I6 ]+ h
  333. *此参数可以是下列值之一:  e) L, I  m' K& Q4 I
  334. *I2C_FLAG_TXE发送数据寄存器为空
    ! B- A8 g, f4 e" @& I, J9 `" y
  335. *I2C_FLAG_TXIS发送中断状态
    / Z+ C# C+ q2 L: x5 W, w0 Z+ J  m+ R
  336. *I2C_FLAG_RXNE接收数据寄存器不为空3 n  R0 j* G0 f! j* C% o! c
  337. *I2C_FLAG_ADDR地址匹配(从模式)/ M) J- ]' r, O9 Y$ H: u5 w
  338. *I2C_FLAG_AF收到确认失败标志4 C( g" w' ?& L8 K" X
  339. *I2C_FLAG_STOPF停止检测标志
    6 Y* V; J1 T# e6 Q' P5 C% T* f8 c$ W) U
  340. *I2C_FLAG_TC传输完成(主模式)
    * S9 U3 U. y  _% `  I1 q
  341. *I2C_FLAG_TCR传输完成重新加载
    4 @0 U" v9 w0 G9 \. d& q( V9 ?
  342. *I2C_FLAG_BERR总线错误
    8 e" h" F2 e/ r: {
  343. *I2C_FLAG_ARLO仲裁丢失
    " u6 b' ]& O6 ^, b1 |, ^
  344. *I2C_FLAG_OVR超限/不足
    : m& G, l8 @9 _
  345. *I2C_FLAG_PECERR接收中的PEC错误' h+ C/ m, S  C, p% n3 r+ \
  346. *I2C_FLAG_TIMEOUT超时或低速检测标志
      f$ g1 g0 A  n$ T3 q
  347. *I2C_FLAG_ALERTSMBus警报
    5 j% Y$ _& N- }/ ?8 ^4 V
  348. *I2C_FLAG_BUSY总线忙
    1 z3 P3 f5 b2 o4 l7 o
  349. *I2C_FLAG_DIR传输方向(从模式)
    3 Z3 M- a! z8 R) W
  350. */
    % I: I& G: y5 v
  351. #define I2C_FLAG_MASK  (0x0001FFFFU)4 p. l# G: O9 V6 z- E
  352. #define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) (((((__HANDLE__)->Instance->ISR) & (__FLAG__)) == (__FLAG__)) ? SET : RESET)8 J# Y. x% c2 i. l# _* I8 u& E
  353. ; N- Q5 H9 I7 Z8 i* o9 E
  354. /*清除I2C挂起标志,该标志通过在特定位写入1来清除。1 z2 ^( r% H$ s: @4 A
  355. *__HANDLE__指定I2C句柄。/ _4 i7 O+ O  ]( {# F' x$ A
  356. *__FLAG__指定要清除的标志。# s: k# p$ O7 |/ z, e) A) z
  357. *此参数可以是以下值的任意组合:
    . E2 `; {' }- E
  358. *I2C_FLAG_TXE发送数据寄存器为空
    $ l1 i1 {6 I6 o1 o
  359. *I2C_FLAG_ADDR地址匹配(从模式)( c: h7 X2 ^' ^  j+ ?# U
  360. *I2C_FLAG_AF收到确认失败标志
    $ K! g! z: }* A' Z7 U9 \7 d5 x
  361. *I2C_FLAG_STOPF停止检测标志- l1 o+ y$ ?4 P* O! L: @" l
  362. *I2C_FLAG_BERR总线错误, P$ J' c2 j" a$ h9 m  k% V
  363. *I2C_FLAG_ARLO仲裁丢失
    8 c" Z5 m0 t- i- B3 Y5 r
  364. *I2C_FLAG_OVR超限/不足
    $ S% T) i) Y& N* e4 v
  365. *I2C_FLAG_PECERR接收中的PEC错误
    3 d$ }3 @3 j+ \/ o0 }* v5 V5 O
  366. *I2C_FLAG_TIMEOUT超时或低速检测标志1 b4 r- K4 n" `" f6 Y4 J
  367. *I2C_FLAG_ALERTSMBus警报
    % F5 y/ I( C: ~7 S/ p
  368. */
    6 J* O* O8 X. H( W
  369. #define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__FLAG__) == I2C_FLAG_TXE) ? ((__HANDLE__)->Instance->ISR |= (__FLAG__)) \
    * S' n( p, Z, t" J
  370.                                                                                  : ((__HANDLE__)->Instance->ICR = (__FLAG__)))# f9 R) E& U/ r9 X* O! v3 t
  371.   p- _. H& K  e' W
  372. /*启用指定的I2C外设。*/( }0 ^' P" @$ Q" D
  373. #define __HAL_I2C_ENABLE(__HANDLE__)                            (SET_BIT((__HANDLE__)->Instance->CR1,  I2C_CR1_PE))  S" Z$ |+ b# |& D! A- }

  374. 1 T+ s1 a  z0 l! \

  375. , F8 b9 V: X4 k
  376. /*禁用指定的I2C外设。*/
    ; F3 z  f2 f) ]) j
  377. #define __HAL_I2C_DISABLE(__HANDLE__)                           (CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE)). [6 u; H+ u4 a# w; K
  378. " t& t3 `9 i/ F# G3 l
  379. /*在从模式下生成一个非确认I2C外设。*/
    $ K( H8 {3 f% J6 g& u
  380. #define __HAL_I2C_GENERATE_NACK(__HANDLE__)                     (SET_BIT((__HANDLE__)->Instance->CR2, I2C_CR2_NACK))
    , a. k9 q( |! S& i

  381. ; C: H- |! i+ E& v6 `9 {

  382. " b1 Q: u9 V$ U% w

  383. : X9 i5 M. n# k% W

  384. ( R  X. c" \2 \7 E0 h
  385. /*初始化和取消初始化功能**********************************/
    - z  H. T  f; B
  386. HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);. n; D& _( D+ F% M0 j
  387. HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);" o9 ?5 J8 e. B8 e/ ]. }9 z; d
  388. void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);; p! w7 [* d8 D" z" x. |/ v& U
  389. void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);' \7 X3 `* x8 R0 m* @/ H# w' B
  390. 3 p6 F( ]/ A0 N7 F& a8 G5 o5 O1 E, I" r
  391. /*回调注册/取消注册功能***********************************/$ h3 z! Z9 o* c3 v
  392. #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)0 w$ f8 J. z+ j$ d9 G
  393. 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 |
  394. HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID);' j5 w) }3 i/ y: h+ v* C
  395. : j$ N7 D# m$ @
  396. HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback);7 Q2 Z* Z" X2 Q3 M% W
  397. HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c);
    , q2 S6 Z" q: i8 }; g
  398. #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */, `. \# t8 Q. X3 f( Z& Q1 B  p

  399. " @' O. {4 L( z" e+ ]0 D3 x7 c0 Y

  400. / [* _. X' @- F- q
  401. /*输入和输出操作函数*/6 Z  M3 J( k% A& @% k
  402. /*IO操作功能****************************************************/
    " {  k. D* {4 n* |6 Q( m
  403. /*阻止模式:轮询*/
    . Z+ d# ]) k+ T+ S9 s$ k- c8 r
  404. 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
  405. 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
  406. 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
  407. 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 ^
  408. 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
  409. 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
  410. HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);
    - _: x& o" W# Q7 K9 j

  411. 3 |) z3 {! b6 T* ^' {
  412. /*非阻塞模式:中断*/
    ' [0 q6 J* e# J1 c
  413. 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
  414. 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
  415. 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
  416. 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
  417. 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
  418. 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: `

  419. 6 X$ h! u9 G9 P* h1 M
  420. 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
  421. 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
  422. 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
  423. 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
  424. HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);) z: P( r1 A  z  X: W
  425. HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);
    ; U7 x: M  |1 h4 Z' w2 `
  426. HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);! }( C2 |/ I* f2 J, s3 B' I

  427. 0 [1 n; n" S9 Y; C7 \1 v9 v2 H- P  b
  428. /*非阻塞模式:DMA*/
    2 n$ x+ ^7 [" T! o, i8 B$ f; w* }% L
  429. 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
  430. 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
  431. 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
  432. 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
  433. 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
  434. 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
  435. : N1 y7 _" j# n1 C
  436. 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
  437. 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 ]
  438. 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
  439. 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
  440. - q, I1 r7 l9 ?# {  M# J7 s! c

  441. ! z) Y, C7 M" ?7 R6 L, I
  442. /*在非阻塞模式(中断和DMA)中使用的I2C IRQHandler和回调*/
    2 i5 j; S. {# L
  443. void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c);
    . x' _, a6 c: X
  444. void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c);
    3 w! C- n* X. L2 Y4 f8 ~. r
  445. void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
    & |7 k4 O! `; b  r. Q
  446. void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
    / U6 J* H" D( Y6 K3 X
  447. void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c);
    6 G$ |1 l8 S* B$ z1 v  @
  448. void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c);4 ?# \* y0 H- x3 I
  449. void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);+ E7 v# v5 G% [% _- i
  450. void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c);$ k' [8 j, Q4 H. y
  451. void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);# u( j8 V+ n* u5 X; @
  452. void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
    + N; J& j+ \  w2 K5 u
  453. void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);. g8 f  o4 ]2 {8 u  v! C5 b  h. n
  454. void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);. H. p5 c5 u* ^
  455. , `2 E& r* u$ Y# i" J7 `
  456. 8 b2 D: t' \7 ]2 C2 i3 `
  457. /*外围状态,模式和错误功能*********************************/
    # `- a  H( D5 W- u+ {! a1 w
  458. HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c);+ J0 ~% r7 q! K* I6 h" _9 m
  459. HAL_I2C_ModeTypeDef  HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c);
    8 o. L7 f0 Y7 |7 W$ y. p
  460. uint32_t             HAL_I2C_GetError(I2C_HandleTypeDef *hi2c);
    # r' M3 k+ B: R, O* w

  461. & A6 _2 D/ _5 j3 E' h
  462. & P( F' n. ^4 m% l  T: m! w
  463. 3 Q7 ]" [4 D. \8 G

  464. 4 S2 H, `# e% s
  465. /*I2C专用宏*/+ X4 X) V) K# }5 k+ N5 ^
  466. #define IS_I2C_ADDRESSING_MODE(MODE)    (((MODE) == I2C_ADDRESSINGMODE_7BIT) || \/ f0 @# v  e1 P
  467.                                          ((MODE) == I2C_ADDRESSINGMODE_10BIT))% S5 ^; |8 C* U  J

  468. ( o! w6 q& K! I' n
  469. #define IS_I2C_DUAL_ADDRESS(ADDRESS)    (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \) C, R2 p- [/ ~3 W9 @' h
  470.                                          ((ADDRESS) == I2C_DUALADDRESS_ENABLE))
    3 Z( ~/ |$ K$ R
  471. , l& h1 Y8 S* |* a. y2 W
  472. #define IS_I2C_OWN_ADDRESS2_MASK(MASK)  (((MASK) == I2C_OA2_NOMASK)  || \, X) m4 D/ s( T3 w
  473.                                          ((MASK) == I2C_OA2_MASK01) || \& T% r& K- I0 Y; g5 `7 q
  474.                                          ((MASK) == I2C_OA2_MASK02) || \
    3 I9 q3 j: x, y1 J5 Z1 R2 X
  475.                                          ((MASK) == I2C_OA2_MASK03) || \8 U' D! t2 V0 U7 t' j% a# L0 }
  476.                                          ((MASK) == I2C_OA2_MASK04) || \3 l2 u  j" ]$ K9 r* C* t+ ~
  477.                                          ((MASK) == I2C_OA2_MASK05) || \) g6 w  h$ y/ Q2 r& p1 ~
  478.                                          ((MASK) == I2C_OA2_MASK06) || \
    % M5 f5 {" c+ d8 o9 B7 B, A! E
  479.                                          ((MASK) == I2C_OA2_MASK07))
    & D2 Q& B2 U, P2 Z% D
  480. * l, `7 z( j. ?% \8 p
  481. #define IS_I2C_GENERAL_CALL(CALL)       (((CALL) == I2C_GENERALCALL_DISABLE) || \2 S/ H. Z( J& [9 K
  482.                                          ((CALL) == I2C_GENERALCALL_ENABLE))) [  D1 y1 v5 c$ l; }$ D9 a- G/ `2 n
  483. ! J2 W0 j0 o+ W) i% L6 @
  484. #define IS_I2C_NO_STRETCH(STRETCH)      (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \$ D+ L' E! w4 T. S! v
  485.                                          ((STRETCH) == I2C_NOSTRETCH_ENABLE))1 n& T! Q% X5 ~9 M6 y  D2 o6 C. ~
  486. , \2 _& R$ U8 l& [9 j& B- Y
  487. #define IS_I2C_MEMADD_SIZE(SIZE)        (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \
    ) v: M4 O. {5 p/ r
  488.                                          ((SIZE) == I2C_MEMADD_SIZE_16BIT))' B. Y, ?; J# c. ~4 {
  489. : k$ u% P. ^) h# y! g
  490. #define IS_TRANSFER_MODE(MODE)          (((MODE) == I2C_RELOAD_MODE)   || \
    ) N1 M" b# ?4 w( Q
  491.                                          ((MODE) == I2C_AUTOEND_MODE) || \" K2 L) S; T) d
  492.                                          ((MODE) == I2C_SOFTEND_MODE))
    1 p6 @* X- z( e  d# O
  493. % {( T9 u+ A. `7 M. _! ^3 g
  494. #define IS_TRANSFER_REQUEST(REQUEST)    (((REQUEST) == I2C_GENERATE_STOP)        || \
    0 d8 ]: b2 _. X1 x' A7 \+ H7 }2 e5 n
  495.                                          ((REQUEST) == I2C_GENERATE_START_READ)  || \2 l% [+ J3 e! z* F4 b$ h0 ?$ S: k6 [
  496.                                          ((REQUEST) == I2C_GENERATE_START_WRITE) || \% c- p/ n9 y+ C0 o. ?( p- ^
  497.                                          ((REQUEST) == I2C_NO_STARTSTOP))1 M7 S  G. j7 S$ N9 }5 R3 S
  498. $ @$ P/ j+ a* i" W2 E4 P
  499. #define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST)  (((REQUEST) == I2C_FIRST_FRAME)          || \
    ) ]- M9 b& R$ T1 S1 {) G
  500.                                                    ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \
    ( F' L8 Y) g' E  V0 V8 C
  501.                                                    ((REQUEST) == I2C_NEXT_FRAME)           || \1 i( H! x1 e8 m# W
  502.                                                    ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \
    ; {2 S  Q; `5 m7 l- E% O' ^
  503.                                                    ((REQUEST) == I2C_LAST_FRAME)           || \  O" w! \7 S4 l1 Z; R, D! K
  504.                                                    ((REQUEST) == I2C_LAST_FRAME_NO_STOP)   || \! ?9 V7 [' a7 V# t( G
  505.                                                    IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST))
    7 `5 r- t" }7 O% q$ N
  506. ! M9 X1 Y6 x" r) J2 J' L* {
  507. #define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME)     || \- B" O5 q3 c2 U) j5 g& A
  508.                                                         ((REQUEST) == I2C_OTHER_AND_LAST_FRAME))! D+ p" F; h3 ]2 c. q' a4 c. ]
  509. 7 ^; _; {# R5 Y6 k
  510. #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

  511. & r$ |" R5 O$ T1 M( n
  512. #define I2C_GET_ADDR_MATCH(__HANDLE__)            ((uint16_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_ADDCODE) >> 16U))
    6 }# n6 |& I4 f) U7 F
  513. #define I2C_GET_DIR(__HANDLE__)                   ((uint8_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_DIR) >> 16U))* u1 ]# P4 U) @/ c- b, T
  514. #define I2C_GET_STOP_MODE(__HANDLE__)             ((__HANDLE__)->Instance->CR2 & I2C_CR2_AUTOEND)
    1 p* a  z4 r- U2 K+ J& x$ E
  515. #define I2C_GET_OWN_ADDRESS1(__HANDLE__)          ((uint16_t)((__HANDLE__)->Instance->OAR1 & I2C_OAR1_OA1)), o; u- y# c- V6 M  n/ K  O# ?
  516. #define I2C_GET_OWN_ADDRESS2(__HANDLE__)          ((uint16_t)((__HANDLE__)->Instance->OAR2 & I2C_OAR2_OA2))* m# o/ c# w7 e5 M) t
  517. 3 G% J2 B& b) Y5 ]: \7 E
  518. #define IS_I2C_OWN_ADDRESS1(ADDRESS1)             ((ADDRESS1) <= 0x000003FFU)& s& B1 m4 n) b
  519. #define IS_I2C_OWN_ADDRESS2(ADDRESS2)             ((ADDRESS2) <= (uint16_t)0x00FFU)! J! X: h3 B5 k& \$ J5 {! h
  520. 8 g' m8 t- Q* ]4 a9 e7 [
  521. #define I2C_MEM_ADD_MSB(__ADDRESS__)              ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0xFF00U))) >> 8U)))
    ) b$ \" F6 M, B9 c$ X6 K
  522. #define I2C_MEM_ADD_LSB(__ADDRESS__)              ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU))))
    - T# }6 m* c, k# j3 n( y

  523. # m' ~1 q9 A0 S! f; a7 C, b0 r+ T
  524. #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
  525.                                                           (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

  526. # n# D$ E2 V7 e! m6 f  V/ v
  527. #define I2C_CHECK_FLAG(__ISR__, __FLAG__)         ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)
    ( Y- j; s3 N& j0 m, q
  528. #define I2C_CHECK_IT_SOURCE(__CR1__, __IT__)      ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET)4 {+ l" Z: u2 N) j8 h! T+ g

  529. 4 e/ e0 z% a2 J
复制代码
5 k/ k* G- e& Q

$ d, `) {; {4 o% W( N/ T' f$ ~5 n: H( A! Y
收藏 1 评论0 发布时间:2020-3-22 07:29

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版