drv_hard_i2c.c 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740
  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. * 2024-04-23 Zeidan fix bugs, test on STM32F429IGTx
  10. */
  11. #include <rtthread.h>
  12. #include <rthw.h>
  13. #include <board.h>
  14. #include "drv_hard_i2c.h"
  15. #include "drv_config.h"
  16. #include <string.h>
  17. /* not fully support for I2C4 */
  18. #if defined(BSP_USING_HARD_I2C1) || defined(BSP_USING_HARD_I2C2) || defined(BSP_USING_HARD_I2C3)
  19. //#define DRV_DEBUG
  20. #define LOG_TAG "drv.i2c.hw"
  21. #include <drv_log.h>
  22. enum
  23. {
  24. #ifdef BSP_USING_HARD_I2C1
  25. I2C1_INDEX,
  26. #endif /* BSP_USING_HARD_I2C1 */
  27. #ifdef BSP_USING_HARD_I2C2
  28. I2C2_INDEX,
  29. #endif /* BSP_USING_HARD_I2C2 */
  30. #ifdef BSP_USING_HARD_I2C3
  31. I2C3_INDEX,
  32. #endif /* BSP_USING_HARD_I2C3 */
  33. };
  34. static struct stm32_i2c_config i2c_config[] =
  35. {
  36. #ifdef BSP_USING_HARD_I2C1
  37. I2C1_BUS_CONFIG,
  38. #endif /* BSP_USING_HARD_I2C1 */
  39. #ifdef BSP_USING_HARD_I2C2
  40. I2C2_BUS_CONFIG,
  41. #endif /* BSP_USING_HARD_I2C2 */
  42. #ifdef BSP_USING_HARD_I2C3
  43. I2C3_BUS_CONFIG,
  44. #endif /* BSP_USING_HARD_I2C3 */
  45. };
  46. static struct stm32_i2c i2c_objs[sizeof(i2c_config) / sizeof(i2c_config[0])] = {0};
  47. static rt_err_t stm32_i2c_init(struct stm32_i2c *i2c_drv)
  48. {
  49. RT_ASSERT(i2c_drv != RT_NULL);
  50. I2C_HandleTypeDef *i2c_handle = &i2c_drv->handle;
  51. rt_memset(i2c_handle, 0, sizeof(I2C_HandleTypeDef));
  52. struct stm32_i2c_config *cfg = i2c_drv->config;
  53. i2c_handle->Instance = cfg->Instance;
  54. #if defined(SOC_SERIES_STM32H7)
  55. i2c_handle->Init.Timing = cfg->timing;
  56. #endif /* defined(SOC_SERIES_STM32H7) */
  57. #if defined(SOC_SERIES_STM32F4)
  58. i2c_handle->Init.ClockSpeed = 100000;
  59. i2c_handle->Init.DutyCycle = I2C_DUTYCYCLE_2;
  60. #endif /* defined(SOC_SERIES_STM32F4) */
  61. i2c_handle->Init.OwnAddress1 = 0;
  62. i2c_handle->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
  63. #if defined(SOC_SERIES_STM32H7)
  64. i2c_handle->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  65. #endif /* defined(SOC_SERIES_STM32H7) */
  66. i2c_handle->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
  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 + 5;
  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 + 5;
  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_CR1_STOP;
  298. ret=i-1;
  299. }
  300. return ret;
  301. }
  302. static const struct rt_i2c_bus_device_ops stm32_i2c_ops =
  303. {
  304. .master_xfer = stm32_i2c_master_xfer,
  305. RT_NULL,
  306. RT_NULL
  307. };
  308. int RT_hw_i2c_bus_init(void)
  309. {
  310. int ret = -RT_ERROR;
  311. rt_size_t obj_num = sizeof(i2c_objs) / sizeof(i2c_objs[0]);
  312. for (int i = 0; i < obj_num; i++)
  313. {
  314. i2c_objs[i].i2c_bus.ops = &stm32_i2c_ops;
  315. i2c_objs[i].config = &i2c_config[i];
  316. i2c_objs[i].i2c_bus.timeout = i2c_config[i].timeout;
  317. if (i2c_objs[i].i2c_dma_flag & I2C_USING_TX_DMA_FLAG)
  318. {
  319. i2c_objs[i].dma.handle_tx.Instance = i2c_config[i].dma_tx->Instance;
  320. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  321. i2c_objs[i].dma.handle_tx.Init.Channel = i2c_config[i].dma_tx->channel;
  322. #elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32H7)
  323. i2c_objs[i].dma.handle_tx.Init.Request = i2c_config[i].dma_tx->request;
  324. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) */
  325. #ifndef SOC_SERIES_STM32U5
  326. i2c_objs[i].dma.handle_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  327. i2c_objs[i].dma.handle_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  328. i2c_objs[i].dma.handle_tx.Init.MemInc = DMA_MINC_ENABLE;
  329. i2c_objs[i].dma.handle_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  330. i2c_objs[i].dma.handle_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  331. i2c_objs[i].dma.handle_tx.Init.Mode = DMA_NORMAL;
  332. i2c_objs[i].dma.handle_tx.Init.Priority = DMA_PRIORITY_LOW;
  333. #endif
  334. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
  335. i2c_objs[i].dma.handle_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  336. i2c_objs[i].dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  337. i2c_objs[i].dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4;
  338. i2c_objs[i].dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4;
  339. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7) */
  340. }
  341. if ((i2c_objs[i].i2c_dma_flag & I2C_USING_RX_DMA_FLAG))
  342. {
  343. i2c_objs[i].dma.handle_rx.Instance = i2c_config[i].dma_rx->Instance;
  344. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7)
  345. i2c_objs[i].dma.handle_rx.Init.Channel = i2c_config[i].dma_rx->channel;
  346. #elif defined(SOC_SERIES_STM32L4) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32WB) || defined(SOC_SERIES_STM32H7)
  347. i2c_objs[i].dma.handle_rx.Init.Request = i2c_config[i].dma_rx->request;
  348. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) */
  349. #ifndef SOC_SERIES_STM32U5
  350. i2c_objs[i].dma.handle_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
  351. i2c_objs[i].dma.handle_rx.Init.PeriphInc = DMA_PINC_DISABLE;
  352. i2c_objs[i].dma.handle_rx.Init.MemInc = DMA_MINC_ENABLE;
  353. i2c_objs[i].dma.handle_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  354. i2c_objs[i].dma.handle_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  355. i2c_objs[i].dma.handle_rx.Init.Mode = DMA_NORMAL;
  356. i2c_objs[i].dma.handle_rx.Init.Priority = DMA_PRIORITY_LOW;
  357. #endif /* SOC_SERIES_STM32U5 */
  358. #if defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7)
  359. i2c_objs[i].dma.handle_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  360. i2c_objs[i].dma.handle_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
  361. i2c_objs[i].dma.handle_tx.Init.MemBurst = DMA_MBURST_INC4;
  362. i2c_objs[i].dma.handle_tx.Init.PeriphBurst = DMA_PBURST_INC4;
  363. }
  364. #endif /* defined(SOC_SERIES_STM32F2) || defined(SOC_SERIES_STM32F4) || defined(SOC_SERIES_STM32F7) || defined(SOC_SERIES_STM32MP1) || defined(SOC_SERIES_STM32H7) */
  365. {
  366. rt_uint32_t tmpreg = 0x00U;
  367. #if defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32F0)
  368. /* enable DMA clock && Delay after an RCC peripheral clock enabling*/
  369. SET_BIT(RCC->AHBENR, i2c_config[i].dma_tx->dma_rcc);
  370. tmpreg = READ_BIT(RCC->AHBENR, i2c_config[i].dma_tx->dma_rcc);
  371. #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)
  372. SET_BIT(RCC->AHB1ENR, i2c_config[i].dma_tx->dma_rcc);
  373. /* Delay after an RCC peripheral clock enabling */
  374. tmpreg = READ_BIT(RCC->AHB1ENR, i2c_config[i].dma_tx->dma_rcc);
  375. #elif defined(SOC_SERIES_STM32MP1)
  376. __HAL_RCC_DMAMUX_CLK_ENABLE();
  377. SET_BIT(RCC->MP_AHB2ENSETR, i2c_config[i].dma_tx->dma_rcc);
  378. tmpreg = READ_BIT(RCC->MP_AHB2ENSETR, i2c_config[i].dma_tx->dma_rcc);
  379. #endif /* defined(SOC_SERIES_STM32F1) || defined(SOC_SERIES_STM32G0) || defined(SOC_SERIES_STM32F0) */
  380. UNUSED(tmpreg); /* To avoid compiler warnings */
  381. }
  382. rt_completion_init(&i2c_objs[i].completion);
  383. stm32_i2c_configure(&i2c_objs[i].i2c_bus);
  384. ret = rt_i2c_bus_device_register(&i2c_objs[i].i2c_bus, i2c_objs[i].config->name);
  385. RT_ASSERT(ret == RT_EOK);
  386. LOG_D("%s bus init done", i2c_config[i].name);
  387. }
  388. return ret;
  389. }
  390. static void stm32_get_dma_info(void)
  391. {
  392. #ifdef BSP_I2C1_RX_USING_DMA
  393. i2c_objs[I2C1_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG;
  394. static struct dma_config I2C1_dma_rx = I2C1_RX_DMA_CONFIG;
  395. i2c_config[I2C1_INDEX].dma_rx = &I2C1_dma_rx;
  396. #endif /* BSP_I2C1_RX_USING_DMA */
  397. #ifdef BSP_I2C1_TX_USING_DMA
  398. i2c_objs[I2C1_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG;
  399. static struct dma_config I2C1_dma_tx = I2C1_TX_DMA_CONFIG;
  400. i2c_config[I2C1_INDEX].dma_tx = &I2C1_dma_tx;
  401. #endif /* BSP_I2C1_TX_USING_DMA */
  402. #ifdef BSP_I2C2_RX_USING_DMA
  403. i2c_objs[I2C2_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG;
  404. static struct dma_config I2C2_dma_rx = I2C2_RX_DMA_CONFIG;
  405. i2c_config[I2C2_INDEX].dma_rx = &I2C2_dma_rx;
  406. #endif /* BSP_I2C2_RX_USING_DMA */
  407. #ifdef BSP_I2C2_TX_USING_DMA
  408. i2c_objs[I2C2_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG;
  409. static struct dma_config I2C2_dma_tx = I2C2_TX_DMA_CONFIG;
  410. i2c_config[I2C2_INDEX].dma_tx = &I2C2_dma_tx;
  411. #endif /* BSP_I2C2_TX_USING_DMA */
  412. #ifdef BSP_I2C3_RX_USING_DMA
  413. i2c_objs[I2C3_INDEX].i2c_dma_flag |= I2C_USING_RX_DMA_FLAG;
  414. static struct dma_config I2C3_dma_rx = I2C3_RX_DMA_CONFIG;
  415. i2c_config[I2C3_INDEX].dma_rx = &I2C3_dma_rx;
  416. #endif /* BSP_I2C3_RX_USING_DMA */
  417. #ifdef BSP_I2C3_TX_USING_DMA
  418. i2c_objs[I2C3_INDEX].i2c_dma_flag |= I2C_USING_TX_DMA_FLAG;
  419. static struct dma_config I2C3_dma_tx = I2C3_TX_DMA_CONFIG;
  420. i2c_config[I2C3_INDEX].dma_tx = &I2C3_dma_tx;
  421. #endif /* BSP_I2C3_TX_USING_DMA */
  422. }
  423. void HAL_I2C_MasterTxCpltCallback(I2C_HandleTypeDef *hi2c)
  424. {
  425. struct stm32_i2c *i2c_drv = rt_container_of(hi2c, struct stm32_i2c, handle);
  426. rt_completion_done(&i2c_drv->completion);
  427. }
  428. void HAL_I2C_MasterRxCpltCallback(I2C_HandleTypeDef *hi2c)
  429. {
  430. struct stm32_i2c *i2c_drv = rt_container_of(hi2c, struct stm32_i2c, handle);
  431. rt_completion_done(&i2c_drv->completion);
  432. }
  433. void HAL_I2C_ErrorCallback(I2C_HandleTypeDef *hi2c)
  434. {
  435. #if defined(SOC_SERIES_STM32H7)
  436. /* Send stop signal to prevent bus lock-up */
  437. if (hi2c->ErrorCode == HAL_I2C_ERROR_AF)
  438. {
  439. LOG_D("I2C NACK Error now stoped");
  440. hi2c->Instance->CR1 |= I2C_IT_STOPI;
  441. }
  442. if (hi2c->ErrorCode == HAL_I2C_ERROR_BERR)
  443. {
  444. LOG_D("I2C BUS Error now stoped");
  445. hi2c->Instance->CR1 |= I2C_IT_STOPI;
  446. }
  447. #endif /* defined(SOC_SERIES_STM32H7) */
  448. }
  449. #ifdef BSP_USING_HARD_I2C1
  450. /**
  451. * @brief This function handles I2C2 event interrupt.
  452. */
  453. void I2C1_EV_IRQHandler(void)
  454. {
  455. /* USER CODE BEGIN I2C2_EV_IRQn 0 */
  456. /* enter interrupt */
  457. rt_interrupt_enter();
  458. /* USER CODE END I2C2_EV_IRQn 0 */
  459. HAL_I2C_EV_IRQHandler(&i2c_objs[I2C1_INDEX].handle);
  460. /* USER CODE BEGIN I2C2_EV_IRQn 1 */
  461. /* leave interrupt */
  462. rt_interrupt_leave();
  463. /* USER CODE END I2C2_EV_IRQn 1 */
  464. }
  465. /**
  466. * @brief This function handles I2C2 error interrupt.
  467. */
  468. void I2C1_ER_IRQHandler(void)
  469. {
  470. /* USER CODE BEGIN I2C2_ER_IRQn 0 */
  471. /* enter interrupt */
  472. rt_interrupt_enter();
  473. /* USER CODE END I2C2_ER_IRQn 0 */
  474. HAL_I2C_ER_IRQHandler(&i2c_objs[I2C1_INDEX].handle);
  475. /* USER CODE BEGIN I2C2_ER_IRQn 1 */
  476. /* leave interrupt */
  477. rt_interrupt_leave();
  478. /* USER CODE END I2C2_ER_IRQn 1 */
  479. }
  480. #endif /* BSP_USING_HARD_I2C1 */
  481. #ifdef BSP_USING_HARD_I2C2
  482. /**
  483. * @brief This function handles I2C2 event interrupt.
  484. */
  485. void I2C2_EV_IRQHandler(void)
  486. {
  487. /* USER CODE BEGIN I2C2_EV_IRQn 0 */
  488. /* enter interrupt */
  489. rt_interrupt_enter();
  490. /* USER CODE END I2C2_EV_IRQn 0 */
  491. HAL_I2C_EV_IRQHandler(&i2c_objs[I2C2_INDEX].handle);
  492. /* USER CODE BEGIN I2C2_EV_IRQn 1 */
  493. /* leave interrupt */
  494. rt_interrupt_leave();
  495. /* USER CODE END I2C2_EV_IRQn 1 */
  496. }
  497. /**
  498. * @brief This function handles I2C2 error interrupt.
  499. */
  500. void I2C2_ER_IRQHandler(void)
  501. {
  502. /* USER CODE BEGIN I2C2_ER_IRQn 0 */
  503. /* enter interrupt */
  504. rt_interrupt_enter();
  505. /* USER CODE END I2C2_ER_IRQn 0 */
  506. HAL_I2C_ER_IRQHandler(&i2c_objs[I2C2_INDEX].handle);
  507. /* USER CODE BEGIN I2C2_ER_IRQn 1 */
  508. /* leave interrupt */
  509. rt_interrupt_leave();
  510. /* USER CODE END I2C2_ER_IRQn 1 */
  511. }
  512. #endif /* BSP_USING_HARD_I2C2 */
  513. #ifdef BSP_USING_HARD_I2C3
  514. /**
  515. * @brief This function handles I2C2 event interrupt.
  516. */
  517. void I2C3_EV_IRQHandler(void)
  518. {
  519. /* USER CODE BEGIN I2C2_EV_IRQn 0 */
  520. /* enter interrupt */
  521. rt_interrupt_enter();
  522. /* USER CODE END I2C2_EV_IRQn 0 */
  523. HAL_I2C_EV_IRQHandler(&i2c_objs[I2C3_INDEX].handle);
  524. /* USER CODE BEGIN I2C2_EV_IRQn 1 */
  525. /* leave interrupt */
  526. rt_interrupt_leave();
  527. /* USER CODE END I2C2_EV_IRQn 1 */
  528. }
  529. /**
  530. * @brief This function handles I2C2 error interrupt.
  531. */
  532. void I2C3_ER_IRQHandler(void)
  533. {
  534. /* USER CODE BEGIN I2C2_ER_IRQn 0 */
  535. /* enter interrupt */
  536. rt_interrupt_enter();
  537. /* USER CODE END I2C2_ER_IRQn 0 */
  538. HAL_I2C_ER_IRQHandler(&i2c_objs[I2C3_INDEX].handle);
  539. /* USER CODE BEGIN I2C2_ER_IRQn 1 */
  540. /* leave interrupt */
  541. rt_interrupt_leave();
  542. /* USER CODE END I2C2_ER_IRQn 1 */
  543. }
  544. #endif /* BSP_USING_HARD_I2C3 */
  545. #if defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_RX_USING_DMA)
  546. /**
  547. * @brief This function handles DMA Rx interrupt request.
  548. * @param None
  549. * @retval None
  550. */
  551. void I2C1_DMA_RX_IRQHandler(void)
  552. {
  553. /* enter interrupt */
  554. rt_interrupt_enter();
  555. HAL_DMA_IRQHandler(&i2c_objs[I2C1_INDEX].dma.handle_rx);
  556. /* leave interrupt */
  557. rt_interrupt_leave();
  558. }
  559. #endif /* defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_RX_USING_DMA) */
  560. #if defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_TX_USING_DMA)
  561. /**
  562. * @brief This function handles DMA Rx interrupt request.
  563. * @param None
  564. * @retval None
  565. */
  566. void I2C1_DMA_TX_IRQHandler(void)
  567. {
  568. /* enter interrupt */
  569. rt_interrupt_enter();
  570. HAL_DMA_IRQHandler(&i2c_objs[I2C1_INDEX].dma.handle_tx);
  571. /* leave interrupt */
  572. rt_interrupt_leave();
  573. }
  574. #endif /* defined(BSP_USING_HARD_I2C1) && defined(BSP_I2C1_TX_USING_DMA) */
  575. #if defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_RX_USING_DMA)
  576. /**
  577. * @brief This function handles DMA Rx interrupt request.
  578. * @param None
  579. * @retval None
  580. */
  581. void I2C2_DMA_RX_IRQHandler(void)
  582. {
  583. /* enter interrupt */
  584. rt_interrupt_enter();
  585. HAL_DMA_IRQHandler(&i2c_objs[I2C2_INDEX].dma.handle_rx);
  586. /* leave interrupt */
  587. rt_interrupt_leave();
  588. }
  589. #endif /* defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_RX_USING_DMA) */
  590. #if defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_TX_USING_DMA)
  591. /**
  592. * @brief This function handles DMA Rx interrupt request.
  593. * @param None
  594. * @retval None
  595. */
  596. void I2C2_DMA_TX_IRQHandler(void)
  597. {
  598. /* enter interrupt */
  599. rt_interrupt_enter();
  600. HAL_DMA_IRQHandler(&i2c_objs[I2C2_INDEX].dma.handle_tx);
  601. /* leave interrupt */
  602. rt_interrupt_leave();
  603. }
  604. #endif /* defined(BSP_USING_HARD_I2C2) && defined(BSP_I2C2_TX_USING_DMA) */
  605. #if defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_RX_USING_DMA)
  606. /**
  607. * @brief This function handles DMA Rx interrupt request.
  608. * @param None
  609. * @retval None
  610. */
  611. void I2C3_DMA_RX_IRQHandler(void)
  612. {
  613. /* enter interrupt */
  614. rt_interrupt_enter();
  615. HAL_DMA_IRQHandler(&i2c_objs[I2C3_INDEX].dma.handle_rx);
  616. /* leave interrupt */
  617. rt_interrupt_leave();
  618. }
  619. #endif /* defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_RX_USING_DMA) */
  620. #if defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_TX_USING_DMA)
  621. /**
  622. * @brief This function handles DMA Rx interrupt request.
  623. * @param None
  624. * @retval None
  625. */
  626. void I2C3_DMA_TX_IRQHandler(void)
  627. {
  628. /* enter interrupt */
  629. rt_interrupt_enter();
  630. HAL_DMA_IRQHandler(&i2c_objs[I2C3_INDEX].dma.handle_tx);
  631. /* leave interrupt */
  632. rt_interrupt_leave();
  633. }
  634. #endif /* defined(BSP_USING_HARD_I2C3) && defined(BSP_I2C3_TX_USING_DMA) */
  635. #if defined(BSP_USING_I2C4) && defined(BSP_I2C4_RX_USING_DMA)
  636. /**
  637. * @brief This function handles DMA Rx interrupt request.
  638. * @param None
  639. * @retval None
  640. */
  641. void I2C4_DMA_RX_IRQHandler(void)
  642. {
  643. /* enter interrupt */
  644. rt_interrupt_enter();
  645. HAL_DMA_IRQHandler(&i2c_objs[I2C4_INDEX].dma.handle_rx);
  646. /* leave interrupt */
  647. rt_interrupt_leave();
  648. }
  649. #endif /* defined(BSP_USING_I2C4) && defined(BSP_I2C4_RX_USING_DMA) */
  650. #if defined(BSP_USING_I2C4) && defined(BSP_I2C4_TX_USING_DMA)
  651. /**
  652. * @brief This function handles DMA Rx interrupt request.
  653. * @param None
  654. * @retval None
  655. */
  656. void I2C4_DMA_TX_IRQHandler(void)
  657. {
  658. /* enter interrupt */
  659. rt_interrupt_enter();
  660. HAL_DMA_IRQHandler(&i2c_objs[I2C4_INDEX].dma.handle_tx);
  661. /* leave interrupt */
  662. rt_interrupt_leave();
  663. }
  664. #endif /* defined(BSP_USING_I2C4) && defined(BSP_I2C4_TX_USING_DMA) */
  665. int rt_hw_hw_i2c_init(void)
  666. {
  667. stm32_get_dma_info();
  668. return RT_hw_i2c_bus_init();
  669. }
  670. INIT_CORE_EXPORT(rt_hw_hw_i2c_init);
  671. #endif /* defined(BSP_USING_HARD_I2C1) || defined(BSP_USING_HARD_I2C2) || defined(BSP_USING_HARD_I2C3) */