stm32f1_i2c.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2017-07-04 aubrcool@qq.com 1st version
  9. */
  10. #include "stm32f10x.h"
  11. #include "stm32f1_i2c.h"
  12. #include <rtdevice.h>
  13. #ifdef RT_USING_I2C
  14. /* I2C SPE mask */
  15. #define CR1_PE_Set ((uint16_t)0x0001)
  16. #define CR1_PE_Reset ((uint16_t)0xFFFE)
  17. /* I2C START mask */
  18. #define CR1_START_Set ((uint16_t)0x0100)
  19. #define CR1_START_Reset ((uint16_t)0xFEFF)
  20. /* I2C STOP mask */
  21. #define CR1_STOP_Set ((uint16_t)0x0200)
  22. #define CR1_STOP_Reset ((uint16_t)0xFDFF)
  23. /* I2C ACK mask */
  24. #define CR1_ACK_Set ((uint16_t)0x0400)
  25. #define CR1_ACK_Reset ((uint16_t)0xFBFF)
  26. /* I2C ENGC mask */
  27. #define CR1_ENGC_Set ((uint16_t)0x0040)
  28. #define CR1_ENGC_Reset ((uint16_t)0xFFBF)
  29. /* I2C SWRST mask */
  30. #define CR1_SWRST_Set ((uint16_t)0x8000)
  31. #define CR1_SWRST_Reset ((uint16_t)0x7FFF)
  32. /* I2C PEC mask */
  33. #define CR1_PEC_Set ((uint16_t)0x1000)
  34. #define CR1_PEC_Reset ((uint16_t)0xEFFF)
  35. /* I2C ENPEC mask */
  36. #define CR1_ENPEC_Set ((uint16_t)0x0020)
  37. #define CR1_ENPEC_Reset ((uint16_t)0xFFDF)
  38. /* I2C ENARP mask */
  39. #define CR1_ENARP_Set ((uint16_t)0x0010)
  40. #define CR1_ENARP_Reset ((uint16_t)0xFFEF)
  41. /* I2C NOSTRETCH mask */
  42. #define CR1_NOSTRETCH_Set ((uint16_t)0x0080)
  43. #define CR1_NOSTRETCH_Reset ((uint16_t)0xFF7F)
  44. /* I2C registers Masks */
  45. #define CR1_CLEAR_Mask ((uint16_t)0xFBF5)
  46. /* I2C DMAEN mask */
  47. #define CR2_DMAEN_Set ((uint16_t)0x0800)
  48. #define CR2_DMAEN_Reset ((uint16_t)0xF7FF)
  49. /* I2C LAST mask */
  50. #define CR2_LAST_Set ((uint16_t)0x1000)
  51. #define CR2_LAST_Reset ((uint16_t)0xEFFF)
  52. /* I2C FREQ mask */
  53. #define CR2_FREQ_Reset ((uint16_t)0xFFC0)
  54. /* I2C ADD0 mask */
  55. #define OAR1_ADD0_Set ((uint16_t)0x0001)
  56. #define OAR1_ADD0_Reset ((uint16_t)0xFFFE)
  57. /* I2C ENDUAL mask */
  58. #define OAR2_ENDUAL_Set ((uint16_t)0x0001)
  59. #define OAR2_ENDUAL_Reset ((uint16_t)0xFFFE)
  60. /* I2C ADD2 mask */
  61. #define OAR2_ADD2_Reset ((uint16_t)0xFF01)
  62. /* I2C F/S mask */
  63. #define CCR_FS_Set ((uint16_t)0x8000)
  64. /* I2C CCR mask */
  65. #define CCR_CCR_Set ((uint16_t)0x0FFF)
  66. /* I2C FLAG mask */
  67. #define FLAG_Mask ((uint32_t)0x00FFFFFF)
  68. /* I2C Interrupt Enable mask */
  69. #define ITEN_Mask ((uint32_t)0x07000000)
  70. #define I2CADDR 0x0A
  71. enum
  72. {
  73. EV_END = 0,
  74. };
  75. #ifdef RT_USING_I2C1
  76. static struct stm32_i2c_bus stm32_i2c1 =
  77. {
  78. .I2C = I2C1,
  79. };
  80. #endif /*RT_USING_I2C1*/
  81. #ifdef RT_USING_I2C2
  82. static struct stm32_i2c_bus stm32_i2c2 =
  83. {
  84. .I2C = I2C2,
  85. };
  86. #endif /*RT_USING_I2C2*/
  87. rt_inline rt_err_t stm32_i2c_wait_ev(struct stm32_i2c_bus *bus,
  88. rt_uint32_t ev, rt_uint32_t timeout)
  89. {
  90. rt_uint32_t res = 0;
  91. rt_event_recv(&bus->ev, 0x01 << ev,
  92. RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
  93. timeout, &res);
  94. if(res != ev)
  95. {
  96. return RT_ERROR;
  97. }
  98. else
  99. {
  100. return RT_EOK;
  101. }
  102. }
  103. rt_inline void stm32_i2c_send_ev(struct stm32_i2c_bus *bus, rt_uint32_t ev)
  104. {
  105. rt_event_send(&bus->ev, 0x01 << ev);
  106. }
  107. static rt_size_t stm_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
  108. struct rt_i2c_msg msgs[],
  109. rt_uint32_t num);
  110. static rt_size_t stm_i2c_slv_xfer(struct rt_i2c_bus_device *bus,
  111. struct rt_i2c_msg msgs[],
  112. rt_uint32_t num);
  113. static rt_err_t stm_i2c_bus_control(struct rt_i2c_bus_device *bus,
  114. rt_uint32_t,
  115. rt_uint32_t);
  116. static const struct rt_i2c_bus_device_ops stm32_i2c_ops =
  117. {
  118. stm_i2c_mst_xfer,
  119. stm_i2c_slv_xfer,
  120. stm_i2c_bus_control,
  121. };
  122. rt_inline void stm32_i2c_disable_nvic(I2C_TypeDef *I2C, rt_uint32_t value)
  123. {
  124. NVIC_InitTypeDef NVIC_InitStructure;
  125. rt_uint32_t evno, erno;
  126. if(I2C == I2C1)
  127. {
  128. evno = I2C1_EV_IRQn;
  129. erno = I2C1_ER_IRQn;
  130. }
  131. else
  132. {
  133. evno = I2C2_EV_IRQn;
  134. erno = I2C2_ER_IRQn;
  135. }
  136. NVIC_InitStructure.NVIC_IRQChannel = evno;
  137. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  138. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
  139. NVIC_InitStructure.NVIC_IRQChannelCmd = value;
  140. NVIC_Init(&NVIC_InitStructure);
  141. NVIC_InitStructure.NVIC_IRQChannel = erno;
  142. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  143. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 6;
  144. NVIC_InitStructure.NVIC_IRQChannelCmd = value;
  145. NVIC_Init(&NVIC_InitStructure);
  146. }
  147. static void stm32_i2c_nvic_Config(I2C_TypeDef *I2C)
  148. {
  149. stm32_i2c_disable_nvic(I2C, ENABLE);
  150. }
  151. static rt_err_t stm_i2c_init(struct rt_i2c_bus_device *bus, rt_uint32_t bitrate)
  152. {
  153. struct stm32_i2c_bus *stm32_i2c;
  154. I2C_InitTypeDef I2C_InitStructure;
  155. RT_ASSERT(bus != RT_NULL);
  156. if(bitrate != 100000 && bitrate != 400000)
  157. {
  158. return RT_EIO;
  159. }
  160. stm32_i2c = (struct stm32_i2c_bus *) bus;
  161. I2C_Cmd(stm32_i2c->I2C, DISABLE);
  162. I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  163. I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  164. I2C_InitStructure.I2C_OwnAddress1 = I2CADDR;
  165. I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  166. I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  167. I2C_InitStructure.I2C_ClockSpeed = bitrate;
  168. I2C_Init(stm32_i2c->I2C, &I2C_InitStructure);
  169. I2C_Cmd(stm32_i2c->I2C, ENABLE);
  170. I2C_ITConfig(stm32_i2c->I2C, I2C_IT_EVT | I2C_IT_BUF | I2C_IT_ERR, ENABLE);
  171. stm32_i2c_nvic_Config(stm32_i2c->I2C);
  172. return RT_EOK;
  173. }
  174. static rt_size_t stm_i2c_mst_xfer(struct rt_i2c_bus_device *bus,
  175. struct rt_i2c_msg msgs[],
  176. rt_uint32_t num)
  177. {
  178. struct stm32_i2c_bus *stm32_i2c;
  179. rt_uint32_t numbak = num;
  180. RT_ASSERT(bus != RT_NULL);
  181. stm32_i2c = (struct stm32_i2c_bus *) bus;
  182. stm32_i2c->msg = msgs;
  183. stm32_i2c->msg_ptr = 0;
  184. stm32_i2c->msg_cnt = num;
  185. stm32_i2c->dptr = 0;
  186. stm32_i2c->wait_stop = 0;
  187. I2C_GetLastEvent(stm32_i2c->I2C);
  188. while(stm32_i2c->msg_ptr < stm32_i2c->msg_cnt)
  189. {
  190. stm32_i2c->wait_stop = 0;
  191. if(!(stm32_i2c->msg[stm32_i2c->msg_ptr].flags & RT_I2C_NO_START))
  192. {
  193. stm32_i2c->I2C->CR1 |= CR1_START_Set;
  194. }
  195. stm32_i2c_wait_ev(stm32_i2c, EV_END, 1000);
  196. }
  197. stm32_i2c->msg = RT_NULL;
  198. stm32_i2c->msg_ptr = 0;
  199. stm32_i2c->msg_cnt = 0;
  200. stm32_i2c->dptr = 0;
  201. stm32_i2c->wait_stop = 0;
  202. return numbak;
  203. }
  204. static rt_size_t stm_i2c_slv_xfer(struct rt_i2c_bus_device *bus,
  205. struct rt_i2c_msg msgs[],
  206. rt_uint32_t num)
  207. {
  208. return 0;
  209. }
  210. static rt_err_t stm_i2c_bus_control(struct rt_i2c_bus_device *bus,
  211. rt_uint32_t cmd,
  212. rt_uint32_t arg)
  213. {
  214. return RT_ERROR;
  215. }
  216. rt_inline void stm32_i2c_ev_handler(struct stm32_i2c_bus *stm32_i2c)
  217. {
  218. unsigned int I2C_Event;
  219. rt_uint8_t data = 0;
  220. struct rt_i2c_msg *pmsg;
  221. I2C_Event = I2C_GetLastEvent(stm32_i2c->I2C);
  222. if(!stm32_i2c->msg)
  223. {
  224. return;
  225. }
  226. // EV5 0x00030001
  227. if ((I2C_Event & I2C_EVENT_MASTER_MODE_SELECT) == I2C_EVENT_MASTER_MODE_SELECT)
  228. {
  229. // EV5 0x00030001
  230. pmsg = &stm32_i2c->msg[stm32_i2c->msg_ptr];
  231. if(pmsg->flags & RT_I2C_ADDR_10BIT)
  232. {
  233. data = ((pmsg->addr >> 8) << 1) | 0xF0;
  234. }
  235. else
  236. {
  237. data = pmsg->addr << 1;
  238. }
  239. if(pmsg->flags & RT_I2C_RD)
  240. {
  241. data |= 0x01;
  242. }
  243. stm32_i2c->I2C->DR = data;
  244. if(!(pmsg->flags & RT_I2C_RD))
  245. {
  246. return;
  247. }
  248. if(pmsg->len > 1)
  249. {
  250. stm32_i2c->I2C->CR1 |= CR1_ACK_Set;
  251. return;
  252. }
  253. }
  254. else if((I2C_Event & I2C_EVENT_MASTER_MODE_ADDRESS10) ==
  255. I2C_EVENT_MASTER_MODE_ADDRESS10)
  256. {
  257. // EV9
  258. data = pmsg->addr & 0xFF;
  259. stm32_i2c->I2C->DR = data;
  260. }
  261. else if((I2C_Event & I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) ==
  262. I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)
  263. {
  264. //EVT 6 SEND 0x00070082
  265. }
  266. else if ((I2C_Event & I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) ==
  267. I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)
  268. {
  269. //EVT 6 RECE 0x00030002
  270. pmsg = &stm32_i2c->msg[stm32_i2c->msg_ptr];
  271. if(!(pmsg->flags & RT_I2C_RD))
  272. {
  273. return;
  274. }
  275. if(pmsg->len > 1)
  276. {
  277. return;
  278. }
  279. if(stm32_i2c->msg_ptr < stm32_i2c->msg_cnt - 1)
  280. {
  281. return;
  282. }
  283. else if((pmsg[1].flags & RT_I2C_NO_START))
  284. {
  285. return;
  286. }
  287. stm32_i2c->I2C->CR1 |= CR1_STOP_Set;
  288. stm32_i2c->I2C->CR1 &= CR1_ACK_Reset;
  289. }
  290. else if ((I2C_Event & I2C_EVENT_MASTER_BYTE_RECEIVED) ==
  291. I2C_EVENT_MASTER_BYTE_RECEIVED)
  292. {
  293. // EVT 7 0x00030040
  294. pmsg = &stm32_i2c->msg[stm32_i2c->msg_ptr];
  295. if(pmsg->len && (pmsg->flags & RT_I2C_RD))
  296. {
  297. pmsg->buf[stm32_i2c->dptr] = stm32_i2c->I2C->DR;
  298. stm32_i2c->dptr++;
  299. pmsg->len--;
  300. }
  301. if(pmsg->len == 1 && (pmsg->flags & RT_I2C_RD))
  302. {
  303. if(stm32_i2c->msg_ptr >= stm32_i2c->msg_cnt - 1)
  304. {
  305. stm32_i2c->I2C->CR1 &= CR1_ACK_Reset;
  306. stm32_i2c->I2C->CR1 |= CR1_STOP_Set;
  307. }
  308. else if(!(pmsg[1].flags & RT_I2C_NO_START))
  309. {
  310. stm32_i2c->I2C->CR1 &= CR1_ACK_Reset;
  311. stm32_i2c->I2C->CR1 |= CR1_STOP_Set;
  312. }
  313. }
  314. if(pmsg->len)
  315. {
  316. return;
  317. }
  318. stm32_i2c->dptr = 0;
  319. stm32_i2c->msg_ptr++;
  320. if(stm32_i2c->msg_ptr < stm32_i2c->msg_cnt)
  321. {
  322. return;
  323. }
  324. stm32_i2c->I2C->CR1 |= CR1_ACK_Set;
  325. stm32_i2c_send_ev(stm32_i2c, EV_END);
  326. }
  327. else if((I2C_Event & I2C_EVENT_MASTER_BYTE_TRANSMITTING) ==
  328. I2C_EVENT_MASTER_BYTE_TRANSMITTING)
  329. {
  330. //EVT8 0x00070080
  331. if(stm32_i2c->wait_stop == 0xAAAA5555)
  332. {
  333. stm32_i2c->wait_stop = 0;
  334. stm32_i2c->I2C->CR1 |= CR1_STOP_Set;
  335. stm32_i2c_send_ev(stm32_i2c, EV_END);
  336. return;
  337. }
  338. if(stm32_i2c->wait_stop == 0x5555AAAA)
  339. { //restart cond
  340. stm32_i2c->wait_stop = 0;
  341. stm32_i2c_send_ev(stm32_i2c, EV_END);
  342. return;
  343. }
  344. pmsg = &stm32_i2c->msg[stm32_i2c->msg_ptr];
  345. if(!(pmsg->flags & RT_I2C_RD) && pmsg->len)
  346. {
  347. stm32_i2c->I2C->DR = pmsg->buf[stm32_i2c->dptr];
  348. stm32_i2c->dptr++;
  349. pmsg->len--;
  350. }
  351. if(!(pmsg->flags & RT_I2C_RD) && pmsg->len)
  352. {
  353. return;
  354. }
  355. if(stm32_i2c->msg_ptr < stm32_i2c->msg_cnt - 1 && pmsg->len == 0)
  356. {
  357. stm32_i2c->msg_ptr++;
  358. stm32_i2c->dptr = 0;
  359. pmsg = &stm32_i2c->msg[stm32_i2c->msg_ptr];
  360. if(pmsg->flags & RT_I2C_NO_START)
  361. {
  362. return;
  363. }
  364. else
  365. {
  366. stm32_i2c->wait_stop == 0x5555AAAA;
  367. return;
  368. }
  369. }
  370. if(stm32_i2c->msg_ptr < stm32_i2c->msg_cnt && pmsg->len == 0)
  371. {
  372. stm32_i2c->msg_ptr++;
  373. stm32_i2c->dptr = 0;
  374. }
  375. stm32_i2c->wait_stop = 0xAAAA5555;
  376. }
  377. }
  378. #ifdef RT_USING_I2C1
  379. void I2C1_EV_IRQHandler(void)
  380. {
  381. /* enter interrupt */
  382. rt_interrupt_enter();
  383. stm32_i2c_ev_handler(&stm32_i2c1);
  384. /* leave interrupt */
  385. rt_interrupt_leave();
  386. }
  387. #endif /*RT_USING_I2C1*/
  388. #ifdef RT_USING_I2C2
  389. void I2C2_EV_IRQHandler(void)
  390. {
  391. /* enter interrupt */
  392. rt_interrupt_enter();
  393. stm32_i2c_ev_handler(&stm32_i2c2);
  394. /* leave interrupt */
  395. rt_interrupt_leave();
  396. }
  397. #endif /*RT_USING_I2C2*/
  398. rt_inline void stm32_i2c_er_handler(struct stm32_i2c_bus *stm32_i2c)
  399. {
  400. if (I2C2->SR1 & 1 << 10)
  401. {
  402. I2C2->SR1 &= ~(1 << 10);
  403. }
  404. if (I2C2->SR1 & 1 << 14)
  405. {
  406. I2C2->SR1 &= ~(1 << 14);
  407. }
  408. if (I2C2->SR1 & 1 << 11)
  409. {
  410. I2C2->SR1 &= ~(1 << 11);
  411. }
  412. if (I2C2->SR1 & 1 << 9)
  413. {
  414. I2C2->SR1 &= ~(1 << 9);
  415. }
  416. if (I2C2->SR1 & 1 << 8)
  417. {
  418. I2C2->SR1 &= ~(1 << 8);
  419. }
  420. }
  421. #ifdef RT_USING_I2C1
  422. void I2C1_ER_IRQHandler(void) //I2C2 Error Interrupt
  423. {
  424. /* enter interrupt */
  425. rt_interrupt_enter();
  426. stm32_i2c_er_handler(&stm32_i2c1);
  427. /* leave interrupt */
  428. rt_interrupt_leave();
  429. }
  430. #endif /*RT_USING_I2C1*/
  431. #ifdef RT_USING_I2C2
  432. void I2C2_ER_IRQHandler(void) //I2C2 Error Interrupt
  433. {
  434. /* enter interrupt */
  435. rt_interrupt_enter();
  436. stm32_i2c_er_handler(&stm32_i2c2);
  437. /* leave interrupt */
  438. rt_interrupt_leave();
  439. }
  440. #endif /*RT_USING_I2C2*/
  441. rt_err_t stm32_i2c_register(I2C_TypeDef *I2C, rt_uint32_t bitrate,
  442. const char * i2c_bus_name)
  443. {
  444. struct stm32_i2c_bus *pi2c;
  445. rt_err_t res;
  446. #ifdef RT_USING_I2C1
  447. if(I2C == I2C1)
  448. {
  449. pi2c = &stm32_i2c1;
  450. RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
  451. }
  452. else
  453. #endif /*RT_USING_I2C1*/
  454. #ifdef RT_USING_I2C2
  455. if(I2C == I2C2)
  456. {
  457. pi2c = &stm32_i2c2;
  458. RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);
  459. }
  460. else
  461. #endif /*RT_USING_I2C2*/
  462. {
  463. return RT_ENOSYS;
  464. }
  465. if(rt_event_init(&pi2c->ev, i2c_bus_name, RT_IPC_FLAG_FIFO) != RT_EOK)
  466. {
  467. return RT_ERROR;
  468. }
  469. pi2c->parent.ops = &stm32_i2c_ops;
  470. if((res = stm_i2c_init(&pi2c->parent, bitrate)) != RT_EOK)
  471. {
  472. return res;
  473. }
  474. return rt_i2c_bus_device_register(&pi2c->parent, i2c_bus_name);
  475. }
  476. #endif /*RT_USING_I2C*/