i2c_api.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. /*
  2. *** author: zhouchao
  3. *** date: 2019-03-28
  4. *** version: 1.00
  5. *** e-mail: zhouchao@storlead.com 1959353124@qq.com
  6. *** brief: LM73 driver
  7. ***
  8. */
  9. #include "i2c_api.h"
  10. #include "./../../driver/I2C/i2c.h"
  11. #include <stdint.h>
  12. #include <stdio.h>
  13. #include "./../../stm32f429xx.h"
  14. #include "./../../stm32f429.h"
  15. /* Send a frame data to i2c device.
  16. * Start + Addr/W(7bit+1bit) + data*Size + Stop
  17. */
  18. int I2C_Master_Transmit(I2C_DEV_T *dev, uint8_t DevAddress, uint8_t *pData, uint8_t start_reg, uint16_t Size)
  19. {
  20. int fd;
  21. char dev_name[15] = {0};
  22. int ret = 0;
  23. int i;
  24. switch((uint32_t)dev->bus)
  25. {
  26. case (uint32_t)I2C1:
  27. sprintf(dev_name,"/dev/i2c1");
  28. break;
  29. case (uint32_t)I2C2:
  30. sprintf(dev_name,"/dev/i2c2");
  31. break;
  32. case (uint32_t)I2C3:
  33. sprintf(dev_name,"/dev/i2c3");
  34. break;
  35. default:
  36. printf("Error: %s %d Invalid device! %#x\n",__FILE__,__LINE__,(uint32_t)dev->bus);
  37. return -1;
  38. }
  39. /* open device */
  40. fd = open(dev_name,O_RDWR);
  41. if(fd == -1)
  42. {
  43. printf("Error:%s %d open %s fail!\n",__FILE__,__LINE__,dev_name);
  44. return -1;
  45. }
  46. /* Start signal */
  47. if(ioctl(fd,GENERATE_START,dev) != 0)
  48. {
  49. printf("Error %s %d: Generate start fail!\n",__FILE__,__LINE__);
  50. ret = -1;
  51. goto STOP;
  52. }
  53. // printf("start ok --->%#x\n",dev->bus);
  54. /* Send slave address */
  55. dev->slaveAddr = DevAddress;
  56. if(ioctl(fd,SEND_SLAVE_ADDR,dev) != 0)
  57. {
  58. printf("Error %s %d: Send slave addr %#x fail!\n",__FILE__,__LINE__,dev->slaveAddr);
  59. ret = -1;
  60. goto STOP;
  61. }
  62. /* Send data address */
  63. dev->reg = start_reg;
  64. if(ioctl(fd,SEND_DATA_ADDR,dev) != 0)
  65. {
  66. printf("Error %s %d: Send data addr %#x fail!\n",__FILE__,__LINE__,dev->reg);
  67. ret = -1;
  68. goto STOP;
  69. }
  70. /* Send data */
  71. for(i=0;i<Size;i++)
  72. {
  73. dev->data = pData[i];
  74. if(ioctl(fd,SEND_DATA,dev) != 0)
  75. {
  76. printf("Error %s %d: Send data fail!\n",__FILE__,__LINE__);
  77. ret = -1;
  78. goto STOP;
  79. }
  80. }
  81. // printf("data ok ---> %#x\n",dev->bus);
  82. STOP:
  83. /* Stop signal */
  84. if(ioctl(fd,GENERATE_STOP,dev) != 0)
  85. {
  86. printf("Error %s %d: Generate stop fail!\n",__FILE__,__LINE__);
  87. ret = -1;
  88. }
  89. // printf("stop ok ---> %#x\n",dev->bus);
  90. /* Close device */
  91. close(fd);
  92. return ret;
  93. }
  94. int I2C_Master_Receiver(I2C_DEV_T *dev, uint8_t DevAddress, uint8_t *pData, uint8_t start_reg, uint16_t Size)
  95. {
  96. int fd;
  97. char dev_name[15] = {0};
  98. int ret = 0;
  99. int i;
  100. switch((uint32_t)dev->bus)
  101. {
  102. case (uint32_t)I2C1:
  103. sprintf(dev_name,"/dev/i2c1");
  104. break;
  105. case (uint32_t)I2C2:
  106. sprintf(dev_name,"/dev/i2c2");
  107. break;
  108. case (uint32_t)I2C3:
  109. sprintf(dev_name,"/dev/i2c3");
  110. break;
  111. default:
  112. printf("Error: %s %d Invalid device! %#x\n",__FILE__,__LINE__,(uint32_t)dev->bus);
  113. return -1;
  114. }
  115. /* open device */
  116. fd = open(dev_name,O_RDWR);
  117. if(fd == -1)
  118. {
  119. printf("Error:%s %d open %s fail!\n",__FILE__,__LINE__,dev_name);
  120. return -1;
  121. }
  122. /* Start signal */
  123. if(ioctl(fd,GENERATE_START,dev) != 0)
  124. {
  125. printf("Error %s %d: Generate start fail!\n",__FILE__,__LINE__);
  126. ret = -1;
  127. goto STOP;
  128. }
  129. // printf("start ok --->%#x\n",dev->bus);
  130. /* Send slave address */
  131. dev->slaveAddr = DevAddress;
  132. if(ioctl(fd,SEND_SLAVE_ADDR,dev) != 0)
  133. {
  134. printf("Error %s %d: Send slave addr %#x fail!\n",__FILE__,__LINE__,dev->slaveAddr);
  135. ret = -1;
  136. goto STOP;
  137. }
  138. /* Send data address */
  139. dev->reg = start_reg;
  140. if(ioctl(fd,SEND_DATA_ADDR,dev) != 0)
  141. {
  142. printf("Error %s %d: Send data addr %#x fail!\n",__FILE__,__LINE__,dev->reg);
  143. ret = -1;
  144. goto STOP;
  145. }
  146. ioctl(fd,ACK_ENABLE,dev);
  147. /* Start signal */
  148. if(ioctl(fd,GENERATE_START,dev) != 0)
  149. {
  150. printf("Error %s %d: Generate start fail!\n",__FILE__,__LINE__);
  151. ret = -1;
  152. goto STOP;
  153. }
  154. /* receiver slave address */
  155. dev->slaveAddr = DevAddress;
  156. if(ioctl(fd,RECEIVER_SLAVE_ADDR,dev) != 0)
  157. {
  158. printf("Error %s %d: receiver slave addr %#x fail!\n",__FILE__,__LINE__,dev->slaveAddr);
  159. ret = -1;
  160. goto STOP;
  161. }
  162. for(i=0;i<Size;i++)
  163. {
  164. if(i==Size-1)
  165. {
  166. ioctl(fd,ACK_DISABLE,dev);
  167. ioctl(fd,GENERATE_STOP,dev);
  168. }
  169. /* receiver data address */
  170. if(ioctl(fd,READ_DATA,dev) != 0)
  171. {
  172. printf("Error %s %d: Send slave addr %#x fail!\n",__FILE__,__LINE__,dev->data);
  173. ret = -1;
  174. goto STOP;
  175. }
  176. pData[i]=dev->data;
  177. }
  178. // ioctl(fd,GENERATE_STOP,dev);
  179. // ioctl(fd,ACK_ENABLE,dev);
  180. // ioctl(fd,GENERATE_STOP,dev);
  181. close(fd);
  182. // printf("read data is %d ,%d",pData[0],pData[1]);
  183. return 0;
  184. STOP:
  185. ioctl(fd,GENERATE_STOP,dev);
  186. //ioctl(fd,ACK_ENABLE,dev);
  187. close(fd);
  188. return -1;
  189. }