IIC.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. /********************************** (C) COPYRIGHT *******************************
  2. * File Name : IIC.c
  3. * Author :
  4. * Version : V1.0
  5. * Date : 2018/12/12
  6. * Description : I2C 读写
  7. *******************************************************************************/
  8. /*********************************************************************
  9. * INCLUDES
  10. */
  11. #include "TouchCommon.h"
  12. #include "iic.h"
  13. #include "driver_gpio.h"
  14. /* DATA ADDRESS Length Definition */
  15. #define Address_8bit 0
  16. #define Address_16bit 1
  17. #define Address_32bit 2
  18. #define CHECK_TIMES (25)
  19. #define IIC_TIMEOUT 50
  20. #define IIC_SPEED_400 10
  21. void NOP_DELAY(UINT16 num)
  22. {
  23. while(num--)
  24. {
  25. asm("nop");
  26. }
  27. }
  28. void Touch_IIC_Init()
  29. {
  30. gpio_init_typedef gpio_init_structure;
  31. gpio_init_structure.gpio_dir = GPIO_DIR_INPUT;
  32. gpio_init_structure.gpio_fen = GPIO_FEN_GPIO;
  33. gpio_init_structure.gpio_fdir = GPIO_FDIR_SELF;
  34. gpio_init_structure.gpio_mode = GPIO_MODE_DIGITAL;
  35. gpio_init_structure.gpio_pupd = GPIO_PUPD_PU10K;
  36. gpio_init_structure.gpio_drv = GPIO_DRV_6MA;
  37. gpio_init_structure.gpio_pin = IIC_SCL;
  38. gpio_init(GPIOA_REG, &gpio_init_structure);
  39. gpio_init_structure.gpio_pin = IIC_SDA;
  40. gpio_init(GPIOA_REG, &gpio_init_structure);
  41. gpio_reset_bits(GPIOA_REG, IIC_SCL);
  42. gpio_reset_bits(GPIOA_REG, IIC_SDA);
  43. }
  44. #define SCL_IN() (gpio_read_data(GPIOA_REG)&IIC_SCL)
  45. #define SCL_HIGH() gpio_set_input(GPIOA_REG, IIC_SCL)
  46. #define SCL_LOW() gpio_set_out(GPIOA_REG, IIC_SCL)
  47. #define SDA_IN() (gpio_read_data(GPIOA_REG)&IIC_SDA)
  48. #define SDA_HIGH() gpio_set_input(GPIOA_REG, IIC_SDA)
  49. #define SDA_LOW() gpio_set_out(GPIOA_REG, IIC_SDA)
  50. #define IIC_START() {\
  51. SDA_HIGH();\
  52. SCL_HIGH();\
  53. NOP_DELAY(IIC_SPEED_400);\
  54. SDA_LOW();\
  55. NOP_DELAY(IIC_SPEED_400);\
  56. SCL_LOW();\
  57. }
  58. #define IIC_STOP() {\
  59. SDA_LOW();\
  60. SCL_LOW();\
  61. NOP_DELAY(IIC_SPEED_400);\
  62. SCL_HIGH();\
  63. NOP_DELAY(IIC_SPEED_400);\
  64. SDA_HIGH();\
  65. }
  66. BOOL I2C_WaitForSclRelease(void)
  67. {
  68. s8 nTryTimes = IIC_TIMEOUT;
  69. while( SCL_IN() == 0 && nTryTimes!=0)
  70. {
  71. --nTryTimes;
  72. NOP_DELAY(IIC_SPEED_400);
  73. }
  74. if(nTryTimes==0)
  75. return 0;
  76. return 1;
  77. }
  78. BOOL IIC_WRITE_DATA(UINT8 dat)
  79. {
  80. BOOL nak;
  81. UINT8 bit_off = 0x80;
  82. do
  83. {
  84. if(bit_off & dat)
  85. {
  86. SDA_HIGH();
  87. }
  88. else
  89. {
  90. SDA_LOW();
  91. }
  92. NOP_DELAY(IIC_SPEED_400);
  93. SCL_HIGH();
  94. NOP_DELAY(IIC_SPEED_400);
  95. bit_off >>= 1;
  96. SCL_LOW();
  97. } while (bit_off);
  98. NOP_DELAY(IIC_SPEED_400);
  99. SDA_HIGH();
  100. SCL_HIGH();
  101. NOP_DELAY(IIC_SPEED_400);
  102. nak = SDA_IN();
  103. SCL_LOW();
  104. return nak==0;
  105. }
  106. BOOL IIC_READ_DATA(UINT8* dat, BOOL nack)
  107. {
  108. UINT8 bit_off = 0x80;
  109. SDA_HIGH();
  110. SCL_HIGH();
  111. NOP_DELAY(IIC_SPEED_400);
  112. if(!I2C_WaitForSclRelease())
  113. {
  114. return 0;
  115. }
  116. while(1)
  117. {
  118. if(SDA_IN())
  119. {
  120. *dat |= bit_off;
  121. }
  122. else
  123. {
  124. *dat &= ~bit_off;
  125. }
  126. SCL_LOW();
  127. NOP_DELAY(IIC_SPEED_400);
  128. bit_off >>= 1;
  129. if(bit_off)
  130. {
  131. SCL_HIGH();
  132. NOP_DELAY(IIC_SPEED_400);
  133. continue;
  134. }
  135. break;
  136. };
  137. if(nack)
  138. {
  139. SDA_HIGH();
  140. }
  141. else
  142. {
  143. SDA_LOW();
  144. }
  145. SCL_HIGH();
  146. NOP_DELAY(IIC_SPEED_400 + 2);
  147. SCL_LOW();
  148. return 1;
  149. }
  150. BOOL GT_Check_I2C_Address(UINT8 Address)
  151. {
  152. BOOL nack;
  153. IIC_START();
  154. nack = IIC_WRITE_DATA(Address);
  155. IIC_STOP();
  156. return nack;
  157. }
  158. BOOL WriteAddress(UINT32 dwAddr)
  159. {
  160. if(isBerlinSeries)
  161. {
  162. IIC_WRITE_DATA((UINT8)(dwAddr>>24) );
  163. IIC_WRITE_DATA((UINT8)(dwAddr>>16) );
  164. }
  165. IIC_WRITE_DATA((UINT8)(dwAddr>>8) );
  166. IIC_WRITE_DATA((UINT8)(dwAddr) );
  167. return 1;
  168. }
  169. u8 IICReadOneByte(UINT32 ReadAddr)
  170. {
  171. UINT8 temp=0;
  172. IIC_START();
  173. IIC_WRITE_DATA(GT_CMD_WR);
  174. if(!WriteAddress(ReadAddr)) return 0;
  175. NOP_DELAY(4);
  176. IIC_START();
  177. IIC_WRITE_DATA(GT_CMD_RD);
  178. NOP_DELAY(4);
  179. IIC_READ_DATA(&temp, 1);
  180. IIC_STOP();
  181. return temp;
  182. }
  183. BOOL IICReadBytes(UINT32 ReadAddr,UINT8 *pBuffer,UINT16 Length)
  184. {
  185. BOOL ret = 1;
  186. IIC_START();
  187. if(!IIC_WRITE_DATA(GT_CMD_WR))
  188. return 0;
  189. if(!WriteAddress(ReadAddr)) return 0;
  190. NOP_DELAY(4);
  191. IIC_START();
  192. IIC_WRITE_DATA(GT_CMD_RD);
  193. for(; Length > 1; --Length)
  194. {
  195. NOP_DELAY(4);
  196. ret = IIC_READ_DATA(pBuffer, 0);
  197. if(!ret)
  198. {
  199. break;
  200. }
  201. pBuffer++;
  202. }
  203. if(ret)
  204. {
  205. NOP_DELAY(4);
  206. IIC_READ_DATA(pBuffer, 1);
  207. }
  208. IIC_STOP();
  209. return ret;
  210. }
  211. BOOL IICWriteOneByte(UINT32 WriteAddr,UINT8 DataToWrite)
  212. {
  213. BOOL ret;
  214. IIC_START();
  215. ret = IIC_WRITE_DATA(GT_CMD_WR);
  216. if(ret)
  217. {
  218. if(!WriteAddress(WriteAddr)) return 0;
  219. ret = IIC_WRITE_DATA(DataToWrite);
  220. }
  221. IIC_STOP();
  222. return ret;
  223. }
  224. BOOL IICWriteBytes(UINT32 WriteAddr,UINT8 *pBuffer,UINT16 Length)
  225. {
  226. BOOL ret;
  227. IIC_START();
  228. ret = IIC_WRITE_DATA(GT_CMD_WR);
  229. if(ret)
  230. {
  231. if(!WriteAddress(WriteAddr)) return 0;
  232. while (Length--)
  233. {
  234. IIC_WRITE_DATA(*pBuffer);
  235. pBuffer++;
  236. }
  237. }
  238. IIC_STOP();
  239. return ret;
  240. }
  241. /*********************************************************************
  242. *********************************************************************/