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

NUCLEO_L552ZE_Q+HAL的I2C库(第五篇)

[复制链接]
qbwww 发布时间:2020-3-22 07:29
这个I2C库的资料也整理好了。有需要的看一看吧。这是用cube生成的文件整理的。Hal的库。
8 i% c# @, J! l+ u0 T& U+ C9 i4 X) U' q
  1. /*I2C配置结构定义*/
    " |' E! @4 S1 `$ A; t, r
  2. typedef struct2 \  ~' G; E6 U+ }
  3. {% L7 o) p6 R5 h7 ?! c) i8 x
  4. uint32_t Timing;                  /*指定I2C_TIMINGR_register值。该参数通过参考I2C初始化计算得出*/! c* D' v# l4 H9 m0 w3 ~
  5.   n/ i" X) a( E1 H$ R! T
  6. uint32_t OwnAddress1;         /*指定第一个设备自己的地址。此参数可以是7位或10位地址。*/5 v+ |- C! b) h$ d" T" d8 b8 x
  7. $ a0 F, s' Y  U
  8.   uint32_t AddressingMode;  /*指定是选择7位还是10位寻址模式。此参数可以是I2C_ADDRESSING_MODE*/的值
    ) z6 {  z( L" _% @' e
  9. + u0 ^* ]8 M8 n; O4 I4 K! V! r* P
  10. uint32_t DualAddressMode; /*指定是否选择双重寻址模式。此参数可以是I2C_DUAL_ADDRESSING_MODE*/5 a  w1 I7 B2 d1 w5 k: y, z

  11. 9 C! `7 t5 M* l  \7 T
  12. uint32_t OwnAddress2;        /*如果选择双寻址模式,则指定第二个设备自己的地址此参数可以是7位地址。*/
    2 y( v" [$ I, [; P+ k. a$ W
  13. * u0 [' H/ ^# {" C. w8 J* F
  14. uint32_t OwnAddress2Masks;/*如果选择双重寻址模式,则指定确认掩码地址第二个设备自己的地址,此参数可以是I2C_OWN_ADDRESS2_MASKS的值*/# y* r3 o8 l5 }9 ^7 N- c/ ~, K" e

  15. ! R" r% q1 f$ {
  16. uint32_t GeneralCallMode;   /*指定是否选择常规呼叫模式。此参数可以是I2C_GENERAL_CALL_ADDRESSING_MODE的值*/
    4 w4 t& Q) a7 g
  17. ( |0 y! z" a/ y6 B8 q8 ^8 g) B
  18. uint32_t NoStretchMode;     /*指定是否选择nostretch模式。此参数可以是I2C_NOSTRETCH_MODE的值*/- L6 z% f# _- }+ R9 p
  19. 9 l6 q* ~  w6 B. F5 V8 N& u
  20. }I2C_InitTypeDef;  R' a7 A0 g, Y0 c' |( Y8 n5 J
  21. % X6 ]" G1 O4 K1 H* D1 |& ~

  22. : g9 q0 o; p, O) O) S$ \1 k+ @
  23. /*HAL状态结构定义
    7 D% d3 P0 f  L1 G/ J0 @
  24. *HALI2C状态值编码遵循下面描述的位图:\n
    " s( @' t" N) |' W8 l5 C
  25. *                b7-b6错误信息\n
    & v# w7 q  j; g) k9 Z. X
  26. *                00:无错误\n4 z% I- b+ W7 k
  27. *                01:中止(正在进行中的用户请求中止)\n
    3 ]( o* U! _! a' h4 Q3 \( A2 ^# S
  28. *                10:超时\n
    0 ~3 ^! K" M1 ^: V
  29. *                11:错误\n" F9 n- y4 t5 ]% ?) h6 E$ d
  30. *                b5 外围设备初始化状态\n" O: l+ E5 F9 e- S* c# ^& C8 m9 g
  31. *                0:重置(外围设备未初始化)\n
    " H9 ^% o  N. i
  32. *                1:已完成初始化(已初始化外围设备并准备使用。已调用HALI2CInit函数)\n
    6 L& z: t8 f, i% s  f
  33. *                b4(未使用)\n$ b  b( k$ `* P3 B1 h
  34. *                x:应设置为0\n4 B) v9 A5 |9 C% j% G+ Y
  35. *                b3\n
    $ t0 a( Y% z3 o* ^7 U
  36. *                0:就绪或忙碌(无监听模式正在进行中)\n+ p9 w% C9 R( N2 n3 t
  37. *                1:监听(地址监听模式中的外围设备)\n3 C# ~8 u, M3 g7 H3 p" m9 ~. b0 \
  38. *                b2内部过程状态\n" k0 J/ ^5 k7 ]. e: A8 ]
  39. *                0:就绪\n5 P; e% }1 r& p$ e8 W$ o* ~9 t
  40. *                1:忙(外围设备忙于某些配置或内部操作)\n
    : g! v, c$ b; r8 L) y! h
  41. *                b1接收状态\n
    3 t! m! b$ n: u& J
  42. *                0:就绪(无正在进行的接收操作)\n
    5 L; r, E: N# m5 T2 s
  43. *                1:忙(正在进行Rx操作)\n, e! i; }/ M, {- _& L
  44. *                b0Tx状态\n
    ' s( e& r; G$ F  }0 [
  45. *                0:就绪(没有正在进行的发送操作)\n
    4 z) k4 }% V( U+ f
  46. *                1:忙(正在进行发送操作)0 R7 p4 N6 u1 ^( j6 T% N

  47. : ^4 j, C! y1 \" x
  48. */
    3 _; b( G/ p% _+ D6 ^7 z
  49. typedef enum
    3 H6 _! c3 [" ]
  50. {
    & o! c8 \+ [. j" g" e
  51.         HAL_I2C_STATE_RESET             = 0x00U, /*外围设备尚未初始化*/
    " h1 G1 V; f6 p4 u
  52.         HAL_I2C_STATE_READY             = 0x20U, /*已初始化外围设备并准备使用*/3 y* Z; ~$ [+ _1 c# B7 W
  53.         HAL_I2C_STATE_BUSY              = 0x24U, /*内部进程正在进行*/! `- B4 S, n" j# e/ O5 b
  54.         HAL_I2C_STATE_BUSY_TX           = 0x21U, /*数据传输过程正在进行*/5 G3 H3 K4 @1 @5 M0 r, D7 V
  55.         HAL_I2C_STATE_BUSY_RX           = 0x22U, /*数据接收过程正在进行*/
    9 [! Q! a1 ^1 J+ z: t
  56.         HAL_I2C_STATE_LISTEN            = 0x28U, /*地址监听模式正在进行*/1 f. N' k( s. B/ j# p
  57.         HAL_I2C_STATE_BUSY_TX_LISTEN    = 0x29U, /*地址监听模式和数据传输正在进行中*/
    9 b% E5 x5 j5 y/ h
  58.         HAL_I2C_STATE_BUSY_RX_LISTEN    = 0x2AU, /*地址监听模式和数据接收正在进行中*/
    % b: [5 g4 s5 L: g
  59.         HAL_I2C_STATE_ABORT             = 0x60U, /*正在中止用户请求*/
    9 O" S5 b8 N" z! I7 Q) O
  60.         HAL_I2C_STATE_TIMEOUT           = 0xA0U, /*超时状态*/" s2 O$ _4 i( P4 o; w" W0 [& y7 Z
  61.         HAL_I2C_STATE_ERROR             = 0xE0U  /*错误*// @$ s8 Q7 }8 e' }; q

  62. * g, O# W' t, k
  63. }HAL_I2C_StateTypeDef;
    ; k2 P3 }' o- j5 S/ j% a+ l& ?

  64. : w" j; K$ n% i- U$ ^( }2 U

  65. # w& Y( }2 }7 @/ A* G

  66. 0 q, _! {! m6 m; Z8 X
  67. /*HAL模式结构定义
    ; L" K( S" V) l
  68. *HALI2C模式值编码遵循下面描述的位图:\n
    0 d; O  y- Q' \( W8 L! [
  69. *                b7(未使用)\n
    % f) K  D+ ?. P
  70. *                x:应设置为0\n
    5 \8 B; p  L5 v; Z$ s4 J) T% ~
  71. *                b6\n- y, r$ c( B; R% t" T7 y& b4 d& L) }
  72. *                0:无\n
    & ], x) h( M9 M+ l
  73. *                1:内存(HALI2C通信处于内存模式)\n% ?0 v7 D  F8 X$ d) \
  74. *                b5\n
    + t% o: E$ w( L+ c$ F6 m
  75. *                0:无\n
    : O1 o! n; r9 a. A# F+ W- L
  76. *                1:从站(HALI2C通信处于从站模式)\n0 n9 F) N; U0 Z2 _+ v) q! b
  77. *                b4\n7 `* K; R2 X. f' \% ^5 w. r
  78. *                0:无\n6 Q: L3 \7 n2 U
  79. *                1:主机(HALI2C通讯处于主机模式)\n! v' s, q3 x7 M& a4 f" @5 v) e, C& q
  80. *                b3-b2-b1-b0(未使用)\n
    8 K% b+ k4 _9 K# O) A
  81. *                xxxx:应设置为0000& g; L& f' v4 E" h
  82. , \6 j3 t7 d' p# r
  83. */
    4 `& E6 x; P# m6 c0 d) c2 o
  84. typedef enum
    , v7 N9 i/ _; H# a: h6 o5 N
  85. {
    + R( z) Q4 Y3 C0 {  m4 b% J& T7 @3 R$ v
  86. HAL_I2C_MODE_NONE               =0x00U, /*进行中没有I2C通信*/
    ) {0 S5 E9 I' h( N% `
  87. HAL_I2C_MODE_MASTER                                =0x10U,/*I2C通讯处于主模式*/
    : K8 x  d5 `' u2 x1 J
  88. HAL_I2C_MODE_SLAVE                                =0x20U,/*I2C通信处于从模式*/# T3 B5 j# W0 @, s: R- I/ y
  89. HAL_I2C_MODE_MEM                                =0x40U  /*I2C通信处于内存模式*/
    ! `0 a9 r# }+ L2 w# i- h1 q

  90. # N, a0 J& N* @+ ]' Q
  91. }HAL_I2C_ModeTypeDef;
    ( S$ M, q1 H# D# |0 N9 A5 J- R
  92. 2 @' V8 K; A; s. H% ~, P, x
  93. 1 A/ ]2 x  M/ l+ u5 ~; t

  94. 4 q. N+ _1 ^# F# Z& |
  95. /*的I2C错误代码定义*/5 I0 u0 Q* a4 ^* e- L
  96. #定义HAL_I2C_ERROR_NONE                (0x00000000U)        /*没有错误*/7 U0 F. c$ t, H* q+ j
  97. #定义HAL_I2C_ERROR_BERR                (0x00000001U)        /*错误错误*/
    - K6 q) N; O- M1 |
  98. #定义HAL_I2C_ERROR_ARLO                (0x00000002U)        /*ARLO错误*/
    " B& c* `2 r0 y8 P% }) D
  99. #定义HAL_I2C_ERROR_AF                        (0x00000004U)        /*ACKF错误*/
    5 C! Z' Y8 Y5 v' s( \
  100. #定义HAL_I2C_ERROR_OVR                        (0x00000008U)        /*OVR错误*/4 F. K& `% a  o" H
  101. #定义HAL_I2C_ERROR_DMA                        (0x00000010U)        /*DMA传输错误*/  J: C6 q9 U& E. r/ x2 z/ \6 o
  102. #定义HAL_I2C_ERROR_TIMEOUT                (0x00000020U)        /*超时错误*/
    ( |3 M* z% V% S$ g+ L
  103. #定义HAL_I2C_ERROR_SIZE                (0x00000040U)        /*大小管理错误*/3 F8 z* i- B2 X7 C. e
  104. #定义HAL_I2C_ERROR_DMA_PARAM        (0x00000080U)        /*DMA参数错误*/. q2 O: p0 j- p5 i
  105. #if(USE_HAL_I2C_REGISTER_CALLBACKS==1)
    ; \4 ~. C/ D' v4 W  A
  106. #define HAL_I2C_ERROR_INVALID_CALLBACK  (0x00000100U)  /*无效的回调错误*/% I- ~+ h1 S( e" C, S6 `
  107. #endif/*USE_HAL_I2C_REGISTER_CALLBACKS*/
      e2 ]5 K3 P0 e1 v- Q5 {
  108. #define HAL_I2C_ERROR_INVALID_PARAM     (0x00000200U)  /*无效参数错误*/# _0 O. d+ L; P4 K* p

  109. # z" p  U5 F% v# I5 R2 N0 R# k) Y

  110. 1 f+ i. P+ E+ j% Y
  111. /*I2C句柄结构定义*/
    3 r$ H: l$ V3 D& h) X+ `% b
  112. typedef struct __I2C_HandleTypeDef
    # Q% U# ]  u% W
  113. {
    ' R0 A$ L3 V% T( r8 m+ {
  114. I2C_TypeDef                                *Instance;                        /*I2C注册基地址*/
    ' H' e. e- t% j! L4 \

  115. 8 F4 ~+ t6 ^  Z" u, Y1 ?& ?: F
  116. I2C_InitTypeDef                        Init;                                /*I2C通讯参数*/
    . v& E3 D/ o4 {" T$ p" z2 R+ v9 f

  117. ; b3 ^6 {! D/ @
  118. uint8_t                                        *pBuffPtr;                        /*指向I2C传输缓冲区的指针*/  s! i# F3 s" k9 r1 f
  119. ) e- h0 {8 V, b( x+ ?" d
  120. uint16_t                                XferSize;                        /*I2C传输大小*/
    % J. [% }" B6 a( B6 r- T$ S
  121. 8 j% X; h! G# a9 n
  122. __IOuint16_t                        XferCount;                        /*I2C传输计数器*/0 k/ i2 ~# Z4 X: @# ?0 g

  123. " k, w2 \- {8 M
  124. __IOuint32_t                        XferOptions;                /*I2C连续传输选项,此参数可以是I2C_XFEROPTIONS的值*/2 L  L& F" z5 `1 u: n
  125. 0 L) {: E+ H6 p7 N7 M0 `
  126. __IOuint32_t                        PreviousState;                /*I2C通信先前状态*/
    + Q7 N5 f. f- w+ G+ m$ H' ]! a
  127. $ t: O  k4 |. W2 v2 N
  128. HAL_StatusTypeDef(*XferISR)(struct__I2C_HandleTypeDef*hi2c,uint32_tITFlags,uint32_tITSources);/*I2C传输IRQ处理程序函数指针*/; U/ O. M! S9 j: h' r

  129. 5 o# v, v2 r2 z7 N; y; h
  130. DMA_HandleTypeDef                *hdmatx;                        /*I2CTxDMA句柄参数*/
    9 P8 p+ R( A( a: g) L! o
  131. " @4 {  w6 {$ p2 F- A& r
  132. DMA_HandleTypeDef                *hdmarx;                        /*I2CRxDMA句柄参数*/
    $ K3 {# m, n4 ]7 e  R" d' g2 e# O( i

  133. / A8 q) M$ Q' o
  134. HAL_LockTypeDef                        Lock;                        /*I2C锁定对象*/
    4 w+ A9 Z) T, D$ L/ M

  135. 4 m4 o+ I1 G5 o+ J: S) }  c' D, T
  136. __IOHAL_I2C_StateTypeDef         State;                /*I2C通讯状态*/
    ) s1 h$ Q. F5 ?+ z* s

  137. 7 }2 H1 X8 C2 j  s
  138. __IOHAL_I2C_ModeTypeDef                Mode;                /*I2C通讯模式*/
    $ h( S. s5 l/ O8 [5 |- \2 x

  139.   E. @  {, J3 u/ f8 T- ]; Z: t
  140. __IOuint32_t                        ErrorCode;                /*I2C错误代码*/. ]: n1 i# R: B8 O* ^* r" [

  141. 2 }$ ^# ^0 @, A5 W" t" |) |
  142. __IOuint32_t                        AddrEventCount;/*I2C地址事件计数器*/
    7 v7 D8 E5 F: a. F6 _

  143.   _9 f4 L- P$ J0 P4 T7 n9 I
  144. #if(USE_HAL_I2C_REGISTER_CALLBACKS==1)
    ) S4 c& {# P8 y% ]! M
  145. / d  |: C/ K8 I1 @* _) p: k' R
  146. void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);         /*I2C主Tx传输完成的回调*/
    , ?) _) w' t" t$ \
  147. void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);    /*I2C主Rx传输完成的回调*// G# @7 m: j# q
  148. void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);         /*I2C从机Tx传输完成回调*/
    * R$ v' }& n# f2 V, f
  149. void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);     /*I2C从Rx传输完成回调*/7 J% |6 u# D/ x2 i; Z5 m2 g5 Z
  150. void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c);            /*I2C监听完成回调*/
    9 x9 e8 K2 [, l0 K9 K
  151. void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);                  /*I2C内存发送传输完成回调*/: m/ N. M2 o  h! g* G
  152. void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2C内存接收传输完成回调*/' J/ O$ ^# l2 X1 U$ H  g8 b, }+ W
  153. void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c);                          /*I2C错误回调*/+ H8 X4 x* p$ G2 z
  154. void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2C中止回调*/! Y4 [6 n2 g: j, f+ B2 o
  155. void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*I2C从站地址匹配回调*/
    2 X  y4 a' L  J: K# U
  156. void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2CMsp初始化回调*/7 I; Q3 j# U. z
  157. void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2CMspDeInit回调*/
    : k1 @1 |" I5 C

  158. ) M7 r9 I" I- a. u
  159. #endif/*USE_HAL_I2C_REGISTER_CALLBACKS*/, w! [+ r8 d+ d" `! q+ I+ m
  160. }I2C_HandleTypeDef;
    . e' X+ z- A. _. Q2 R, |$ H

  161. - l8 N; m: R( g2 K; {; h
  162. 4 H+ Y. N4 F( T/ ?
  163. /*HALI2C回调ID枚举定义*/
    3 n% s1 U7 u# a5 S6 k
  164. typedef enum# [4 s! O# K1 T1 G
  165. {
    & |# O4 ]' K' T+ e' @
  166. HAL_I2C_MASTER_TX_COMPLETE_CB_ID        =0x00U,        /*I2C主Tx传输完成的回调ID*/% |2 o$ ]5 b6 a
  167. HAL_I2C_MASTER_RX_COMPLETE_CB_ID        =0x01U,        /*I2C主Rx传输完成的回调ID*/9 E0 q5 c0 K6 s0 h$ ~1 A
  168. HAL_I2C_SLAVE_TX_COMPLETE_CB_ID                =0x02U,        /*I2C从机Tx传输完成的回调ID*/0 z1 y" e* X2 y8 Z7 k, x* F
  169. HAL_I2C_SLAVE_RX_COMPLETE_CB_ID                =0x03U,        /*I2C从站Rx传输完成的回调ID*/' R  J8 H8 }: ^5 ^% k& ?
  170. HAL_I2C_LISTEN_COMPLETE_CB_ID                =0x04U,        /*I2C监听完成回调ID*/
    % k1 h/ d6 F, ?4 c( a' M
  171. HAL_I2C_MEM_TX_COMPLETE_CB_ID                =0x05U,        /*I2C内存Tx传输回调ID*/
    4 N5 G. d- Z6 w3 q; L$ x: y6 R# ^4 t
  172. HAL_I2C_MEM_RX_COMPLETE_CB_ID                =0x06U,        /*I2C内存接收传输完成的回调ID*/
    . f% S/ Z$ X/ T9 R9 N/ @  l! r$ R
  173. HAL_I2C_ERROR_CB_ID                                        =0x07U,        /*I2C错误回调ID*/% l7 G0 m% k8 C5 t* Q7 @
  174. HAL_I2C_ABORT_CB_ID                                        =0x08U,        /*I2C中止回调ID*/% c; r' t/ F  }' [6 l) ^% c4 x8 c& ~
  175. HAL_I2C_MSPINIT_CB_ID                                =0x09U,        /*I2CMsp初始化回调ID*/
    ) J4 X# h. g+ {! z" ~- ~, h
  176. HAL_I2C_MSPDEINIT_CB_ID                                =0x0AU                /*I2CMspDeInit回调ID*/8 Y; i4 W/ S* L- b% g! ~
  177. }HAL_I2C_CallbackIDTypeDef;
    # R7 u: t! \+ e- u3 P; A

  178. % o( M: e2 K4 V5 O" }
  179. /*HALI2C回调指针定义*/& N1 \- j* O+ A0 b) V
  180. typedef  void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*指向I2C回调函数的指针*/
    # E. ?8 E! [- \9 O  A: r
  181. typedef  void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*指向I2C地址匹配回调函数的指针*/, a/ Y& k1 Q! v$ T- I

  182. 0 W0 z5 F* G2 Z) O8 }7 \

  183. . N) }3 G/ K8 N
  184. /*I2C顺序传输选项*/* r: M# T# u* p
  185. #define I2C_FIRST_FRAME                 ((uint32_t)I2C_SOFTEND_MODE)1 d- l9 Y# W$ B$ k: U1 H/ V
  186. #define I2C_FIRST_AND_NEXT_FRAME        ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))+ y7 G5 Q9 T3 l! O4 ~8 S( b. \
  187. #define I2C_NEXT_FRAME                  ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))
    . @; N# g9 ?& a( R" i6 q# v, {9 ?! ]- E
  188. #define I2C_FIRST_AND_LAST_FRAME        ((uint32_t)I2C_AUTOEND_MODE)) O% y4 q/ Y7 }
  189. #define I2C_LAST_FRAME                  ((uint32_t)I2C_AUTOEND_MODE)1 N8 U1 Y4 ^6 V9 ]
  190. #define I2C_LAST_FRAME_NO_STOP          ((uint32_t)I2C_SOFTEND_MODE)' l0 v- t$ O3 w7 O' z
  191. & h2 _4 G1 z3 p+ C- V6 j9 l' k
  192. 4 l  [; F1 L& I8 H  n3 ^) l4 k
  193. /*I2C寻址模式*/  V; e( D/ Q- a& L. [. S: ^4 c
  194. #define I2C_ADDRESSINGMODE_7BIT         (0x00000001U)
    ) B$ b8 f, J# Y' v9 e
  195. #define I2C_ADDRESSINGMODE_10BIT        (0x00000002U)1 x7 m, c, t6 _5 ~0 o
  196. & I: u, b' O5 k& R: ]1 t7 n" c3 J6 w
  197.   A9 p3 A# f' E. L
  198. /*I2C双寻址模式*/
    $ F4 \) a9 E1 q- q0 H
  199. #define I2C_DUALADDRESS_DISABLE         (0x00000000U)
    ( u$ Q% p0 u9 k% t4 e. N% L0 ?
  200. #define I2C_DUALADDRESS_ENABLE          I2C_OAR2_OA2EN
    $ q5 `- C' g7 k% v# w

  201. ' S  T+ |" z- a9 R2 Q/ `7 F; K
  202. 5 `4 U: ]7 O' c+ b
  203. /*I2C自己地址的2个掩码*/  j6 j5 i/ o6 c7 j8 l3 {4 z( d( k7 w
  204. #define I2C_OA2_NOMASK                  ((uint8_t)0x00U)+ L5 R1 O7 B  P  P; a3 P# @
  205. #define I2C_OA2_MASK01                  ((uint8_t)0x01U)
    3 d) E* X4 H& }3 U- x, e8 [8 w$ W: j
  206. #define I2C_OA2_MASK02                  ((uint8_t)0x02U)* V! z/ L$ O& e/ _
  207. #define I2C_OA2_MASK03                  ((uint8_t)0x03U)  X' `3 w: F! ^* O( U
  208. #define I2C_OA2_MASK04                  ((uint8_t)0x04U)
    ! J$ r7 p8 w9 I1 C) s, O
  209. #define I2C_OA2_MASK05                  ((uint8_t)0x05U)
    . b. U- i/ J# H
  210. #define I2C_OA2_MASK06                  ((uint8_t)0x06U)% q1 e: \" G8 t6 U: |+ i: i
  211. #define I2C_OA2_MASK07                  ((uint8_t)0x07U)/ i0 i7 D+ W- v3 [4 Q8 y

  212. 7 c2 j; K8 J2 r- @, e. Q% z* U

  213. 1 ~( E2 H4 e& T: ~+ ~
  214. /*I2C常规呼叫寻址模式*/
    ; v/ ?% r& o5 k& d! Z& V
  215. #define I2C_GENERALCALL_DISABLE         (0x00000000U)2 z0 [/ |/ H; c
  216. #define I2C_GENERALCALL_ENABLE          I2C_CR1_GCEN; B, h  ?; k# J% T3 P* |# B
  217. $ S/ s7 x1 U' p
  218. + ~& `4 }! z5 W: {6 }
  219. /*I2C无拉伸模式*/
    5 Z) M+ r0 u, S" g8 t9 [6 }+ V" R
  220. #define I2C_NOSTRETCH_DISABLE           (0x00000000U); Y" e0 z* o$ r9 T
  221. #define I2C_NOSTRETCH_ENABLE            I2C_CR1_NOSTRETCH
    6 K) l# {$ n2 J" k

  222. 0 Q( Q% J/ O! I/ j. r# c
  223. + ^- W! T5 X5 h2 j8 t
  224. /*I2C内存地址大小*/
    ' F& _7 I6 G* C9 U% a' M; d8 T
  225. #define I2C_MEMADD_SIZE_8BIT            (0x00000001U)0 r$ v/ M/ X+ C* f7 J/ m7 C" S
  226. #define I2C_MEMADD_SIZE_16BIT           (0x00000002U)5 {( P$ N8 K! }8 u

  227.   u* e& u, G0 y

  228. ' w( `% d/ f6 n; l% x
  229. /*I2C传输方向主视点*/
    ( K5 O% H- z+ P5 E7 g
  230. #define I2C_DIRECTION_TRANSMIT          (0x00000000U)
    : j& J( n9 Z4 C* q
  231. #define I2C_DIRECTION_RECEIVE           (0x00000001U)! U* f8 B7 g; L$ z( Q' w' U

  232. ; Z! q- a& P" V9 Q
  233. % ]) K7 \: j; ?, }- N  v
  234. /*I2C重新加载结束模式*/
    8 A' j7 p* ~8 m1 h
  235. #define  I2C_RELOAD_MODE                I2C_CR2_RELOAD
    ( `4 J. N7 J. I6 V% p
  236. #define  I2C_AUTOEND_MODE               I2C_CR2_AUTOEND
    ( x0 [% C' P5 S4 g
  237. #define  I2C_SOFTEND_MODE               (0x00000000U). M9 m; l) L$ v8 {: |
  238. ) k+ w  p1 F* \8 C1 b0 U

  239. " y' b9 Y. \: U+ O+ v8 j
  240. /*I2C启动或停止模式*/7 X1 @) |* Q7 `1 N
  241. #define  I2C_NO_STARTSTOP               (0x00000000U)
    ) L. F4 k1 ?- {* C: m' i
  242. #define  I2C_GENERATE_STOP              (uint32_t)(0x80000000U | I2C_CR2_STOP)
    1 a& H+ P/ ^0 c2 `
  243. #define  I2C_GENERATE_START_READ        (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN)/ {/ L" @2 }5 L( l& ]! C
  244. #define  I2C_GENERATE_START_WRITE       (uint32_t)(0x80000000U | I2C_CR2_START)0 }2 A4 d' V$ d

  245. ' Z' d- P( a% o$ q1 ]* Q6 M
  246. 6 _- [; U' x  a. V* Y; K
  247. /*I2C中断配置定义*/
    . h! |  Z0 K. \- c
  248. #define I2C_IT_ERRI                     I2C_CR1_ERRIE
    & N: M$ U1 r  L% T8 H# |
  249. #define I2C_IT_TCI                      I2C_CR1_TCIE, P# Q* U1 I! }) E. q- W
  250. #define I2C_IT_STOPI                    I2C_CR1_STOPIE# J; R+ i2 Q/ k" m
  251. #define I2C_IT_NACKI                    I2C_CR1_NACKIE  T  s& N' p, B& m. ?) e
  252. #define I2C_IT_ADDRI                    I2C_CR1_ADDRIE2 W: @. q3 }+ E( J" Q' K
  253. #define I2C_IT_RXI                      I2C_CR1_RXIE
    & D/ U* v) w+ ^" a2 k: ^/ [' l
  254. #define I2C_IT_TXI                      I2C_CR1_TXIE' H5 \, u' V7 A

  255. 1 B0 g) G4 a, S  t/ f5 Q
  256. + ?9 K7 I& |+ c7 O2 c
  257. /*I2C标志定义*/
    9 U" J+ e; ^9 P6 _" \' M3 @
  258. #define I2C_FLAG_TXE                    I2C_ISR_TXE3 j0 H1 g) l: v& n
  259. #define I2C_FLAG_TXIS                   I2C_ISR_TXIS
    % h2 h8 s  T% E9 _
  260. #define I2C_FLAG_RXNE                   I2C_ISR_RXNE+ S7 B0 `- x5 u4 P0 t" p/ J
  261. #define I2C_FLAG_ADDR                   I2C_ISR_ADDR
    4 O- Z& W& n( Q& _1 C. p
  262. #define I2C_FLAG_AF                     I2C_ISR_NACKF1 w: o3 r1 ]/ X& G
  263. #define I2C_FLAG_STOPF                  I2C_ISR_STOPF
    + ]& B7 D* K& N+ h3 l$ v
  264. #define I2C_FLAG_TC                     I2C_ISR_TC) w  d9 m- r4 v& b! \
  265. #define I2C_FLAG_TCR                    I2C_ISR_TCR7 D% d8 f' f' O0 Y0 Z! _# @5 r9 m, m
  266. #define I2C_FLAG_BERR                   I2C_ISR_BERR( a, R$ I0 T/ L6 s  B
  267. #define I2C_FLAG_ARLO                   I2C_ISR_ARLO: @3 x  j& A; v6 W5 w0 Z  A, _
  268. #define I2C_FLAG_OVR                    I2C_ISR_OVR
    " J4 q/ {/ s1 |4 g1 B
  269. #define I2C_FLAG_PECERR                 I2C_ISR_PECERR7 m9 R/ `8 x: _0 D0 i2 n$ w8 B7 u
  270. #define I2C_FLAG_TIMEOUT                I2C_ISR_TIMEOUT" d: v+ l/ }8 }' [
  271. #define I2C_FLAG_ALERT                  I2C_ISR_ALERT
    ( B" z+ O0 i# K! u4 ~
  272. #define I2C_FLAG_BUSY                   I2C_ISR_BUSY3 M2 y, |( F" a6 V$ ?; Y
  273. #define I2C_FLAG_DIR                    I2C_ISR_DIR
    6 y2 o2 y- }9 U# S' \( P
  274. - ~, t% @1 b' K7 g& N, K1 i" R

  275. / n0 T& m: Z: N. |5 t

  276. * R+ S, o) a6 L, \3 T& K
  277. /*I2C句柄状态*/6 S6 h* o3 m  O9 `% i+ o8 S
  278. #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
    ) |2 s" R) {  Y/ X
  279. #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                do{                                                   \
    8 H$ N9 f' K) M, X( }) A
  280.                                                                     (__HANDLE__)->State = HAL_I2C_STATE_RESET;       \
    1 L1 ?! u+ P$ N. N$ |
  281.                                                                     (__HANDLE__)->MspInitCallback = NULL;            \
    3 g; w* v- o- I+ `
  282.                                                                     (__HANDLE__)->MspDeInitCallback = NULL;          \
    ; k0 U: S/ Y% y# C: j
  283.                                                                   } while(0)
    5 h7 h$ K5 d4 ]3 j9 ^6 p) }" q
  284. #else# B5 P+ D" n; c4 e7 L9 [6 u
  285. #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                ((__HANDLE__)->State = HAL_I2C_STATE_RESET)- F* J; r; R( c" b! y
  286. #endif
    5 z7 B4 V- U" O) M

  287. 1 N6 v4 o' i- D0 m5 @
  288. /*启用指定的I2C中断。
    1 A! k' C" c9 V! L$ q; i5 A, u
  289. *__HANDLE__指定I2C句柄。
    $ H/ b2 Z9 N- k* A% F4 }& _
  290. *__INTERRUPT__指定要启用的中断源。
    2 H- p9 n4 ^* s% G5 }( [- @
  291. *此参数可以是下列值之一:2 A' N; D) N( T4 G/ q$ H- ]! x
  292. *I2C_IT_ERRI错误中断
    % y9 a/ y" Y0 S; k1 Z# E
  293. *I2C_IT_TCI传输完成中断$ k0 A7 W# ]7 \  k$ T0 ^% X1 M
  294. *I2C_IT_STOPISTOP检测中断3 N4 q% n/ J. V# H! p) @+ m
  295. *I2C_IT_NACKINACK接收中断
    ! h! C; I& ~: S. n. B/ c
  296. *I2C_IT_ADDRI地址匹配中断
    2 {* O' h: F' |
  297. *I2C_IT_RXIRX中断
    $ ]+ l+ o. Z% [# @" M! w1 K
  298. *I2C_IT_TXITX中断
    % {4 i+ F5 n- Z! w+ p7 x" G
  299. */; q) [- w$ o/ L8 x/ s' L( t: [
  300. #define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__)          ((__HANDLE__)->Instance->CR1 |= (__INTERRUPT__))
    % T$ a: q+ G. R# F! d

  301. ' V& O4 T. Y5 N5 Z
  302. /*禁用指定的I2C中断。
    " ]+ y( ~: |% s" e; H* Q
  303. *__HANDLE__指定I2C句柄。
    / |: J! b0 I0 v" v+ p0 j
  304. *__INTERRUPT__指定要禁用的中断源。
    0 i8 h- p/ }$ k/ X4 n
  305. *此参数可以是下列值之一:
    ' @8 g# b# X1 M4 n/ [6 C  u
  306. *I2C_IT_ERRI错误中断
    " g" c# |7 o* u& E0 _: x# u
  307. *I2C_IT_TCI传输完成中断
    : R3 Q0 [% ]3 }5 r5 ^+ _% W
  308. *I2C_IT_STOPISTOP检测中断
    7 r& v* ?0 }+ d' J# t
  309. *I2C_IT_NACKINACK接收中断
    ! a6 v" z  D; I8 Q/ A
  310. *I2C_IT_ADDRI地址匹配中断
    $ u6 Q, D: q" s( ?
  311. *I2C_IT_RXIRX中断$ [+ ?! X* |# \- p1 ~. |: h2 E
  312. *I2C_IT_TXITX中断
    0 ?! }1 h% H& Y2 t" g. y
  313. */
    ) M) L; e; o8 U% |/ V  Y( R, Q; o
  314. #define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__)         ((__HANDLE__)->Instance->CR1 &= (~(__INTERRUPT__))); I) [- D) J- z4 p# `
  315. # K% l, x+ e8 n) M0 k
  316. /*检查是否启用了指定的I2C中断源。
    , g4 ]7 r" \! s1 g9 Q( _, n/ s
  317. *__HANDLE__指定I2C句柄。
    ( Y; [" y2 I: I+ Q! _
  318. *__INTERRUPT__指定要检查的I2C中断源。6 L- N# E  j  q5 t. f0 \0 U
  319. *此参数可以是下列值之一:
      {* V& o% |) G" P* k% C, }8 n
  320. *I2C_IT_ERRI错误中断
    + z  n) O$ m. f* X8 f7 U1 h& C0 o
  321. *I2C_IT_TCI传输完成中断0 d1 C$ O- @7 f
  322. *I2C_IT_STOPISTOP检测中断
    . h- i& c1 U7 E+ ?1 I) C- J+ L
  323. *I2C_IT_NACKINACK接收中断# v, k& ]( `6 M: i" P3 p
  324. *I2C_IT_ADDRI地址匹配中断
    2 [) H8 b/ E, a( L/ r
  325. *I2C_IT_RXIRX中断
    & `9 u8 @* u! S3 Y7 m/ r6 _
  326. *I2C_IT_TXITX中断/ w7 H7 |3 q, S. a9 D7 r, _' f8 W
  327. */5 j. \( k$ ^4 r# a
  328. #define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__)      ((((__HANDLE__)->Instance->CR1 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)8 P# r, z( G" V' ^* \9 a4 j

  329. " ~. L4 r6 q2 _5 O9 @1 X% C1 E' g
  330. /*检查是否设置了指定的I2C标志。
    6 u) B6 B0 c* V' z* \- _4 D% ~8 F8 ^# v) Y
  331. *__HANDLE__指定I2C句柄。" k4 }7 b. y6 {" `5 h. ]5 T
  332. *__FLAG__指定要检查的标志。/ F. R9 `8 Y; q
  333. *此参数可以是下列值之一:
    ; K7 j$ H3 V, e0 _. a# S2 m. W
  334. *I2C_FLAG_TXE发送数据寄存器为空4 G2 [; M* B" l+ u6 W% M! G, Q
  335. *I2C_FLAG_TXIS发送中断状态, c1 Y' Z4 l6 M% ~1 @
  336. *I2C_FLAG_RXNE接收数据寄存器不为空
    7 m9 ?* _+ F2 V
  337. *I2C_FLAG_ADDR地址匹配(从模式)
    * l" Y6 D7 w' g/ Z# ]
  338. *I2C_FLAG_AF收到确认失败标志; V) Z" N  f+ }# h  @
  339. *I2C_FLAG_STOPF停止检测标志
    / n+ c% @3 O+ s4 e  d; \8 x1 X
  340. *I2C_FLAG_TC传输完成(主模式)/ a: Z4 y2 ~  n' D6 f# K  \' p
  341. *I2C_FLAG_TCR传输完成重新加载/ d7 C  r9 U/ x3 X) S
  342. *I2C_FLAG_BERR总线错误
    ' E. F9 a$ v% ?4 T0 w
  343. *I2C_FLAG_ARLO仲裁丢失  {0 H, i7 p. T" w- B; g/ c: |
  344. *I2C_FLAG_OVR超限/不足
    % ?) E6 {7 j' W# g
  345. *I2C_FLAG_PECERR接收中的PEC错误2 X1 p2 Z1 i7 o' _: ~( S- A3 R
  346. *I2C_FLAG_TIMEOUT超时或低速检测标志
    8 Y5 m) U4 u- V7 T! @2 s1 U
  347. *I2C_FLAG_ALERTSMBus警报
    9 r: E5 O; z. f# x( L/ B
  348. *I2C_FLAG_BUSY总线忙$ {4 e; _/ Q2 D6 a6 g5 l
  349. *I2C_FLAG_DIR传输方向(从模式)( d: o  s9 p4 J4 N3 w5 |
  350. */# _- I( b, x$ a# Y  I. Q) V2 g7 l
  351. #define I2C_FLAG_MASK  (0x0001FFFFU)6 |/ U  c9 u& u. g' w& X
  352. #define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) (((((__HANDLE__)->Instance->ISR) & (__FLAG__)) == (__FLAG__)) ? SET : RESET)" O) x" ]# u) i! y

  353. + ?5 A$ z+ w2 o# q+ `
  354. /*清除I2C挂起标志,该标志通过在特定位写入1来清除。
    ( m& I* R! I: J
  355. *__HANDLE__指定I2C句柄。) r+ b) j/ D. R( }& O
  356. *__FLAG__指定要清除的标志。* J) G* k: T5 b8 k- g) t( b
  357. *此参数可以是以下值的任意组合:  l9 e& w) h" Q
  358. *I2C_FLAG_TXE发送数据寄存器为空3 }2 V0 S- D6 o- Q" L* A
  359. *I2C_FLAG_ADDR地址匹配(从模式)4 n' v  A( r( W& ]) A
  360. *I2C_FLAG_AF收到确认失败标志
    4 R+ G( R4 u: @; P! |) G) q' |# ~
  361. *I2C_FLAG_STOPF停止检测标志% p* u& U" l( v4 R& n; B4 [9 I$ J; ]
  362. *I2C_FLAG_BERR总线错误2 }  @6 z: ~# \: ^) C* S1 P
  363. *I2C_FLAG_ARLO仲裁丢失4 l0 r! N4 q8 l5 l7 A; ~
  364. *I2C_FLAG_OVR超限/不足
    0 p4 z  Y# o- y* a/ b
  365. *I2C_FLAG_PECERR接收中的PEC错误
    / ~' t/ p6 H. D" |" t* E% {3 i
  366. *I2C_FLAG_TIMEOUT超时或低速检测标志+ h) d/ m" L. [0 h6 R; j
  367. *I2C_FLAG_ALERTSMBus警报
    0 v" F- i5 C4 k+ o8 t; V  V7 h
  368. */. B( D0 x! D9 w, D
  369. #define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__FLAG__) == I2C_FLAG_TXE) ? ((__HANDLE__)->Instance->ISR |= (__FLAG__)) \! s2 F) R! A' l) F
  370.                                                                                  : ((__HANDLE__)->Instance->ICR = (__FLAG__)))
    * [/ R1 \, r+ m7 L0 H
  371. ( J5 c  ^( F, Q* a% L8 N+ _. X' T( Y
  372. /*启用指定的I2C外设。*/  _" Y- L# l1 j' a  b
  373. #define __HAL_I2C_ENABLE(__HANDLE__)                            (SET_BIT((__HANDLE__)->Instance->CR1,  I2C_CR1_PE))
    , S6 {4 I5 S: }: @
  374. 2 `5 ^2 n. F  E4 k! a

  375. * j8 j9 t: L$ Z8 P% J7 R: ]2 B6 P/ g
  376. /*禁用指定的I2C外设。*/
    * {3 o5 U# n( E
  377. #define __HAL_I2C_DISABLE(__HANDLE__)                           (CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE))
    0 R- x; b; t$ Y8 H
  378. ! E( {' I- a3 O  t
  379. /*在从模式下生成一个非确认I2C外设。*/
    " n* r6 m$ ?& M' s7 v
  380. #define __HAL_I2C_GENERATE_NACK(__HANDLE__)                     (SET_BIT((__HANDLE__)->Instance->CR2, I2C_CR2_NACK))1 f/ }3 {" `; [" N1 ?, ~

  381. % [. g( V( i- E1 M

  382. 7 q( F, [  ]5 [/ |  g, R9 V

  383.   E6 Q/ d7 l, [: Q" q

  384. : P2 R; T; N& b: J. z
  385. /*初始化和取消初始化功能**********************************/
    8 v2 o2 p! n+ K$ i
  386. HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);  d6 a9 T3 G0 J7 Q; X3 X
  387. HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);5 C- H2 j; f  Q4 j0 Y9 I0 ?( l, j
  388. void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);  Q8 \6 |( K) x4 L9 u2 d7 Z4 M; J
  389. void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);
    ' O3 N" y/ g+ E$ x3 Q) ?' f
  390. , s- U" j% k" ], ^0 c
  391. /*回调注册/取消注册功能***********************************/, D& u3 R, e& V/ W+ m
  392. #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)' d% L% I: }7 v' n) F* q
  393. HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback);: f# @1 Z% ^; C  I
  394. HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID);5 c$ U, u9 A* J! |6 K7 f

  395. : v. w8 }* t/ U: s# }
  396. HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback);
    2 U! e+ H( S  `0 t' B
  397. HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c);
    9 V; A2 n/ w7 |3 q3 s- T9 p: f8 ]8 h
  398. #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */! G+ F- [; Z& U
  399.   {1 ]' C6 h: }+ q$ n) {
  400. 6 r8 X0 G  k0 \! Z
  401. /*输入和输出操作函数*/' f+ f+ v) U1 R3 C6 ^2 w
  402. /*IO操作功能****************************************************/
    / v, f" X. Q7 v' P5 n1 v( `/ W
  403. /*阻止模式:轮询*/
    2 k/ c) {. H) m* B1 q4 W8 M
  404. 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
  405. 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
  406. 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
  407. 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
  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);  N2 d& E$ z, ]
  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);6 _0 M: F1 p. @. g; ^" E
  410. HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);( ]' F# l" U+ S! r- `

  411.   T% ^3 V* p9 B. q% C7 W
  412. /*非阻塞模式:中断*/
    6 c- t1 X* l  D: l' r2 T* X
  413. 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
  414. 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, _
  415. HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
    * ^" G; ~4 \& M
  416. 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
  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);
    + }) j6 V6 {7 v7 B. \% N
  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);
    % X, B- o, w6 T& z

  419. % I+ X4 }* ?4 g6 H
  420. 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
  421. 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
  422. HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);! x7 `* }- n; t  {
  423. 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
  424. HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);
    % [! ^- t2 k. U% _/ t% S; ]
  425. HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);
    * C- X$ R5 W/ W9 B( G; i) o
  426. HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);
    5 v% \( d1 f4 I- e

  427. 0 A5 D' g0 h8 D9 [9 l
  428. /*非阻塞模式:DMA*/: h, n# O$ l$ N2 Y/ z$ i8 A5 i* n
  429. 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
  430. 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
  431. HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
    ) M. N! N3 F$ n, Z9 O
  432. HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
    3 k1 L; g$ ?' g4 `8 o& s
  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);' ]+ y! T( ~' r# \, J" ^9 y
  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);* o9 F& }1 U3 I

  435. 7 }5 M+ l6 Z0 f) K$ u9 ~
  436. 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
  437. 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
  438. 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
  439. 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
  440. 4 s. Z; _; K, ?, C0 [2 q
  441. ( w3 R3 ]. ?9 q- E9 _
  442. /*在非阻塞模式(中断和DMA)中使用的I2C IRQHandler和回调*/9 ]: t7 g/ q& q' `# a
  443. void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c);
    1 V7 u; |( K" V% c/ U: D( o. h
  444. void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c);
    ; F7 u" D6 j; {1 I, `
  445. void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);1 P% ]  m$ f/ k  W+ n
  446. void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);) a- M$ I+ ^* r
  447. void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c);
    ) p3 i) n4 o, s; J0 F
  448. void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c);
    & l' y, B" ]% O
  449. void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);
    8 ^4 ?1 s& D* w
  450. void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c);5 Y" `5 v& U/ Q# u
  451. void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);
    4 {( L- _  p! ~2 ]
  452. void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);  v6 b6 ~; T6 ~
  453. void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);8 t+ M9 v7 M- ~4 [) V
  454. void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);8 c" u7 K, L3 c; b7 o" y. [- Y+ v

  455. ' \* t" y# r* |  l

  456. - c( ^* i; l( ^! A. f3 `: W( s/ }
  457. /*外围状态,模式和错误功能*********************************/. ]1 Q# \  {4 H; I( T6 a
  458. HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c);7 ?% B' W6 T+ [* O; H* {: ?& T9 p  k* f
  459. HAL_I2C_ModeTypeDef  HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c);
    - z7 d7 r5 f. c# V6 S+ x3 ^
  460. uint32_t             HAL_I2C_GetError(I2C_HandleTypeDef *hi2c);- U  Z) T- Y; t  N/ ?, \

  461. ) V. F9 A9 s8 j0 F% L( v
  462. : h) L; S* p, ~" x" e

  463. ! e: ]+ J% |( [

  464. : \- e9 K- a' O
  465. /*I2C专用宏*/7 p$ |# k  i1 _" W
  466. #define IS_I2C_ADDRESSING_MODE(MODE)    (((MODE) == I2C_ADDRESSINGMODE_7BIT) || \& B* ~: d2 K9 [. U( L. ]% T+ J
  467.                                          ((MODE) == I2C_ADDRESSINGMODE_10BIT))
    ) O8 G5 K; z* t8 f# F' ~' p

  468. " @# N, [3 N( r8 o& d% E( v: i
  469. #define IS_I2C_DUAL_ADDRESS(ADDRESS)    (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \9 T5 i1 ^5 L7 d# W7 X! Y
  470.                                          ((ADDRESS) == I2C_DUALADDRESS_ENABLE))
    8 t- c% ]9 ?6 s9 c* |
  471. + I* e  ?+ |) @  W: Y
  472. #define IS_I2C_OWN_ADDRESS2_MASK(MASK)  (((MASK) == I2C_OA2_NOMASK)  || \' x3 R- x: {# z; O: e$ l
  473.                                          ((MASK) == I2C_OA2_MASK01) || \
    % |. i' Y, ]9 Q) b$ T
  474.                                          ((MASK) == I2C_OA2_MASK02) || \5 b1 v" `4 @( j6 N4 Y
  475.                                          ((MASK) == I2C_OA2_MASK03) || \* H0 S$ I+ B7 b7 }( N# ]' [
  476.                                          ((MASK) == I2C_OA2_MASK04) || \* J2 C, D! Y" P0 s  f& K) @
  477.                                          ((MASK) == I2C_OA2_MASK05) || \
    ) k( N8 m9 p% N$ D! r3 V
  478.                                          ((MASK) == I2C_OA2_MASK06) || \/ a" o" n! ]+ `6 N) n
  479.                                          ((MASK) == I2C_OA2_MASK07))
    + |" T7 E& T8 R: x* D

  480. 1 X  l$ V. _( `/ i1 f- [
  481. #define IS_I2C_GENERAL_CALL(CALL)       (((CALL) == I2C_GENERALCALL_DISABLE) || \- S# \+ V& \6 ^8 I+ g4 U' v" o
  482.                                          ((CALL) == I2C_GENERALCALL_ENABLE))
    3 j/ X: s6 c) i' _$ S

  483. ) W. `( H# c5 b: _+ |4 c! e
  484. #define IS_I2C_NO_STRETCH(STRETCH)      (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \
    $ B$ ?9 M7 J# N& M+ y- v
  485.                                          ((STRETCH) == I2C_NOSTRETCH_ENABLE))
    5 d( E4 W/ O( X8 C
  486. + K/ D. k5 N3 R* q
  487. #define IS_I2C_MEMADD_SIZE(SIZE)        (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \
    . q" c$ E7 b, P8 X
  488.                                          ((SIZE) == I2C_MEMADD_SIZE_16BIT))" x; E& a& K5 X  E5 m( l+ G. v
  489. / p2 w( C/ G1 r1 u2 b3 {
  490. #define IS_TRANSFER_MODE(MODE)          (((MODE) == I2C_RELOAD_MODE)   || \
    8 M: g0 t7 c+ A+ p3 `' I
  491.                                          ((MODE) == I2C_AUTOEND_MODE) || \6 y9 ]7 m7 h+ p, _1 t" {4 p9 k
  492.                                          ((MODE) == I2C_SOFTEND_MODE))
    9 c8 m$ {$ r: z* T& Y

  493. % z% N- g+ X. t1 \
  494. #define IS_TRANSFER_REQUEST(REQUEST)    (((REQUEST) == I2C_GENERATE_STOP)        || \* ]: [( Z2 r# M8 [
  495.                                          ((REQUEST) == I2C_GENERATE_START_READ)  || \
    0 a& _' F% |$ t5 R# Q
  496.                                          ((REQUEST) == I2C_GENERATE_START_WRITE) || \7 h. {7 E* v$ @, l6 p  `. J8 T8 a! d
  497.                                          ((REQUEST) == I2C_NO_STARTSTOP))
    " g- i' x7 {" e5 B
  498. / Y6 T, j: [- _
  499. #define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST)  (((REQUEST) == I2C_FIRST_FRAME)          || \. z6 g! h1 x! g, m2 D& R) q
  500.                                                    ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \5 o. E4 m2 N+ \3 Z( J
  501.                                                    ((REQUEST) == I2C_NEXT_FRAME)           || \
    ( Q6 S% s) H7 e* g6 e" n$ Y
  502.                                                    ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \3 ~- w9 f# o9 L- M  ], V2 U
  503.                                                    ((REQUEST) == I2C_LAST_FRAME)           || \) ~/ A0 g1 c7 ]8 H! M
  504.                                                    ((REQUEST) == I2C_LAST_FRAME_NO_STOP)   || \
    / s: i( ?1 H. _! t, u
  505.                                                    IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST))
    - f' B1 E6 w7 [

  506. $ w4 L0 {8 Z/ |+ \5 P3 U6 t
  507. #define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME)     || \7 k" V' P, o( }
  508.                                                         ((REQUEST) == I2C_OTHER_AND_LAST_FRAME))2 b; [' X4 L8 k

  509. ) y4 E2 f/ S  @3 {- s& U
  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)))
    5 |3 [7 A2 b* A9 w

  511. . S7 V3 f- X0 P9 D8 I  _9 q" E
  512. #define I2C_GET_ADDR_MATCH(__HANDLE__)            ((uint16_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_ADDCODE) >> 16U))) a$ M/ ~8 d) t8 y5 [% ~1 M
  513. #define I2C_GET_DIR(__HANDLE__)                   ((uint8_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_DIR) >> 16U))
    # N0 t- J# n# o1 Y* J
  514. #define I2C_GET_STOP_MODE(__HANDLE__)             ((__HANDLE__)->Instance->CR2 & I2C_CR2_AUTOEND)" z: c; E7 Y% ^: x; z: n
  515. #define I2C_GET_OWN_ADDRESS1(__HANDLE__)          ((uint16_t)((__HANDLE__)->Instance->OAR1 & I2C_OAR1_OA1))
    5 m6 U: q8 D( f5 G
  516. #define I2C_GET_OWN_ADDRESS2(__HANDLE__)          ((uint16_t)((__HANDLE__)->Instance->OAR2 & I2C_OAR2_OA2))0 i# o$ v% b; t9 Q! J8 m

  517. + S: y( L  f5 n5 k6 g9 p# c, M9 _
  518. #define IS_I2C_OWN_ADDRESS1(ADDRESS1)             ((ADDRESS1) <= 0x000003FFU)
      W- V0 T+ K. g0 N3 @& [4 }; v4 {
  519. #define IS_I2C_OWN_ADDRESS2(ADDRESS2)             ((ADDRESS2) <= (uint16_t)0x00FFU)2 X2 T4 U1 C, w2 D2 Q
  520. . d  }; y5 C/ T$ `# ^6 v1 N0 W; ^
  521. #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
  522. #define I2C_MEM_ADD_LSB(__ADDRESS__)              ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU))))
    4 g8 v1 [6 D% N) r. {
  523. 9 i& u) V2 C/ m9 F# v% ^# j: r
  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)) : \: o  ^) ~0 I3 q9 T: T4 e% p
  525.                                                           (uint32_t)((((uint32_t)(__ADDRESS__) & (I2C_CR2_SADD)) | (I2C_CR2_ADD10) | (I2C_CR2_START)) & (~I2C_CR2_RD_WRN)))$ _! z3 {6 L5 L
  526. ( L/ ~. y& O/ T2 _
  527. #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
  528. #define I2C_CHECK_IT_SOURCE(__CR1__, __IT__)      ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET); j/ I0 I+ w: U- Q

  529.   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
收藏 1 评论0 发布时间:2020-3-22 07:29

举报

0个回答

所属标签

相似分享

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