drv_hard_i2c.c 27 KB

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