HW_I2C_ATY.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687
  1. /**
  2. * @file HW_I2C_ATY.c
  3. *
  4. * @param Project DEVICE_GENERAL_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2025 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief Familiar functions of I2C for all embedded device
  20. *
  21. * @version
  22. * - 1_01_220602 > ATY
  23. * -# Preliminary version, first Release
  24. * - 1_02_220804 > ATY
  25. * -# Change delay flow
  26. * -# Change SDA set function
  27. * -# Add Read/Write function
  28. * - 1_02_240108 > ATY
  29. * -# add multy addr and channel
  30. * - 1_01_240111 > ATY
  31. * -# add lock
  32. ********************************************************************************
  33. */
  34. #ifndef __HW_I2C_ATY_C
  35. #define __HW_I2C_ATY_C
  36. #include "HW_I2C_ATY.h"
  37. /******************************* For user *************************************/
  38. /******************************************************************************/
  39. /**
  40. * @brief Star I2C bus
  41. *
  42. * @param dev
  43. * @return uint8_t
  44. * @note START:when CLK is high,DATA change form high to low
  45. */
  46. uint8_t I2C_Start(struct HW_I2C_ATY_Dev* dev)
  47. {
  48. __ATY_LOCK(dev);
  49. dev->sdaSet('I', _ATY_IO_O);
  50. dev->delay(SHORT_DELAY);
  51. dev->sdaSet('L', _ATY_HL_H);
  52. dev->sclSet(_ATY_HL_H);
  53. dev->delay(SHORT_DELAY);
  54. dev->sdaSet('L', _ATY_HL_L);
  55. dev->delay(SHORT_DELAY);
  56. dev->sclSet(_ATY_HL_L);
  57. __ATY_UNLOCK(dev);
  58. return 0;
  59. }
  60. /**
  61. * @brief Stop I2C bus
  62. *
  63. * @param dev
  64. * @return uint8_t
  65. * @note STOP:when CLK is high DATA change form low to high
  66. */
  67. uint8_t I2C_Stop(struct HW_I2C_ATY_Dev* dev)
  68. {
  69. __ATY_LOCK(dev);
  70. dev->sdaSet('I', _ATY_IO_O);
  71. dev->delay(SHORT_DELAY);
  72. dev->sclSet(_ATY_HL_L);
  73. dev->sdaSet('L', _ATY_HL_L);
  74. dev->delay(SHORT_DELAY);
  75. dev->sclSet(_ATY_HL_H);
  76. dev->delay(SHORT_DELAY);
  77. dev->sdaSet('L', _ATY_HL_H);
  78. __ATY_UNLOCK(dev);
  79. return 0;
  80. }
  81. /**
  82. * @brief I2C ack
  83. *
  84. * @param dev
  85. * @return uint8_t
  86. */
  87. uint8_t I2C_Ack(struct HW_I2C_ATY_Dev* dev)
  88. {
  89. __ATY_LOCK(dev);
  90. dev->sdaSet('I', _ATY_IO_O);
  91. dev->delay(SHORT_DELAY);
  92. dev->sclSet(_ATY_HL_L);
  93. dev->sdaSet('L', _ATY_HL_L);
  94. dev->delay(SHORT_DELAY);
  95. dev->sclSet(_ATY_HL_H);
  96. dev->delay(SHORT_DELAY);
  97. dev->sclSet(_ATY_HL_L);
  98. __ATY_UNLOCK(dev);
  99. return 0;
  100. }
  101. /**
  102. * @brief I2C no ack
  103. *
  104. * @param dev
  105. * @return uint8_t
  106. */
  107. uint8_t I2C_NoAck(struct HW_I2C_ATY_Dev* dev)
  108. {
  109. __ATY_LOCK(dev);
  110. dev->sdaSet('I', _ATY_IO_O);
  111. dev->delay(SHORT_DELAY);
  112. dev->sclSet(_ATY_HL_L);
  113. dev->sdaSet('L', _ATY_HL_H);
  114. dev->delay(SHORT_DELAY);
  115. dev->sclSet(_ATY_HL_H);
  116. dev->delay(SHORT_DELAY);
  117. dev->sclSet(_ATY_HL_L);
  118. __ATY_UNLOCK(dev);
  119. return 0;
  120. }
  121. /**
  122. * @brief Wait ack coming
  123. *
  124. * @param maxErrTime max time to wait until fail
  125. * @param dev
  126. * @return 0 success, !0: fail
  127. */
  128. uint8_t I2C_WaitAck(uint16_t maxErrTime, struct HW_I2C_ATY_Dev* dev)
  129. {
  130. uint16_t errTime = 0;
  131. __ATY_LOCK(dev);
  132. dev->sdaSet('I', _ATY_IO_I);
  133. dev->delay(SHORT_DELAY);
  134. dev->sclSet(_ATY_HL_H);
  135. dev->delay(SHORT_DELAY);
  136. while(dev->sdaGet() == 1)
  137. {
  138. errTime++;
  139. dev->delay(2);
  140. if(errTime > maxErrTime)
  141. {
  142. __ATY_UNLOCK(dev);
  143. I2C_Stop(dev);
  144. return 1;
  145. }
  146. }
  147. dev->sclSet(_ATY_HL_L);
  148. __ATY_UNLOCK(dev);
  149. return 0;
  150. }
  151. /**
  152. * @brief I2C send one byte
  153. *
  154. * @param byte data to send
  155. * @param dev
  156. * @return uint8_t
  157. */
  158. uint8_t I2C_WriteByte(uint8_t byte, struct HW_I2C_ATY_Dev* dev)
  159. {
  160. uint8_t isb_i;
  161. __ATY_LOCK(dev);
  162. dev->sdaSet('I', _ATY_IO_O);
  163. dev->delay(LONG_DELAY);
  164. dev->sclSet(_ATY_HL_L);
  165. for(isb_i = 0; isb_i < 8; isb_i++)
  166. {
  167. dev->delay(SHORT_DELAY);
  168. if((byte & 0x80) >> 7)
  169. dev->sdaSet('L', _ATY_HL_H);
  170. else
  171. dev->sdaSet('L', _ATY_HL_L);
  172. dev->delay(SHORT_DELAY);
  173. dev->sclSet(_ATY_HL_H);
  174. dev->delay(SHORT_DELAY);
  175. dev->sclSet(_ATY_HL_L);
  176. byte <<= 1;
  177. }
  178. dev->delay(SHORT_DELAY);
  179. dev->sdaSet('L', _ATY_HL_H);
  180. dev->delay(SHORT_DELAY);
  181. dev->sclSet(_ATY_HL_H);
  182. // dev->delay(SHORT_DELAY);
  183. // dev->sclSet(_ATY_HL_L);
  184. __ATY_UNLOCK(dev);
  185. return 0;
  186. }
  187. /**
  188. * @brief I2C read one byte
  189. *
  190. * @param ack if send ACK or not
  191. * @param dev
  192. * @return data to read
  193. */
  194. uint8_t I2C_ReadByte(uint8_t ack, struct HW_I2C_ATY_Dev* dev)
  195. {
  196. uint8_t irb_i, byte = 0;
  197. __ATY_LOCK(dev);
  198. dev->sdaSet('I', _ATY_IO_I);
  199. dev->delay(LONG_DELAY);
  200. for(irb_i = 0; irb_i < 8; irb_i++)
  201. {
  202. dev->sclSet(_ATY_HL_L);
  203. dev->delay(SHORT_DELAY);
  204. dev->sclSet(_ATY_HL_H);
  205. dev->delay(SHORT_DELAY);
  206. byte <<= 1;
  207. if(dev->sdaGet() == 1) byte++;
  208. }
  209. dev->sclSet(_ATY_HL_L);
  210. __ATY_UNLOCK(dev);
  211. if(ack)
  212. I2C_Ack(dev);
  213. else
  214. I2C_NoAck(dev);
  215. return byte;
  216. }
  217. /**
  218. * @brief Write serial data to reg
  219. *
  220. * @param addr slave machine address
  221. * @param data_t data to write(uint8)
  222. * @param len length of write data(uint8)
  223. * @param dev
  224. * @return 0: success, !0: error
  225. */
  226. uint8_t I2C_Write(uint8_t addr, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev)
  227. {
  228. if(dev->hardwareEnable == 1){
  229. uint8_t errCode = 0;
  230. __ATY_LOCK(dev);
  231. errCode = dev->i2cProcess((addr << 1 | 0), data_t, len, _ATY_RW_W);
  232. __ATY_UNLOCK(dev);
  233. return errCode;
  234. }
  235. else{
  236. uint8_t i = 0;
  237. I2C_Start(dev);
  238. I2C_WriteByte((addr << 1 | 0), dev);
  239. if(I2C_WaitAck(I2C_WAIT_ACK_TIME, dev))
  240. return 1;
  241. for(i = 0; i < len; i++)
  242. {
  243. I2C_WriteByte(data_t[i], dev);
  244. if(I2C_WaitAck(I2C_WAIT_ACK_TIME, dev))
  245. return 1;
  246. }
  247. I2C_Stop(dev);
  248. return 0;
  249. }
  250. }
  251. /**
  252. * @brief Write serial data to reg
  253. *
  254. * @param addr slave machine address
  255. * @param data_t data to write(uint8)
  256. * @param len length of write data(uint8)
  257. * @param dev
  258. * @return 0: success, !0: error
  259. */
  260. uint8_t I2C_Write_NoStop(uint8_t addr, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev)
  261. {
  262. uint8_t i = 0;
  263. I2C_Start(dev);
  264. I2C_WriteByte((addr << 1 | 0), dev);
  265. if(I2C_WaitAck(I2C_WAIT_ACK_TIME, dev))
  266. return 1;
  267. for(i = 0; i < len; i++)
  268. {
  269. I2C_WriteByte(data_t[i], dev);
  270. if(I2C_WaitAck(I2C_WAIT_ACK_TIME, dev))
  271. return 1;
  272. }
  273. return 0;
  274. }
  275. /**
  276. * @brief Read serial data to reg
  277. *
  278. * @param addr slave machine address
  279. * @param data_t data to read(uint8)
  280. * @param len length of read data(uint8)
  281. * @param dev
  282. * @return 0: success, !0: error
  283. */
  284. uint8_t I2C_Read(uint8_t addr, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev)
  285. {
  286. if(dev->hardwareEnable == 1){
  287. uint8_t errCode = 0;
  288. __ATY_LOCK(dev);
  289. errCode = dev->i2cProcess((addr << 1 | 1), data_t, len, _ATY_RW_R);
  290. __ATY_UNLOCK(dev);
  291. return errCode;
  292. }
  293. else{
  294. I2C_Start(dev);
  295. I2C_WriteByte((addr << 1 | 1), dev);
  296. if(I2C_WaitAck(I2C_WAIT_ACK_TIME, dev))
  297. return 1;
  298. while(len--)
  299. {
  300. if(len > 0)
  301. *data_t++ = I2C_ReadByte(1, dev);
  302. else
  303. *data_t++ = I2C_ReadByte(0, dev);
  304. }
  305. I2C_Stop(dev);
  306. return 0;
  307. }
  308. }
  309. /**
  310. * @brief Write serial data to reg
  311. *
  312. * @param addr slave machine address
  313. * @param reg reg addr to write
  314. * @param data_t data to write(uint8)
  315. * @param len length of write data(uint8)
  316. * @param dev
  317. * @return 0: success, !0: error
  318. */
  319. uint8_t I2C_WriteReg(uint8_t addr, uint8_t reg, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev)
  320. {
  321. uint8_t i = 0;
  322. I2C_Start(dev);
  323. I2C_WriteByte((addr << 1 | 0), dev);
  324. if(I2C_WaitAck(I2C_WAIT_ACK_TIME, dev))
  325. {
  326. I2C_Stop(dev);
  327. return 1;
  328. }
  329. if(reg != 0)
  330. {
  331. I2C_WriteByte(reg, dev);
  332. I2C_WaitAck(I2C_WAIT_ACK_TIME, dev);
  333. }
  334. for(i = 0; i < len; i++)
  335. {
  336. I2C_WriteByte(data_t[i], dev);
  337. if(I2C_WaitAck(I2C_WAIT_ACK_TIME, dev))
  338. {
  339. I2C_Stop(dev);
  340. return 1;
  341. }
  342. }
  343. I2C_Stop(dev);
  344. return 0;
  345. }
  346. /**
  347. * @brief Read serial data to reg
  348. *
  349. * @param addr slave machine address
  350. * @param reg reg addr to read
  351. * @param data_t data to read(uint8)
  352. * @param len length of read data(uint8)
  353. * @param dev
  354. * @return 0: success, !0: error
  355. */
  356. uint8_t I2C_ReadReg(uint8_t addr, uint8_t reg, uint8_t* data_t, uint8_t len, struct HW_I2C_ATY_Dev* dev)
  357. {
  358. I2C_Start(dev);
  359. I2C_WriteByte((addr << 1 | 0), dev);
  360. if(I2C_WaitAck(I2C_WAIT_ACK_TIME, dev))
  361. {
  362. I2C_Stop(dev);
  363. return 1;
  364. }
  365. I2C_WriteByte(reg, dev);
  366. I2C_WaitAck(I2C_WAIT_ACK_TIME, dev);
  367. I2C_Stop(dev);
  368. I2C_Start(dev);
  369. I2C_WriteByte((addr << 1 | 1), dev);
  370. I2C_WaitAck(I2C_WAIT_ACK_TIME, dev);
  371. while(len)
  372. {
  373. if(len == 1)
  374. *data_t = I2C_ReadByte(0, dev);
  375. else
  376. *data_t = I2C_ReadByte(1, dev);
  377. len--;
  378. data_t++;
  379. }
  380. I2C_Stop(dev);
  381. return 0;
  382. }
  383. #endif /* __HW_I2C_ATY_C */
  384. /************************************ etc *************************************/
  385. /* init */
  386. /* software */
  387. // void I2C_1_SCL_SET(uint8_t level){ }
  388. // void I2C_1_SDA_SET(uint8_t cmd, uint8_t param){ }
  389. // uint8_t I2C_1_SDA_GET(void){ return 0; }
  390. // // STM32 HAL
  391. // uint8_t I2C_1(uint8_t addr, uint8_t* data_t, uint8_t len, uint8_t rw){
  392. // if(rw == _ATY_RW_W)
  393. // return (uint8_t)HAL_I2C_Master_Transmit(&hi2c1, (addr << 1 | 0), data_t, len, 1000);
  394. // else if(rw == _ATY_RW_R)
  395. // return (uint8_t)HAL_I2C_Master_Receive(&hi2c1, (addr << 1 | 1), data_t, len, 1000);
  396. // else if(rw == _ATY_RW_RW) // todo: no stop
  397. // return 0;
  398. // return 0;
  399. // }
  400. // // 51 // todo: not tested
  401. // uint8_t I2C_1(uint8_t addr, uint8_t* data_t, uint8_t len, uint8_t rw)
  402. // {
  403. // if(rw == _ATY_RW_W){
  404. // uint8_t i = 0;
  405. // uint16_t errCount = 1000;
  406. // // Start();
  407. // I2CMSCR = 0x01;
  408. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  409. // if(errCount == 0) return 1; else errCount = 1000;
  410. // I2CMSST &= ~0x40;
  411. // // SendData((addr << 1 | 0));
  412. // I2CTXD = (addr << 1 | 0);
  413. // I2CMSCR = 0x02;
  414. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  415. // if(errCount == 0) return 1; else errCount = 1000;
  416. // I2CMSST &= ~0x40;
  417. // // RecvACK();
  418. // I2CMSCR = 0x03;
  419. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  420. // if(errCount == 0) return 1; else errCount = 1000;
  421. // I2CMSST &= ~0x40;
  422. // for(i = 0; i < len; i++){
  423. // // SendData(data_t[i]);
  424. // I2CTXD = data_t[i];
  425. // I2CMSCR = 0x02;
  426. // // RecvACK();
  427. // I2CMSCR = 0x03;
  428. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  429. // if(errCount == 0) return 1; else errCount = 1000;
  430. // I2CMSST &= ~0x40;
  431. // }
  432. // // Stop();
  433. // I2CMSCR = 0x06;
  434. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  435. // if(errCount == 0) return 1; else errCount = 1000;
  436. // I2CMSST &= ~0x40;
  437. // if(errCount == 0) return 1;
  438. // return 0;
  439. // }
  440. // else if(rw == _ATY_RW_R){
  441. // uint8_t i = 0;
  442. // // Start();
  443. // I2CMSCR = 0x01;
  444. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  445. // if(errCount == 0) return 1; else errCount = 1000;
  446. // I2CMSST &= ~0x40;
  447. // // SendData((addr << 1 | 0));
  448. // I2CTXD = (addr << 1 | 0);
  449. // I2CMSCR = 0x02;
  450. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  451. // if(errCount == 0) return 1; else errCount = 1000;
  452. // I2CMSST &= ~0x40;
  453. // // RecvACK();
  454. // I2CMSCR = 0x03;
  455. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  456. // if(errCount == 0) return 1; else errCount = 1000;
  457. // I2CMSST &= ~0x40;
  458. // for(i = 0; i < len; i++){
  459. // // data_t[i] = RecvData();
  460. // I2CMSCR = 0x04;
  461. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  462. // if(errCount == 0) return 1; else errCount = 1000;
  463. // I2CMSST &= ~0x40;
  464. // data_t[i] = I2CRXD;
  465. // if(i == len - 1){
  466. // // SendNAK();
  467. // I2CMSST = 0x01;
  468. // I2CMSCR = 0x05;
  469. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  470. // if(errCount == 0) return 1; else errCount = 1000;
  471. // I2CMSST &= ~0x40;
  472. // }
  473. // else{
  474. // // SendACK();
  475. // I2CMSST = 0x00;
  476. // I2CMSCR = 0x05;
  477. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  478. // if(errCount == 0) return 1; else errCount = 1000;
  479. // I2CMSST &= ~0x40;
  480. // }
  481. // }
  482. // // Stop();
  483. // I2CMSCR = 0x06;
  484. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  485. // if(errCount == 0) return 1; else errCount = 1000;
  486. // I2CMSST &= ~0x40;
  487. // if(errCount == 0) return 1;
  488. // return 0;
  489. // }
  490. // else if(rw == _ATY_RW_RW){
  491. // uint8_t i = 0;
  492. // // Start();
  493. // I2CMSCR = 0x01;
  494. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  495. // if(errCount == 0) return 1; else errCount = 1000;
  496. // I2CMSST &= ~0x40;
  497. // // SendData((addr << 1 | 0));
  498. // I2CTXD = (addr << 1 | 0);
  499. // I2CMSCR = 0x02;
  500. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  501. // if(errCount == 0) return 1; else errCount = 1000;
  502. // I2CMSST &= ~0x40;
  503. // // RecvACK();
  504. // I2CMSCR = 0x03;
  505. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  506. // if(errCount == 0) return 1; else errCount = 1000;
  507. // I2CMSST &= ~0x40;
  508. // for(i = 0; i < len; i++){
  509. // // SendData(data_t[i]);
  510. // I2CTXD = data_t[i];
  511. // I2CMSCR = 0x02;
  512. // // RecvACK();
  513. // I2CMSCR = 0x03;
  514. // while((!(I2CMSST & 0x40)) && errCount) errCount--;
  515. // if(errCount == 0) return 1; else errCount = 1000;
  516. // I2CMSST &= ~0x40;
  517. // }
  518. // if(errCount == 0) return 1;
  519. // return 0;
  520. // }
  521. // }
  522. // // ESP8266_RTOS // todo: not tested
  523. // #include "driver/i2c.h"
  524. // #define I2C_EXAMPLE_MASTER_SCL_IO 2 /*!< gpio number for I2C master clock */
  525. // #define I2C_EXAMPLE_MASTER_SDA_IO 14 /*!< gpio number for I2C master data */
  526. // #define I2C_EXAMPLE_MASTER_NUM I2C_NUM_0 /*!< I2C port number for master dev */
  527. // #define I2C_EXAMPLE_MASTER_TX_BUF_DISABLE 0 /*!< I2C master do not need buffer */
  528. // #define I2C_EXAMPLE_MASTER_RX_BUF_DISABLE 0 /*!< I2C master do not need buffer */
  529. // /**
  530. // * @brief i2c master initialization
  531. // */
  532. // static esp_err_t i2c_example_master_init()
  533. // {
  534. // int i2c_master_port = I2CH_N;
  535. // i2c_config_t conf;
  536. // conf.mode = I2C_MODE_MASTER;
  537. // conf.sda_io_num = I2C_EXAMPLE_MASTER_SDA_IO;
  538. // conf.sda_pullup_en = 1;
  539. // conf.scl_io_num = I2C_EXAMPLE_MASTER_SCL_IO;
  540. // conf.scl_pullup_en = 1;
  541. // conf.clk_stretch_tick = 300; // 300 ticks, Clock stretch is about 210us, you can make changes according to the actual situation.
  542. // ESP_ERROR_CHECK(i2c_driver_install(i2c_master_port, conf.mode));
  543. // ESP_ERROR_CHECK(i2c_param_config(i2c_master_port, &conf));
  544. // return ESP_OK;
  545. // }
  546. // /**
  547. // * @brief Write serial data to reg
  548. // * @param addr slave machine address
  549. // * @param data_t data to write(uint8)
  550. // * @param len length of write data(uint8)
  551. // * @return 0: success, !0: error
  552. // */
  553. // uint8_t I2C_Write(uint8_t addr, uint8_t* data_t, uint8_t len)
  554. // {
  555. // int ret;
  556. // i2c_cmd_handle_t cmd = i2c_cmd_link_create();
  557. // i2c_master_start(cmd);
  558. // i2c_master_write_byte(cmd, addr << 1 | 0, ACK_CHECK_EN);
  559. // i2c_master_write(cmd, data_t, len, ACK_CHECK_EN);
  560. // i2c_master_stop(cmd);
  561. // ret = i2c_master_cmd_begin(I2CH_N, cmd, 1000 / portTICK_RATE_MS);
  562. // i2c_cmd_link_delete(cmd);
  563. // return ret;
  564. // }
  565. // /**
  566. // * @brief Read serial data to reg
  567. // * @param addr slave machine address
  568. // * @param data_t data to read(uint8)
  569. // * @param len length of read data(uint8)
  570. // * @return 0: success, !0: error
  571. // */
  572. // uint8_t I2C_Read(uint8_t addr, uint8_t* data_t, uint8_t len)
  573. // {
  574. // int ret;
  575. // i2c_cmd_handle_t cmd = i2c_cmd_link_create();
  576. // i2c_master_start(cmd);
  577. // i2c_master_write_byte(cmd, addr << 1 | 0, ACK_CHECK_EN);
  578. // i2c_master_stop(cmd);
  579. // ret = i2c_master_cmd_begin(I2CH_N, cmd, 1000 / portTICK_RATE_MS);
  580. // i2c_cmd_link_delete(cmd);
  581. // if(ret != ESP_OK) {
  582. // return ret;
  583. // }
  584. // cmd = i2c_cmd_link_create();
  585. // i2c_master_start(cmd);
  586. // i2c_master_write_byte(cmd, addr << 1 | 1, ACK_CHECK_EN);
  587. // i2c_master_read(cmd, data_t, len, LAST_NACK_VAL);
  588. // i2c_master_stop(cmd);
  589. // ret = i2c_master_cmd_begin(i2c_num, cmd, 1000 / portTICK_RATE_MS);
  590. // i2c_cmd_link_delete(cmd);
  591. // return ret;
  592. // }
  593. /* software */
  594. // void I2C_1_SCL_SET(uint8_t level){
  595. // if(level == _ATY_HL_L){
  596. // GPIO_SET_L(I2C_SCL_PORT, I2C_SCL_PIN);
  597. // }
  598. // else if(level == _ATY_HL_H){
  599. // GPIO_SET_H(I2C_SCL_PORT, I2C_SCL_PIN);
  600. // }
  601. // }
  602. // void I2C_1_SDA_SET(uint8_t cmd, uint8_t param){
  603. // if(cmd == 'I'){
  604. // if(param == _ATY_IO_I){
  605. // GPIO_SET_IN(I2C_SDA_PORT, I2C_SDA_PIN);
  606. // }
  607. // else if(param == _ATY_IO_O){
  608. // GPIO_SET_OUT(I2C_SDA_PORT, I2C_SDA_PIN);
  609. // }
  610. // }
  611. // else if(cmd == 'L'){
  612. // if(param == _ATY_HL_L){
  613. // GPIO_SET_L(I2C_SDA_PORT, I2C_SDA_PIN);
  614. // }
  615. // else if(param == _ATY_HL_H){
  616. // GPIO_SET_H(I2C_SDA_PORT, I2C_SDA_PIN);
  617. // }
  618. // }
  619. // }
  620. // uint8_t I2C_1_SDA_GET(void){ return GPIO_GET(I2C_SDA_PORT, I2C_SDA_PIN); }
  621. // uint8_t I2C_1(uint8_t addr, uint8_t* data_t, uint8_t len, uint8_t rw){ return 0; }
  622. /* public */
  623. // void I2C_Delay(uint8_t t){ while(t--); }
  624. // struct HW_I2C_ATY_Dev HW_I2C_ATY_Dev_1 = {
  625. // .hardwareEnable = 1,
  626. // .sclSet = I2C_1_SCL_SET,
  627. // .sdaSet = I2C_1_SDA_SET,
  628. // .sdaGet = I2C_1_SDA_GET,
  629. // .i2cProcess = I2C_1,
  630. // .delay = I2C_Delay,
  631. // .lock = _ATY_UNLOCKED,
  632. // .debugEnable = 0,
  633. // .LOG = printf
  634. // };
  635. /* use */
  636. // I2C_Write(addr, data_t, len, &HW_I2C_ATY_Dev_1);
  637. // I2C_Read(addr, data_t, len, &HW_I2C_ATY_Dev_1);
  638. /******************************************************************************/
  639. /******************************** End Of File *********************************/