drv_hard_i2c.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2024-02-17 Dyyt587 first version
  9. */
  10. #include <rtthread.h>
  11. #include <rthw.h>
  12. #include <board.h>
  13. #include "drv_hard_i2c.h"
  14. #include "drv_config.h"
  15. #include <string.h>
  16. /* not fully support for I2C4 */
  17. #if defined(BSP_USING_HARD_I2C1) || defined(BSP_USING_HARD_I2C2) || defined(BSP_USING_HARD_I2C3)
  18. //#define DRV_DEBUG
  19. #define LOG_TAG "drv.i2c.hw"
  20. #include <drv_log.h>
  21. enum
  22. {
  23. #ifdef BSP_USING_HARD_I2C1
  24. I2C1_INDEX,
  25. #endif /* BSP_USING_HARD_I2C1 */
  26. #ifdef BSP_USING_HARD_I2C2
  27. I2C2_INDEX,
  28. #endif /* BSP_USING_HARD_I2C2 */
  29. #ifdef BSP_USING_HARD_I2C3
  30. I2C3_INDEX,
  31. #endif /* BSP_USING_HARD_I2C3 */
  32. };
  33. static struct stm32_i2c_config i2c_config[] =
  34. {
  35. #ifdef BSP_USING_HARD_I2C1
  36. I2C1_BUS_CONFIG,
  37. #endif /* BSP_USING_HARD_I2C1 */
  38. #ifdef BSP_USING_HARD_I2C2
  39. I2C2_BUS_CONFIG,
  40. #endif /* BSP_USING_HARD_I2C2 */
  41. #ifdef BSP_USING_HARD_I2C3
  42. I2C3_BUS_CONFIG,
  43. #endif /* BSP_USING_HARD_I2C3 */
  44. };
  45. static struct stm32_i2c i2c_objs[sizeof(i2c_config) / sizeof(i2c_config[0])] = {0};
  46. static rt_err_t stm32_i2c_init(struct stm32_i2c *i2c_drv)
  47. {
  48. RT_ASSERT(i2c_drv != RT_NULL);
  49. I2C_HandleTypeDef *i2c_handle = &i2c_drv->handle;
  50. rt_memset(i2c_handle, 0, sizeof(I2C_HandleTypeDef));
  51. struct stm32_i2c_config *cfg = i2c_drv->config;
  52. i2c_handle->Instance = cfg->Instance;
  53. #if defined(SOC_SERIES_STM32H7)
  54. i2c_handle->Init.Timing = cfg->timing;
  55. #endif /* defined(SOC_SERIES_STM32H7) */
  56. #if defined(SOC_SERIES_STM32F4)
  57. hi2c1.Init.ClockSpeed = 100000;
  58. hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
  59. #endif /* defined(SOC_SERIES_STM32F4) */
  60. i2c_handle->Init.OwnAddress1 = 0;
  61. i2c_handle->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  62. #if defined(SOC_SERIES_STM32H7)
  63. i2c_handle->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  64. #endif /* defined(SOC_SERIES_STM32H7) */
  65. i2c_handle->Init.OwnAddress2 = 0;
  66. i2c_handle->Init.OwnAddress2Masks = I2C_OA2_NOMASK;
  67. i2c_handle->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
  68. i2c_handle->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
  69. if (HAL_I2C_DeInit(i2c_handle) != HAL_OK)
  70. {
  71. return -RT_EFAULT;
  72. }
  73. if (HAL_I2C_Init(i2c_handle) != HAL_OK)
  74. {
  75. return -RT_EFAULT;
  76. }
  77. #if defined(SOC_SERIES_STM32H7)
  78. /* Configure Analogue filter */
  79. if (HAL_I2CEx_ConfigAnalogFilter(i2c_handle, I2C_ANALOGFILTER_ENABLE) != HAL_OK)
  80. {
  81. return -RT_EFAULT;
  82. }
  83. /* Configure Digital filter */
  84. if (HAL_I2CEx_ConfigDigitalFilter(i2c_handle, 0) != HAL_OK)
  85. {
  86. return -RT_EFAULT;
  87. }
  88. #endif /* defined(SOC_SERIES_STM32H7) */
  89. /* I2C2 DMA Init */
  90. if (i2c_drv->i2c_dma_flag & I2C_USING_RX_DMA_FLAG)
  91. {
  92. HAL_DMA_Init(&i2c_drv->dma.handle_rx);
  93. __HAL_LINKDMA(&i2c_drv->handle, hdmarx, i2c_drv->dma.handle_rx);
  94. /* NVIC configuration for DMA transfer complete interrupt */
  95. HAL_NVIC_SetPriority(i2c_drv->config->dma_rx->dma_irq, 0, 0);
  96. HAL_NVIC_EnableIRQ(i2c_drv->config->dma_rx->dma_irq);
  97. }
  98. if (i2c_drv->i2c_dma_flag & I2C_USING_TX_DMA_FLAG)
  99. {
  100. HAL_DMA_Init(&i2c_drv->dma.handle_tx);
  101. __HAL_LINKDMA(&i2c_drv->handle, hdmatx, i2c_drv->dma.handle_tx);
  102. /* NVIC configuration for DMA transfer complete interrupt */
  103. HAL_NVIC_SetPriority(i2c_drv->config->dma_tx->dma_irq, 1, 0);
  104. HAL_NVIC_EnableIRQ(i2c_drv->config->dma_tx->dma_irq);
  105. }
  106. if (i2c_drv->i2c_dma_flag & I2C_USING_TX_DMA_FLAG || i2c_drv->i2c_dma_flag & I2C_USING_RX_DMA_FLAG)
  107. {
  108. HAL_NVIC_SetPriority(i2c_drv->config->evirq_type, 2, 0);
  109. HAL_NVIC_EnableIRQ(i2c_drv->config->evirq_type);
  110. }
  111. return RT_EOK;
  112. }
  113. static rt_err_t stm32_i2c_configure(struct rt_i2c_bus_device *bus)
  114. {
  115. RT_ASSERT(RT_NULL != bus);
  116. struct stm32_i2c *i2c_drv = rt_container_of(bus, struct stm32_i2c, i2c_bus);
  117. return stm32_i2c_init(i2c_drv);
  118. }
  119. /**
  120. * @brief Hardware I2C driver transfer
  121. *
  122. * @param bus Device bus
  123. * @param msgs Data to be transferred
  124. * @param num Number of data
  125. * @return rt_ssize_t Transfer status
  126. */
  127. static rt_ssize_t stm32_i2c_master_xfer(struct rt_i2c_bus_device *bus,
  128. struct rt_i2c_msg msgs[],
  129. rt_uint32_t num)
  130. {
  131. /* for stm32 dma may more stability */
  132. #define DMA_TRANS_MIN_LEN 2 /* only buffer length >= DMA_TRANS_MIN_LEN will use DMA mode */
  133. #define TRANS_TIMEOUT_PERSEC 8 /* per ms will trans nums bytes */
  134. rt_int32_t i, ret;
  135. struct rt_i2c_msg *msg = msgs;
  136. struct rt_i2c_msg *next_msg = 0;
  137. struct stm32_i2c *i2c_obj;
  138. uint32_t mode = 0;
  139. uint8_t next_flag = 0;
  140. struct rt_completion *completion;
  141. rt_uint32_t timeout;
  142. if (num == 0)
  143. {
  144. return 0;
  145. }
  146. RT_ASSERT((msgs != RT_NULL) && (bus != RT_NULL));
  147. i2c_obj = rt_container_of(bus, struct stm32_i2c, i2c_bus);
  148. completion = &i2c_obj->completion;
  149. I2C_HandleTypeDef *handle = &i2c_obj->handle;
  150. LOG_D("xfer start %d mags", num);
  151. for (i = 0; i < (num - 1); i++)
  152. {
  153. mode = 0;
  154. msg = &msgs[i];
  155. LOG_D("xfer msgs[%d] addr=0x%2x buf=0x%x len= 0x%x flags= 0x%x", i, msg->addr, msg->buf, msg->len, msg->flags);
  156. next_msg = &msgs[i + 1];
  157. next_flag = next_msg->flags;
  158. timeout = msg->len/TRANS_TIMEOUT_PERSEC + 1;
  159. if (next_flag & RT_I2C_NO_START)
  160. {
  161. if ((next_flag & RT_I2C_RD) == (msg->flags & RT_I2C_RD))
  162. { /* The same mode, can use no start */
  163. mode = I2C_FIRST_AND_NEXT_FRAME;
  164. }
  165. else
  166. {
  167. /* Not allowed to use no start, sending address is required when changing direction, user setting error */
  168. LOG_W("user set flags error msg[%d] flags RT_I2C_NO_START has canceled", i + 1);
  169. mode = I2C_LAST_FRAME_NO_STOP;
  170. }
  171. }
  172. else
  173. {
  174. mode = I2C_LAST_FRAME_NO_STOP;
  175. }
  176. if (msg->flags & RT_I2C_RD)
  177. {
  178. LOG_D("xfer rec msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
  179. : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
  180. : "nuknown mode");
  181. if ((i2c_obj->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
  182. {
  183. ret = HAL_I2C_Master_Seq_Receive_DMA(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  184. }
  185. else
  186. {
  187. ret = HAL_I2C_Master_Seq_Receive_IT(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  188. }
  189. if (ret != RT_EOK)
  190. {
  191. LOG_E("[%s:%d]I2C Read error(%d)!\n", __func__, __LINE__, ret);
  192. goto out;
  193. }
  194. if (rt_completion_wait(completion, timeout) != RT_EOK)
  195. {
  196. LOG_D("receive time out");
  197. goto out;
  198. }
  199. }
  200. else
  201. {
  202. LOG_D("xfer trans msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
  203. : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
  204. : "nuknown mode");
  205. if ((i2c_obj->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
  206. {
  207. ret = HAL_I2C_Master_Seq_Transmit_DMA(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  208. }
  209. else
  210. {
  211. ret = HAL_I2C_Master_Seq_Transmit_IT(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  212. }
  213. if (ret != RT_EOK)
  214. {
  215. LOG_D("[%s:%d]I2C Write error(%d)!\n", __func__, __LINE__, ret);
  216. goto out;
  217. }
  218. if (rt_completion_wait(completion, timeout) != RT_EOK)
  219. {
  220. LOG_D("transmit time out");
  221. goto out;
  222. }
  223. }
  224. LOG_D("xfer next msgs[%d] addr=0x%2x buf= 0x%x len= 0x%x flags = 0x%x\r\n", i + 1, next_msg->addr, next_msg->buf, next_msg->len, next_msg->flags);
  225. }
  226. /* last msg */
  227. msg = &msgs[i];
  228. timeout = msg->len/TRANS_TIMEOUT_PERSEC+1;
  229. if (msg->flags & RT_I2C_NO_STOP)
  230. mode = I2C_LAST_FRAME_NO_STOP;
  231. else
  232. mode = I2C_LAST_FRAME;
  233. LOG_D("xfer last msgs[%d] addr=0x%2x buf= 0x%x len= 0x%x flags = 0x%x", i, msg->addr, msg->buf, msg->len, msg->flags);
  234. if (msg->flags & RT_I2C_RD)
  235. {
  236. LOG_D("xfer rec msgs[%d] hal mode=%s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
  237. : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
  238. : "nuknown mode");
  239. if ((i2c_obj->i2c_dma_flag & I2C_USING_RX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
  240. {
  241. ret = HAL_I2C_Master_Seq_Receive_DMA(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  242. }
  243. else
  244. {
  245. ret = HAL_I2C_Master_Seq_Receive_IT(handle,(msg->addr<<1) , msg->buf, msg->len, mode);
  246. }
  247. if (ret != RT_EOK)
  248. {
  249. LOG_D("[%s:%d]I2C Read error(%d)!\n", __func__, __LINE__, ret);
  250. goto out;
  251. }
  252. if (rt_completion_wait(completion, timeout) != RT_EOK)
  253. {
  254. LOG_D("receive time out");
  255. goto out;
  256. }
  257. }
  258. else
  259. {
  260. LOG_D("xfer trans msgs[%d] hal mode = %s", i, mode == I2C_FIRST_AND_NEXT_FRAME ? "I2C_FIRST_AND_NEXT_FRAME" : mode == I2C_LAST_FRAME ? "I2C_LAST_FRAME"
  261. : mode == I2C_LAST_FRAME_NO_STOP ? "I2C_FIRST_FRAME/I2C_LAST_FRAME_NO_STOP"
  262. : "nuknown mode");
  263. if ((i2c_obj->i2c_dma_flag & I2C_USING_TX_DMA_FLAG) && (msg->len >= DMA_TRANS_MIN_LEN))
  264. {
  265. ret = HAL_I2C_Master_Seq_Transmit_DMA(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  266. }
  267. else
  268. {
  269. ret = HAL_I2C_Master_Seq_Transmit_IT(handle, (msg->addr<<1) , msg->buf, msg->len, mode);
  270. }
  271. if (ret != RT_EOK)
  272. {
  273. LOG_D("[%s:%d]I2C Write error(%d)!\n", __func__, __LINE__, ret);
  274. goto out;
  275. }
  276. if (rt_completion_wait(completion, timeout) != RT_EOK)
  277. {
  278. LOG_D("transmit time out");
  279. goto out;
  280. }
  281. }
  282. ret = num;
  283. LOG_D("xfer end %d mags\r\n", num);
  284. return ret;
  285. out:
  286. if (handle->ErrorCode == HAL_I2C_ERROR_AF)
  287. {
  288. LOG_D("I2C NACK Error now stoped");
  289. /* Send stop signal to prevent bus lock-up */
  290. #if defined(SOC_SERIES_STM32H7)
  291. handle->Instance->CR1 |= I2C_IT_STOPI;
  292. #endif /* defined(SOC_SERIES_STM32H7) */
  293. }
  294. if (handle->ErrorCode == HAL_I2C_ERROR_BERR)
  295. {
  296. LOG_D("I2C BUS Error now stoped");
  297. handle->Instance->CR1 |= I2C_IT_STOPI;
  298. ret=i-1;
  299. return ret;
  300. }
  301. static const struct rt_i2c_bus_device_ops stm32_i2c_ops =
  302. {
  303. .master_xfer = stm32_i2c_master_xfer,
  304. RT_NULL,
  305. RT_NULL
  306. };
  307. int RT_hw_i2c_bus_init(void)
  308. {
  309. int ret = -RT_ERROR;
  310. rt_size_t obj_num = sizeof(i2c_objs) / sizeof(i2c_objs[0]);
  311. for (int i = 0; i < obj_num; i++)
  312. {
  313. i2c_objs[i].i2c_bus.ops = &stm32_i2c_ops;
  314. i2c_objs[i].config = &i2c_config[i];
  315. i2c_objs[i].i2c_bus.timeout = i2c_config[i].timeout;
  316. if (i2c_objs[i].i2c_dma_flag & I2C_USING_TX_DMA_FLAG)
  317. {
  318. i2c_objs[i].dma.handle_tx.Instance = i2c_config[i].dma_tx->Instance;
  319. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  320. i2c_objs[i].dma.handle_tx.Init.Channel = i2c_config[i].dma_tx->channel;
  321. #elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32H7)
  322. i2c_objs[i].dma.handle_tx.Init.Request = i2c_config[i].dma_tx->request;
  323. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) */
  324. #ifndef SOC_SERIES_STM32U5
  325. i2c_objs[i].dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  326. i2c_objs[i].dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  327. i2c_objs[i].dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE;
  328. i2c_objs[i].dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  329. i2c_objs[i].dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  330. i2c_objs[i].dma.handle_tx.Init.Mode = DMA_NORMAL;
  331. i2c_objs[i].dma.handle_tx.Init.Priority = DMA_PRIORITY_LOW;
  332. #endif
  333. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
  334. i2c_objs[i].dma.handle_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  335. i2c_objs[i].dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  336. i2c_objs[i].dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4;
  337. i2c_objs[i].dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4;
  338. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7) */
  339. }
  340. if ((i2c_objs[i].i2c_dma_flag & I2C_USING_RX_DMA_FLAG))
  341. {
  342. i2c_objs[i].dma.handle_rx.Instance = i2c_config[i].dma_rx->Instance;
  343. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  344. i2c_objs[i].dma.handle_rx.Init.Channel = i2c_config[i].dma_rx->channel;
  345. #elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32H7)
  346. i2c_objs[i].dma.handle_rx.Init.Request = i2c_config[i].dma_rx->request;
  347. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) */
  348. #ifndef SOC_SERIES_STM32U5
  349. i2c_objs[i].dma.handle_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  350. i2c_objs[i].dma.handle_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  351. i2c_objs[i].dma.handle_rx.Init.MemInc = DMA_MINC_ENABLE;
  352. i2c_objs[i].dma.handle_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  353. i2c_objs[i].dma.handle_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  354. i2c_objs[i].dma.handle_rx.Init.Mode = DMA_NORMAL;
  355. i2c_objs[i].dma.handle_rx.Init.Priority = DMA_PRIORITY_LOW;
  356. #endif /* SOC_SERIES_STM32U5 */
  357. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
  358. i2c_objs[i].dma.handle_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  359. i2c_objs[i].dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  360. i2c_objs[i].dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4;
  361. i2c_objs[i].dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4;
  362. }
  363. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7) */
  364. {
  365. rt_uint32_t tmpreg = 0x00U;
  366. #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32F0)
  367. /* enable DMA clock && Delay after an RCC peripheral clock enabling*/
  368. SET_BIT(RCC->AHBENR, i2c_config[i].dma_tx->dma_rcc);
  369. tmpreg = READ_BIT(RCC->AHBENR, i2c_config[i].dma_tx->dma_rcc);
  370. #elif defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32H7)
  371. SET_BIT(RCC->AHB1ENR, i2c_config[i].dma_tx->dma_rcc);
  372. /* Delay after an RCC peripheral clock enabling */
  373. tmpreg = READ_BIT(RCC->AHB1ENR, i2c_config[i].dma_tx->dma_rcc);
  374. #elif defined(SOC_SERIES_STM32MP1)
  375. __HAL_RCC_DMAMUX_CLK_ENABLE();
  376. SET_BIT(RCC->MP_AHB2ENSETR, i2c_config[i].dma_tx->dma_rcc);
  377. tmpreg = READ_BIT(RCC->MP_AHB2ENSETR, i2c_config[i].dma_tx->dma_rcc);
  378. #endif /* defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32F0) */
  379. UNUSED(tmpreg); /* To avoid compiler warnings */
  380. }
  381. rt_completion_init(&i2c_objs[i].completion);
  382. stm32_i2c_configure(&i2c_objs[i].i2c_bus);
  383. ret = rt_i2c_bus_device_register(&i2c_objs[i].i2c_bus, i2c_objs[i].config->name);
  384. RT_ASSERT(ret == RT_EOK);
  385. LOG_D("%s bus init done", i2c_config[i].name);
  386. }
  387. return ret;
  388. }
  389. static void stm32_get_dma_info(void)
  390. {
  391. #ifdef BSP_I2C1_RX_USING_DMA
  392. i2c_objs[I2C1_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG;
  393. static struct dma_config I2C1_dma_rx = I2C1_RX_DMA_CONFIG;
  394. i2c_config[I2C1_INDEX].dma_rx = &I2C1_dma_rx;
  395. #endif /* BSP_I2C1_RX_USING_DMA */
  396. #ifdef BSP_I2C1_TX_USING_DMA
  397. i2c_objs[I2C1_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG;
  398. static struct dma_config I2C1_dma_tx = I2C1_TX_DMA_CONFIG;
  399. i2c_config[I2C1_INDEX].dma_tx = &I2C1_dma_tx;
  400. #endif /* BSP_I2C1_TX_USING_DMA */
  401. #ifdef BSP_I2C2_RX_USING_DMA
  402. i2c_objs[I2C2_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG;
  403. static struct dma_config I2C2_dma_rx = I2C2_RX_DMA_CONFIG;
  404. i2c_config[I2C2_INDEX].dma_rx = &I2C2_dma_rx;
  405. #endif /* BSP_I2C2_RX_USING_DMA */
  406. #ifdef BSP_I2C2_TX_USING_DMA
  407. i2c_objs[I2C2_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG;
  408. static struct dma_config I2C2_dma_tx = I2C2_TX_DMA_CONFIG;
  409. i2c_config[I2C2_INDEX].dma_tx = &I2C2_dma_tx;
  410. #endif /* BSP_I2C2_TX_USING_DMA */
  411. #ifdef BSP_I2C3_RX_USING_DMA
  412. i2c_objs[I2C3_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG;
  413. static struct dma_config I2C3_dma_rx = I2C3_RX_DMA_CONFIG;
  414. i2c_config[I2C3_INDEX].dma_rx = &I2C3_dma_rx;
  415. #endif /* BSP_I2C3_RX_USING_DMA */
  416. #ifdef BSP_I2C3_TX_USING_DMA
  417. i2c_objs[I2C3_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG;
  418. static struct dma_config I2C3_dma_tx = I2C3_TX_DMA_CONFIG;
  419. i2c_config[I2C3_INDEX].dma_tx = &I2C3_dma_tx;
  420. #endif /* BSP_I2C3_TX_USING_DMA */
  421. }
  422. void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
  423. {
  424. struct stm32_i2c *i2c_drv = rt_container_of(hi2c, struct stm32_i2c, handle);
  425. rt_completion_done(&i2c_drv->completion);
  426. }
  427. void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
  428. {
  429. struct stm32_i2c *i2c_drv = rt_container_of(hi2c, struct stm32_i2c, handle);
  430. rt_completion_done(&i2c_drv->completion);
  431. }
  432. void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
  433. {
  434. #if defined(SOC_SERIES_STM32H7)
  435. /* Send stop signal to prevent bus lock-up */
  436. if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
  437. {
  438. LOG_D("I2C NACK Error now stoped");
  439. hi2c->Instance->CR1 |= I2C_IT_STOPI;
  440. }
  441. if (hi2c->ErrorCode == HAL_I2C_ERROR_BERR)
  442. {
  443. LOG_D("I2C BUS Error now stoped");
  444. hi2c->Instance->CR1 |= I2C_IT_STOPI;
  445. }
  446. #endif /* defined(SOC_SERIES_STM32H7) */
  447. }
  448. #ifdef BSP_USING_HARD_I2C1
  449. /**
  450. * @brief This function handles I2C2 event interrupt.
  451. */
  452. void I2C1_EV_IRQHandler(void)
  453. {
  454. /* USER CODE BEGIN I2C2_EV_IRQn 0 */
  455. /* enter interrupt */
  456. rt_interrupt_enter();
  457. /* USER CODE END I2C2_EV_IRQn 0 */
  458. HAL_I2C_EV_IRQHandler(&i2c_objs[I2C1_INDEX].handle);
  459. /* USER CODE BEGIN I2C2_EV_IRQn 1 */
  460. /* leave interrupt */
  461. rt_interrupt_leave();
  462. /* USER CODE END I2C2_EV_IRQn 1 */
  463. }
  464. /**
  465. * @brief This function handles I2C2 error interrupt.
  466. */
  467. void I2C1_ER_IRQHandler(void)
  468. {
  469. /* USER CODE BEGIN I2C2_ER_IRQn 0 */
  470. /* enter interrupt */
  471. rt_interrupt_enter();
  472. /* USER CODE END I2C2_ER_IRQn 0 */
  473. HAL_I2C_ER_IRQHandler(&i2c_objs[I2C1_INDEX].handle);
  474. /* USER CODE BEGIN I2C2_ER_IRQn 1 */
  475. /* leave interrupt */
  476. rt_interrupt_leave();
  477. /* USER CODE END I2C2_ER_IRQn 1 */
  478. }
  479. #endif /* BSP_USING_HARD_I2C1 */
  480. #ifdef BSP_USING_HARD_I2C2
  481. /**
  482. * @brief This function handles I2C2 event interrupt.
  483. */
  484. void I2C2_EV_IRQHandler(void)
  485. {
  486. /* USER CODE BEGIN I2C2_EV_IRQn 0 */
  487. /* enter interrupt */
  488. rt_interrupt_enter();
  489. /* USER CODE END I2C2_EV_IRQn 0 */
  490. HAL_I2C_EV_IRQHandler(&i2c_objs[I2C2_INDEX].handle);
  491. /* USER CODE BEGIN I2C2_EV_IRQn 1 */
  492. /* leave interrupt */
  493. rt_interrupt_leave();
  494. /* USER CODE END I2C2_EV_IRQn 1 */
  495. }
  496. /**
  497. * @brief This function handles I2C2 error interrupt.
  498. */
  499. void I2C2_ER_IRQHandler(void)
  500. {
  501. /* USER CODE BEGIN I2C2_ER_IRQn 0 */
  502. /* enter interrupt */
  503. rt_interrupt_enter();
  504. /* USER CODE END I2C2_ER_IRQn 0 */
  505. HAL_I2C_ER_IRQHandler(&i2c_objs[I2C2_INDEX].handle);
  506. /* USER CODE BEGIN I2C2_ER_IRQn 1 */
  507. /* leave interrupt */
  508. rt_interrupt_leave();
  509. /* USER CODE END I2C2_ER_IRQn 1 */
  510. }
  511. #endif /* BSP_USING_HARD_I2C2 */
  512. #ifdef BSP_USING_HARD_I2C3
  513. /**
  514. * @brief This function handles I2C2 event interrupt.
  515. */
  516. void I2C3_EV_IRQHandler(void)
  517. {
  518. /* USER CODE BEGIN I2C2_EV_IRQn 0 */
  519. /* enter interrupt */
  520. rt_interrupt_enter();
  521. /* USER CODE END I2C2_EV_IRQn 0 */
  522. HAL_I2C_EV_IRQHandler(&i2c_objs[I2C3_INDEX].handle);
  523. /* USER CODE BEGIN I2C2_EV_IRQn 1 */
  524. /* leave interrupt */
  525. rt_interrupt_leave();
  526. /* USER CODE END I2C2_EV_IRQn 1 */
  527. }
  528. /**
  529. * @brief This function handles I2C2 error interrupt.
  530. */
  531. void I2C3_ER_IRQHandler(void)
  532. {
  533. /* USER CODE BEGIN I2C2_ER_IRQn 0 */
  534. /* enter interrupt */
  535. rt_interrupt_enter();
  536. /* USER CODE END I2C2_ER_IRQn 0 */
  537. HAL_I2C_ER_IRQHandler(&i2c_objs[I2C3_INDEX].handle);
  538. /* USER CODE BEGIN I2C2_ER_IRQn 1 */
  539. /* leave interrupt */
  540. rt_interrupt_leave();
  541. /* USER CODE END I2C2_ER_IRQn 1 */
  542. }
  543. #endif /* BSP_USING_HARD_I2C3 */
  544. #if defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_RX_USING_DMA)
  545. /**
  546. * @brief This function handles DMA Rx interrupt request.
  547. * @param None
  548. * @retval None
  549. */
  550. void I2C1_DMA_RX_IRQHandler(void)
  551. {
  552. /* enter interrupt */
  553. rt_interrupt_enter();
  554. HAL_DMA_IRQHandler(&i2c_objs[I2C1_INDEX].dma.handle_rx);
  555. /* leave interrupt */
  556. rt_interrupt_leave();
  557. }
  558. #endif /* defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_RX_USING_DMA) */
  559. #if defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_TX_USING_DMA)
  560. /**
  561. * @brief This function handles DMA Rx interrupt request.
  562. * @param None
  563. * @retval None
  564. */
  565. void I2C1_DMA_TX_IRQHandler(void)
  566. {
  567. /* enter interrupt */
  568. rt_interrupt_enter();
  569. HAL_DMA_IRQHandler(&i2c_objs[I2C1_INDEX].dma.handle_tx);
  570. /* leave interrupt */
  571. rt_interrupt_leave();
  572. }
  573. #endif /* defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_TX_USING_DMA) */
  574. #if defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_RX_USING_DMA)
  575. /**
  576. * @brief This function handles DMA Rx interrupt request.
  577. * @param None
  578. * @retval None
  579. */
  580. void I2C2_DMA_RX_IRQHandler(void)
  581. {
  582. /* enter interrupt */
  583. rt_interrupt_enter();
  584. HAL_DMA_IRQHandler(&i2c_objs[I2C2_INDEX].dma.handle_rx);
  585. /* leave interrupt */
  586. rt_interrupt_leave();
  587. }
  588. #endif /* defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_RX_USING_DMA) */
  589. #if defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_TX_USING_DMA)
  590. /**
  591. * @brief This function handles DMA Rx interrupt request.
  592. * @param None
  593. * @retval None
  594. */
  595. void I2C2_DMA_TX_IRQHandler(void)
  596. {
  597. /* enter interrupt */
  598. rt_interrupt_enter();
  599. HAL_DMA_IRQHandler(&i2c_objs[I2C2_INDEX].dma.handle_tx);
  600. /* leave interrupt */
  601. rt_interrupt_leave();
  602. }
  603. #endif /* defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_TX_USING_DMA) */
  604. #if defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_RX_USING_DMA)
  605. /**
  606. * @brief This function handles DMA Rx interrupt request.
  607. * @param None
  608. * @retval None
  609. */
  610. void I2C3_DMA_RX_IRQHandler(void)
  611. {
  612. /* enter interrupt */
  613. rt_interrupt_enter();
  614. HAL_DMA_IRQHandler(&i2c_objs[I2C3_INDEX].dma.handle_rx);
  615. /* leave interrupt */
  616. rt_interrupt_leave();
  617. }
  618. #endif /* defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_RX_USING_DMA) */
  619. #if defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_TX_USING_DMA)
  620. /**
  621. * @brief This function handles DMA Rx interrupt request.
  622. * @param None
  623. * @retval None
  624. */
  625. void I2C3_DMA_TX_IRQHandler(void)
  626. {
  627. /* enter interrupt */
  628. rt_interrupt_enter();
  629. HAL_DMA_IRQHandler(&i2c_objs[I2C3_INDEX].dma.handle_tx);
  630. /* leave interrupt */
  631. rt_interrupt_leave();
  632. }
  633. #endif /* defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_TX_USING_DMA) */
  634. #if defined(BSP_USING_I2C4) && defined(BSP_I2C4_RX_USING_DMA)
  635. /**
  636. * @brief This function handles DMA Rx interrupt request.
  637. * @param None
  638. * @retval None
  639. */
  640. void I2C4_DMA_RX_IRQHandler(void)
  641. {
  642. /* enter interrupt */
  643. rt_interrupt_enter();
  644. HAL_DMA_IRQHandler(&i2c_objs[I2C4_INDEX].dma.handle_rx);
  645. /* leave interrupt */
  646. rt_interrupt_leave();
  647. }
  648. #endif /* defined(BSP_USING_I2C4) && defined(BSP_I2C4_RX_USING_DMA) */
  649. #if defined(BSP_USING_I2C4) && defined(BSP_I2C4_TX_USING_DMA)
  650. /**
  651. * @brief This function handles DMA Rx interrupt request.
  652. * @param None
  653. * @retval None
  654. */
  655. void I2C4_DMA_TX_IRQHandler(void)
  656. {
  657. /* enter interrupt */
  658. rt_interrupt_enter();
  659. HAL_DMA_IRQHandler(&i2c_objs[I2C4_INDEX].dma.handle_tx);
  660. /* leave interrupt */
  661. rt_interrupt_leave();
  662. }
  663. #endif /* defined(BSP_USING_I2C4) && defined(BSP_I2C4_TX_USING_DMA) */
  664. int rt_hw_hw_i2c_init(void)
  665. {
  666. stm32_get_dma_info();
  667. return RT_hw_i2c_bus_init();
  668. }
  669. INIT_CORE_EXPORT(rt_hw_hw_i2c_init);
  670. #endif /* defined(BSP_USING_HARD_I2C1) || defined(BSP_USING_HARD_I2C2) || defined(BSP_USING_HARD_I2C3) */