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

NUCLEO_L552ZE_Q+HAL的I2C库(第五篇)

[复制链接]
qbwww 发布时间:2020-3-22 07:29
这个I2C库的资料也整理好了。有需要的看一看吧。这是用cube生成的文件整理的。Hal的库。

  1. /*I2C配置结构定义*/
  2. typedef struct
  3. {
  4. uint32_t Timing;                  /*指定I2C_TIMINGR_register值。该参数通过参考I2C初始化计算得出*/

  5. uint32_t OwnAddress1;         /*指定第一个设备自己的地址。此参数可以是7位或10位地址。*/

  6.   uint32_t AddressingMode;  /*指定是选择7位还是10位寻址模式。此参数可以是I2C_ADDRESSING_MODE*/的值

  7. uint32_t DualAddressMode; /*指定是否选择双重寻址模式。此参数可以是I2C_DUAL_ADDRESSING_MODE*/

  8. uint32_t OwnAddress2;        /*如果选择双寻址模式,则指定第二个设备自己的地址此参数可以是7位地址。*/

  9. uint32_t OwnAddress2Masks;/*如果选择双重寻址模式,则指定确认掩码地址第二个设备自己的地址,此参数可以是I2C_OWN_ADDRESS2_MASKS的值*/

  10. uint32_t GeneralCallMode;   /*指定是否选择常规呼叫模式。此参数可以是I2C_GENERAL_CALL_ADDRESSING_MODE的值*/

  11. uint32_t NoStretchMode;     /*指定是否选择nostretch模式。此参数可以是I2C_NOSTRETCH_MODE的值*/

  12. }I2C_InitTypeDef;


  13. /*HAL状态结构定义
  14. *HALI2C状态值编码遵循下面描述的位图:\n
  15. *                b7-b6错误信息\n
  16. *                00:无错误\n
  17. *                01:中止(正在进行中的用户请求中止)\n
  18. *                10:超时\n
  19. *                11:错误\n
  20. *                b5 外围设备初始化状态\n
  21. *                0:重置(外围设备未初始化)\n
  22. *                1:已完成初始化(已初始化外围设备并准备使用。已调用HALI2CInit函数)\n
  23. *                b4(未使用)\n
  24. *                x:应设置为0\n
  25. *                b3\n
  26. *                0:就绪或忙碌(无监听模式正在进行中)\n
  27. *                1:监听(地址监听模式中的外围设备)\n
  28. *                b2内部过程状态\n
  29. *                0:就绪\n
  30. *                1:忙(外围设备忙于某些配置或内部操作)\n
  31. *                b1接收状态\n
  32. *                0:就绪(无正在进行的接收操作)\n
  33. *                1:忙(正在进行Rx操作)\n
  34. *                b0Tx状态\n
  35. *                0:就绪(没有正在进行的发送操作)\n
  36. *                1:忙(正在进行发送操作)

  37. */
  38. typedef enum
  39. {
  40.         HAL_I2C_STATE_RESET             = 0x00U, /*外围设备尚未初始化*/
  41.         HAL_I2C_STATE_READY             = 0x20U, /*已初始化外围设备并准备使用*/
  42.         HAL_I2C_STATE_BUSY              = 0x24U, /*内部进程正在进行*/
  43.         HAL_I2C_STATE_BUSY_TX           = 0x21U, /*数据传输过程正在进行*/
  44.         HAL_I2C_STATE_BUSY_RX           = 0x22U, /*数据接收过程正在进行*/
  45.         HAL_I2C_STATE_LISTEN            = 0x28U, /*地址监听模式正在进行*/
  46.         HAL_I2C_STATE_BUSY_TX_LISTEN    = 0x29U, /*地址监听模式和数据传输正在进行中*/
  47.         HAL_I2C_STATE_BUSY_RX_LISTEN    = 0x2AU, /*地址监听模式和数据接收正在进行中*/
  48.         HAL_I2C_STATE_ABORT             = 0x60U, /*正在中止用户请求*/
  49.         HAL_I2C_STATE_TIMEOUT           = 0xA0U, /*超时状态*/
  50.         HAL_I2C_STATE_ERROR             = 0xE0U  /*错误*/

  51. }HAL_I2C_StateTypeDef;



  52. /*HAL模式结构定义
  53. *HALI2C模式值编码遵循下面描述的位图:\n
  54. *                b7(未使用)\n
  55. *                x:应设置为0\n
  56. *                b6\n
  57. *                0:无\n
  58. *                1:内存(HALI2C通信处于内存模式)\n
  59. *                b5\n
  60. *                0:无\n
  61. *                1:从站(HALI2C通信处于从站模式)\n
  62. *                b4\n
  63. *                0:无\n
  64. *                1:主机(HALI2C通讯处于主机模式)\n
  65. *                b3-b2-b1-b0(未使用)\n
  66. *                xxxx:应设置为0000

  67. */
  68. typedef enum
  69. {
  70. HAL_I2C_MODE_NONE               =0x00U, /*进行中没有I2C通信*/
  71. HAL_I2C_MODE_MASTER                                =0x10U,/*I2C通讯处于主模式*/
  72. HAL_I2C_MODE_SLAVE                                =0x20U,/*I2C通信处于从模式*/
  73. HAL_I2C_MODE_MEM                                =0x40U  /*I2C通信处于内存模式*/

  74. }HAL_I2C_ModeTypeDef;



  75. /*的I2C错误代码定义*/
  76. #定义HAL_I2C_ERROR_NONE                (0x00000000U)        /*没有错误*/
  77. #定义HAL_I2C_ERROR_BERR                (0x00000001U)        /*错误错误*/
  78. #定义HAL_I2C_ERROR_ARLO                (0x00000002U)        /*ARLO错误*/
  79. #定义HAL_I2C_ERROR_AF                        (0x00000004U)        /*ACKF错误*/
  80. #定义HAL_I2C_ERROR_OVR                        (0x00000008U)        /*OVR错误*/
  81. #定义HAL_I2C_ERROR_DMA                        (0x00000010U)        /*DMA传输错误*/
  82. #定义HAL_I2C_ERROR_TIMEOUT                (0x00000020U)        /*超时错误*/
  83. #定义HAL_I2C_ERROR_SIZE                (0x00000040U)        /*大小管理错误*/
  84. #定义HAL_I2C_ERROR_DMA_PARAM        (0x00000080U)        /*DMA参数错误*/
  85. #if(USE_HAL_I2C_REGISTER_CALLBACKS==1)
  86. #define HAL_I2C_ERROR_INVALID_CALLBACK  (0x00000100U)  /*无效的回调错误*/
  87. #endif/*USE_HAL_I2C_REGISTER_CALLBACKS*/
  88. #define HAL_I2C_ERROR_INVALID_PARAM     (0x00000200U)  /*无效参数错误*/


  89. /*I2C句柄结构定义*/
  90. typedef struct __I2C_HandleTypeDef
  91. {
  92. I2C_TypeDef                                *Instance;                        /*I2C注册基地址*/

  93. I2C_InitTypeDef                        Init;                                /*I2C通讯参数*/

  94. uint8_t                                        *pBuffPtr;                        /*指向I2C传输缓冲区的指针*/

  95. uint16_t                                XferSize;                        /*I2C传输大小*/

  96. __IOuint16_t                        XferCount;                        /*I2C传输计数器*/

  97. __IOuint32_t                        XferOptions;                /*I2C连续传输选项,此参数可以是I2C_XFEROPTIONS的值*/

  98. __IOuint32_t                        PreviousState;                /*I2C通信先前状态*/

  99. HAL_StatusTypeDef(*XferISR)(struct__I2C_HandleTypeDef*hi2c,uint32_tITFlags,uint32_tITSources);/*I2C传输IRQ处理程序函数指针*/

  100. DMA_HandleTypeDef                *hdmatx;                        /*I2CTxDMA句柄参数*/

  101. DMA_HandleTypeDef                *hdmarx;                        /*I2CRxDMA句柄参数*/

  102. HAL_LockTypeDef                        Lock;                        /*I2C锁定对象*/

  103. __IOHAL_I2C_StateTypeDef         State;                /*I2C通讯状态*/

  104. __IOHAL_I2C_ModeTypeDef                Mode;                /*I2C通讯模式*/

  105. __IOuint32_t                        ErrorCode;                /*I2C错误代码*/

  106. __IOuint32_t                        AddrEventCount;/*I2C地址事件计数器*/

  107. #if(USE_HAL_I2C_REGISTER_CALLBACKS==1)

  108. void (* MasterTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);         /*I2C主Tx传输完成的回调*/
  109. void (* MasterRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);    /*I2C主Rx传输完成的回调*/
  110. void (* SlaveTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);         /*I2C从机Tx传输完成回调*/
  111. void (* SlaveRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);     /*I2C从Rx传输完成回调*/
  112. void (* ListenCpltCallback)(struct __I2C_HandleTypeDef *hi2c);            /*I2C监听完成回调*/
  113. void (* MemTxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);                  /*I2C内存发送传输完成回调*/
  114. void (* MemRxCpltCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2C内存接收传输完成回调*/
  115. void (* ErrorCallback)(struct __I2C_HandleTypeDef *hi2c);                          /*I2C错误回调*/
  116. void (* AbortCpltCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2C中止回调*/
  117. void (* AddrCallback)(struct __I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*I2C从站地址匹配回调*/
  118. void (* MspInitCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2CMsp初始化回调*/
  119. void (* MspDeInitCallback)(struct __I2C_HandleTypeDef *hi2c);                 /*I2CMspDeInit回调*/

  120. #endif/*USE_HAL_I2C_REGISTER_CALLBACKS*/
  121. }I2C_HandleTypeDef;


  122. /*HALI2C回调ID枚举定义*/
  123. typedef enum
  124. {
  125. HAL_I2C_MASTER_TX_COMPLETE_CB_ID        =0x00U,        /*I2C主Tx传输完成的回调ID*/
  126. HAL_I2C_MASTER_RX_COMPLETE_CB_ID        =0x01U,        /*I2C主Rx传输完成的回调ID*/
  127. HAL_I2C_SLAVE_TX_COMPLETE_CB_ID                =0x02U,        /*I2C从机Tx传输完成的回调ID*/
  128. HAL_I2C_SLAVE_RX_COMPLETE_CB_ID                =0x03U,        /*I2C从站Rx传输完成的回调ID*/
  129. HAL_I2C_LISTEN_COMPLETE_CB_ID                =0x04U,        /*I2C监听完成回调ID*/
  130. HAL_I2C_MEM_TX_COMPLETE_CB_ID                =0x05U,        /*I2C内存Tx传输回调ID*/
  131. HAL_I2C_MEM_RX_COMPLETE_CB_ID                =0x06U,        /*I2C内存接收传输完成的回调ID*/
  132. HAL_I2C_ERROR_CB_ID                                        =0x07U,        /*I2C错误回调ID*/
  133. HAL_I2C_ABORT_CB_ID                                        =0x08U,        /*I2C中止回调ID*/
  134. HAL_I2C_MSPINIT_CB_ID                                =0x09U,        /*I2CMsp初始化回调ID*/
  135. HAL_I2C_MSPDEINIT_CB_ID                                =0x0AU                /*I2CMspDeInit回调ID*/
  136. }HAL_I2C_CallbackIDTypeDef;

  137. /*HALI2C回调指针定义*/
  138. typedef  void (*pI2C_CallbackTypeDef)(I2C_HandleTypeDef *hi2c); /*指向I2C回调函数的指针*/
  139. typedef  void (*pI2C_AddrCallbackTypeDef)(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode); /*指向I2C地址匹配回调函数的指针*/


  140. /*I2C顺序传输选项*/
  141. #define I2C_FIRST_FRAME                 ((uint32_t)I2C_SOFTEND_MODE)
  142. #define I2C_FIRST_AND_NEXT_FRAME        ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))
  143. #define I2C_NEXT_FRAME                  ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))
  144. #define I2C_FIRST_AND_LAST_FRAME        ((uint32_t)I2C_AUTOEND_MODE)
  145. #define I2C_LAST_FRAME                  ((uint32_t)I2C_AUTOEND_MODE)
  146. #define I2C_LAST_FRAME_NO_STOP          ((uint32_t)I2C_SOFTEND_MODE)


  147. /*I2C寻址模式*/
  148. #define I2C_ADDRESSINGMODE_7BIT         (0x00000001U)
  149. #define I2C_ADDRESSINGMODE_10BIT        (0x00000002U)


  150. /*I2C双寻址模式*/
  151. #define I2C_DUALADDRESS_DISABLE         (0x00000000U)
  152. #define I2C_DUALADDRESS_ENABLE          I2C_OAR2_OA2EN


  153. /*I2C自己地址的2个掩码*/
  154. #define I2C_OA2_NOMASK                  ((uint8_t)0x00U)
  155. #define I2C_OA2_MASK01                  ((uint8_t)0x01U)
  156. #define I2C_OA2_MASK02                  ((uint8_t)0x02U)
  157. #define I2C_OA2_MASK03                  ((uint8_t)0x03U)
  158. #define I2C_OA2_MASK04                  ((uint8_t)0x04U)
  159. #define I2C_OA2_MASK05                  ((uint8_t)0x05U)
  160. #define I2C_OA2_MASK06                  ((uint8_t)0x06U)
  161. #define I2C_OA2_MASK07                  ((uint8_t)0x07U)


  162. /*I2C常规呼叫寻址模式*/
  163. #define I2C_GENERALCALL_DISABLE         (0x00000000U)
  164. #define I2C_GENERALCALL_ENABLE          I2C_CR1_GCEN


  165. /*I2C无拉伸模式*/
  166. #define I2C_NOSTRETCH_DISABLE           (0x00000000U)
  167. #define I2C_NOSTRETCH_ENABLE            I2C_CR1_NOSTRETCH


  168. /*I2C内存地址大小*/
  169. #define I2C_MEMADD_SIZE_8BIT            (0x00000001U)
  170. #define I2C_MEMADD_SIZE_16BIT           (0x00000002U)


  171. /*I2C传输方向主视点*/
  172. #define I2C_DIRECTION_TRANSMIT          (0x00000000U)
  173. #define I2C_DIRECTION_RECEIVE           (0x00000001U)


  174. /*I2C重新加载结束模式*/
  175. #define  I2C_RELOAD_MODE                I2C_CR2_RELOAD
  176. #define  I2C_AUTOEND_MODE               I2C_CR2_AUTOEND
  177. #define  I2C_SOFTEND_MODE               (0x00000000U)


  178. /*I2C启动或停止模式*/
  179. #define  I2C_NO_STARTSTOP               (0x00000000U)
  180. #define  I2C_GENERATE_STOP              (uint32_t)(0x80000000U | I2C_CR2_STOP)
  181. #define  I2C_GENERATE_START_READ        (uint32_t)(0x80000000U | I2C_CR2_START | I2C_CR2_RD_WRN)
  182. #define  I2C_GENERATE_START_WRITE       (uint32_t)(0x80000000U | I2C_CR2_START)


  183. /*I2C中断配置定义*/
  184. #define I2C_IT_ERRI                     I2C_CR1_ERRIE
  185. #define I2C_IT_TCI                      I2C_CR1_TCIE
  186. #define I2C_IT_STOPI                    I2C_CR1_STOPIE
  187. #define I2C_IT_NACKI                    I2C_CR1_NACKIE
  188. #define I2C_IT_ADDRI                    I2C_CR1_ADDRIE
  189. #define I2C_IT_RXI                      I2C_CR1_RXIE
  190. #define I2C_IT_TXI                      I2C_CR1_TXIE


  191. /*I2C标志定义*/
  192. #define I2C_FLAG_TXE                    I2C_ISR_TXE
  193. #define I2C_FLAG_TXIS                   I2C_ISR_TXIS
  194. #define I2C_FLAG_RXNE                   I2C_ISR_RXNE
  195. #define I2C_FLAG_ADDR                   I2C_ISR_ADDR
  196. #define I2C_FLAG_AF                     I2C_ISR_NACKF
  197. #define I2C_FLAG_STOPF                  I2C_ISR_STOPF
  198. #define I2C_FLAG_TC                     I2C_ISR_TC
  199. #define I2C_FLAG_TCR                    I2C_ISR_TCR
  200. #define I2C_FLAG_BERR                   I2C_ISR_BERR
  201. #define I2C_FLAG_ARLO                   I2C_ISR_ARLO
  202. #define I2C_FLAG_OVR                    I2C_ISR_OVR
  203. #define I2C_FLAG_PECERR                 I2C_ISR_PECERR
  204. #define I2C_FLAG_TIMEOUT                I2C_ISR_TIMEOUT
  205. #define I2C_FLAG_ALERT                  I2C_ISR_ALERT
  206. #define I2C_FLAG_BUSY                   I2C_ISR_BUSY
  207. #define I2C_FLAG_DIR                    I2C_ISR_DIR



  208. /*I2C句柄状态*/
  209. #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
  210. #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                do{                                                   \
  211.                                                                     (__HANDLE__)->State = HAL_I2C_STATE_RESET;       \
  212.                                                                     (__HANDLE__)->MspInitCallback = NULL;            \
  213.                                                                     (__HANDLE__)->MspDeInitCallback = NULL;          \
  214.                                                                   } while(0)
  215. #else
  216. #define __HAL_I2C_RESET_HANDLE_STATE(__HANDLE__)                ((__HANDLE__)->State = HAL_I2C_STATE_RESET)
  217. #endif

  218. /*启用指定的I2C中断。
  219. *__HANDLE__指定I2C句柄。
  220. *__INTERRUPT__指定要启用的中断源。
  221. *此参数可以是下列值之一:
  222. *I2C_IT_ERRI错误中断
  223. *I2C_IT_TCI传输完成中断
  224. *I2C_IT_STOPISTOP检测中断
  225. *I2C_IT_NACKINACK接收中断
  226. *I2C_IT_ADDRI地址匹配中断
  227. *I2C_IT_RXIRX中断
  228. *I2C_IT_TXITX中断
  229. */
  230. #define __HAL_I2C_ENABLE_IT(__HANDLE__, __INTERRUPT__)          ((__HANDLE__)->Instance->CR1 |= (__INTERRUPT__))

  231. /*禁用指定的I2C中断。
  232. *__HANDLE__指定I2C句柄。
  233. *__INTERRUPT__指定要禁用的中断源。
  234. *此参数可以是下列值之一:
  235. *I2C_IT_ERRI错误中断
  236. *I2C_IT_TCI传输完成中断
  237. *I2C_IT_STOPISTOP检测中断
  238. *I2C_IT_NACKINACK接收中断
  239. *I2C_IT_ADDRI地址匹配中断
  240. *I2C_IT_RXIRX中断
  241. *I2C_IT_TXITX中断
  242. */
  243. #define __HAL_I2C_DISABLE_IT(__HANDLE__, __INTERRUPT__)         ((__HANDLE__)->Instance->CR1 &= (~(__INTERRUPT__)))

  244. /*检查是否启用了指定的I2C中断源。
  245. *__HANDLE__指定I2C句柄。
  246. *__INTERRUPT__指定要检查的I2C中断源。
  247. *此参数可以是下列值之一:
  248. *I2C_IT_ERRI错误中断
  249. *I2C_IT_TCI传输完成中断
  250. *I2C_IT_STOPISTOP检测中断
  251. *I2C_IT_NACKINACK接收中断
  252. *I2C_IT_ADDRI地址匹配中断
  253. *I2C_IT_RXIRX中断
  254. *I2C_IT_TXITX中断
  255. */
  256. #define __HAL_I2C_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__)      ((((__HANDLE__)->Instance->CR1 & (__INTERRUPT__)) == (__INTERRUPT__)) ? SET : RESET)

  257. /*检查是否设置了指定的I2C标志。
  258. *__HANDLE__指定I2C句柄。
  259. *__FLAG__指定要检查的标志。
  260. *此参数可以是下列值之一:
  261. *I2C_FLAG_TXE发送数据寄存器为空
  262. *I2C_FLAG_TXIS发送中断状态
  263. *I2C_FLAG_RXNE接收数据寄存器不为空
  264. *I2C_FLAG_ADDR地址匹配(从模式)
  265. *I2C_FLAG_AF收到确认失败标志
  266. *I2C_FLAG_STOPF停止检测标志
  267. *I2C_FLAG_TC传输完成(主模式)
  268. *I2C_FLAG_TCR传输完成重新加载
  269. *I2C_FLAG_BERR总线错误
  270. *I2C_FLAG_ARLO仲裁丢失
  271. *I2C_FLAG_OVR超限/不足
  272. *I2C_FLAG_PECERR接收中的PEC错误
  273. *I2C_FLAG_TIMEOUT超时或低速检测标志
  274. *I2C_FLAG_ALERTSMBus警报
  275. *I2C_FLAG_BUSY总线忙
  276. *I2C_FLAG_DIR传输方向(从模式)
  277. */
  278. #define I2C_FLAG_MASK  (0x0001FFFFU)
  279. #define __HAL_I2C_GET_FLAG(__HANDLE__, __FLAG__) (((((__HANDLE__)->Instance->ISR) & (__FLAG__)) == (__FLAG__)) ? SET : RESET)

  280. /*清除I2C挂起标志,该标志通过在特定位写入1来清除。
  281. *__HANDLE__指定I2C句柄。
  282. *__FLAG__指定要清除的标志。
  283. *此参数可以是以下值的任意组合:
  284. *I2C_FLAG_TXE发送数据寄存器为空
  285. *I2C_FLAG_ADDR地址匹配(从模式)
  286. *I2C_FLAG_AF收到确认失败标志
  287. *I2C_FLAG_STOPF停止检测标志
  288. *I2C_FLAG_BERR总线错误
  289. *I2C_FLAG_ARLO仲裁丢失
  290. *I2C_FLAG_OVR超限/不足
  291. *I2C_FLAG_PECERR接收中的PEC错误
  292. *I2C_FLAG_TIMEOUT超时或低速检测标志
  293. *I2C_FLAG_ALERTSMBus警报
  294. */
  295. #define __HAL_I2C_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__FLAG__) == I2C_FLAG_TXE) ? ((__HANDLE__)->Instance->ISR |= (__FLAG__)) \
  296.                                                                                  : ((__HANDLE__)->Instance->ICR = (__FLAG__)))

  297. /*启用指定的I2C外设。*/
  298. #define __HAL_I2C_ENABLE(__HANDLE__)                            (SET_BIT((__HANDLE__)->Instance->CR1,  I2C_CR1_PE))


  299. /*禁用指定的I2C外设。*/
  300. #define __HAL_I2C_DISABLE(__HANDLE__)                           (CLEAR_BIT((__HANDLE__)->Instance->CR1, I2C_CR1_PE))

  301. /*在从模式下生成一个非确认I2C外设。*/
  302. #define __HAL_I2C_GENERATE_NACK(__HANDLE__)                     (SET_BIT((__HANDLE__)->Instance->CR2, I2C_CR2_NACK))




  303. /*初始化和取消初始化功能**********************************/
  304. HAL_StatusTypeDef HAL_I2C_Init(I2C_HandleTypeDef *hi2c);
  305. HAL_StatusTypeDef HAL_I2C_DeInit(I2C_HandleTypeDef *hi2c);
  306. void HAL_I2C_MspInit(I2C_HandleTypeDef *hi2c);
  307. void HAL_I2C_MspDeInit(I2C_HandleTypeDef *hi2c);

  308. /*回调注册/取消注册功能***********************************/
  309. #if (USE_HAL_I2C_REGISTER_CALLBACKS == 1)
  310. HAL_StatusTypeDef HAL_I2C_RegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID, pI2C_CallbackTypeDef pCallback);
  311. HAL_StatusTypeDef HAL_I2C_UnRegisterCallback(I2C_HandleTypeDef *hi2c, HAL_I2C_CallbackIDTypeDef CallbackID);

  312. HAL_StatusTypeDef HAL_I2C_RegisterAddrCallback(I2C_HandleTypeDef *hi2c, pI2C_AddrCallbackTypeDef pCallback);
  313. HAL_StatusTypeDef HAL_I2C_UnRegisterAddrCallback(I2C_HandleTypeDef *hi2c);
  314. #endif /* USE_HAL_I2C_REGISTER_CALLBACKS */


  315. /*输入和输出操作函数*/
  316. /*IO操作功能****************************************************/
  317. /*阻止模式:轮询*/
  318. HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  319. HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  320. HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  321. HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
  322. 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);
  323. 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);
  324. HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);

  325. /*非阻塞模式:中断*/
  326. HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
  327. HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
  328. HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
  329. HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
  330. 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);
  331. 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);

  332. HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
  333. HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
  334. HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
  335. HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
  336. HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);
  337. HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);
  338. HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);

  339. /*非阻塞模式:DMA*/
  340. HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
  341. HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
  342. HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
  343. HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
  344. 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);
  345. 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);

  346. HAL_StatusTypeDef HAL_I2C_Master_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
  347. HAL_StatusTypeDef HAL_I2C_Master_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
  348. HAL_StatusTypeDef HAL_I2C_Slave_Seq_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
  349. HAL_StatusTypeDef HAL_I2C_Slave_Seq_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);


  350. /*在非阻塞模式(中断和DMA)中使用的I2C IRQHandler和回调*/
  351. void HAL_I2C_EV_IRQHandler(I2C_HandleTypeDef *hi2c);
  352. void HAL_I2C_ER_IRQHandler(I2C_HandleTypeDef *hi2c);
  353. void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c);
  354. void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c);
  355. void HAL_I2C_SlaveTxCpltCallback(I2C_HandleTypeDef *hi2c);
  356. void HAL_I2C_SlaveRxCpltCallback(I2C_HandleTypeDef *hi2c);
  357. void HAL_I2C_AddrCallback(I2C_HandleTypeDef *hi2c, uint8_t TransferDirection, uint16_t AddrMatchCode);
  358. void HAL_I2C_ListenCpltCallback(I2C_HandleTypeDef *hi2c);
  359. void HAL_I2C_MemTxCpltCallback(I2C_HandleTypeDef *hi2c);
  360. void HAL_I2C_MemRxCpltCallback(I2C_HandleTypeDef *hi2c);
  361. void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c);
  362. void HAL_I2C_AbortCpltCallback(I2C_HandleTypeDef *hi2c);


  363. /*外围状态,模式和错误功能*********************************/
  364. HAL_I2C_StateTypeDef HAL_I2C_GetState(I2C_HandleTypeDef *hi2c);
  365. HAL_I2C_ModeTypeDef  HAL_I2C_GetMode(I2C_HandleTypeDef *hi2c);
  366. uint32_t             HAL_I2C_GetError(I2C_HandleTypeDef *hi2c);




  367. /*I2C专用宏*/
  368. #define IS_I2C_ADDRESSING_MODE(MODE)    (((MODE) == I2C_ADDRESSINGMODE_7BIT) || \
  369.                                          ((MODE) == I2C_ADDRESSINGMODE_10BIT))

  370. #define IS_I2C_DUAL_ADDRESS(ADDRESS)    (((ADDRESS) == I2C_DUALADDRESS_DISABLE) || \
  371.                                          ((ADDRESS) == I2C_DUALADDRESS_ENABLE))

  372. #define IS_I2C_OWN_ADDRESS2_MASK(MASK)  (((MASK) == I2C_OA2_NOMASK)  || \
  373.                                          ((MASK) == I2C_OA2_MASK01) || \
  374.                                          ((MASK) == I2C_OA2_MASK02) || \
  375.                                          ((MASK) == I2C_OA2_MASK03) || \
  376.                                          ((MASK) == I2C_OA2_MASK04) || \
  377.                                          ((MASK) == I2C_OA2_MASK05) || \
  378.                                          ((MASK) == I2C_OA2_MASK06) || \
  379.                                          ((MASK) == I2C_OA2_MASK07))

  380. #define IS_I2C_GENERAL_CALL(CALL)       (((CALL) == I2C_GENERALCALL_DISABLE) || \
  381.                                          ((CALL) == I2C_GENERALCALL_ENABLE))

  382. #define IS_I2C_NO_STRETCH(STRETCH)      (((STRETCH) == I2C_NOSTRETCH_DISABLE) || \
  383.                                          ((STRETCH) == I2C_NOSTRETCH_ENABLE))

  384. #define IS_I2C_MEMADD_SIZE(SIZE)        (((SIZE) == I2C_MEMADD_SIZE_8BIT) || \
  385.                                          ((SIZE) == I2C_MEMADD_SIZE_16BIT))

  386. #define IS_TRANSFER_MODE(MODE)          (((MODE) == I2C_RELOAD_MODE)   || \
  387.                                          ((MODE) == I2C_AUTOEND_MODE) || \
  388.                                          ((MODE) == I2C_SOFTEND_MODE))

  389. #define IS_TRANSFER_REQUEST(REQUEST)    (((REQUEST) == I2C_GENERATE_STOP)        || \
  390.                                          ((REQUEST) == I2C_GENERATE_START_READ)  || \
  391.                                          ((REQUEST) == I2C_GENERATE_START_WRITE) || \
  392.                                          ((REQUEST) == I2C_NO_STARTSTOP))

  393. #define IS_I2C_TRANSFER_OPTIONS_REQUEST(REQUEST)  (((REQUEST) == I2C_FIRST_FRAME)          || \
  394.                                                    ((REQUEST) == I2C_FIRST_AND_NEXT_FRAME) || \
  395.                                                    ((REQUEST) == I2C_NEXT_FRAME)           || \
  396.                                                    ((REQUEST) == I2C_FIRST_AND_LAST_FRAME) || \
  397.                                                    ((REQUEST) == I2C_LAST_FRAME)           || \
  398.                                                    ((REQUEST) == I2C_LAST_FRAME_NO_STOP)   || \
  399.                                                    IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST))

  400. #define IS_I2C_TRANSFER_OTHER_OPTIONS_REQUEST(REQUEST) (((REQUEST) == I2C_OTHER_FRAME)     || \
  401.                                                         ((REQUEST) == I2C_OTHER_AND_LAST_FRAME))

  402. #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)))

  403. #define I2C_GET_ADDR_MATCH(__HANDLE__)            ((uint16_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_ADDCODE) >> 16U))
  404. #define I2C_GET_DIR(__HANDLE__)                   ((uint8_t)(((__HANDLE__)->Instance->ISR & I2C_ISR_DIR) >> 16U))
  405. #define I2C_GET_STOP_MODE(__HANDLE__)             ((__HANDLE__)->Instance->CR2 & I2C_CR2_AUTOEND)
  406. #define I2C_GET_OWN_ADDRESS1(__HANDLE__)          ((uint16_t)((__HANDLE__)->Instance->OAR1 & I2C_OAR1_OA1))
  407. #define I2C_GET_OWN_ADDRESS2(__HANDLE__)          ((uint16_t)((__HANDLE__)->Instance->OAR2 & I2C_OAR2_OA2))

  408. #define IS_I2C_OWN_ADDRESS1(ADDRESS1)             ((ADDRESS1) <= 0x000003FFU)
  409. #define IS_I2C_OWN_ADDRESS2(ADDRESS2)             ((ADDRESS2) <= (uint16_t)0x00FFU)

  410. #define I2C_MEM_ADD_MSB(__ADDRESS__)              ((uint8_t)((uint16_t)(((uint16_t)((__ADDRESS__) & (uint16_t)(0xFF00U))) >> 8U)))
  411. #define I2C_MEM_ADD_LSB(__ADDRESS__)              ((uint8_t)((uint16_t)((__ADDRESS__) & (uint16_t)(0x00FFU))))

  412. #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)) : \
  413.                                                           (uint32_t)((((uint32_t)(__ADDRESS__) & (I2C_CR2_SADD)) | (I2C_CR2_ADD10) | (I2C_CR2_START)) & (~I2C_CR2_RD_WRN)))

  414. #define I2C_CHECK_FLAG(__ISR__, __FLAG__)         ((((__ISR__) & ((__FLAG__) & I2C_FLAG_MASK)) == ((__FLAG__) & I2C_FLAG_MASK)) ? SET : RESET)
  415. #define I2C_CHECK_IT_SOURCE(__CR1__, __IT__)      ((((__CR1__) & (__IT__)) == (__IT__)) ? SET : RESET)

复制代码



收藏 评论0 发布时间:2020-3-22 07:29

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版