Tlt_fdc2214_iic.c 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "Tlt_fdc2214_iic.h"
  2. #include "stm32l4xx_hal.h"
  3. #include "main.h"
  4. extern TIM_HandleTypeDef htim15;
  5. void TFDC2214_SDA_IN()
  6. {
  7. GPIO_InitTypeDef GPIO_InitStruct = {0};
  8. GPIO_InitStruct.Pin = GPIO_PIN_7;
  9. // GPIO_InitStruct.Pin = GPIO_PIN_11;
  10. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  11. GPIO_InitStruct.Pull = GPIO_PULLUP;
  12. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  13. }
  14. void TFDC2214_SDA_OUT()
  15. {
  16. GPIO_InitTypeDef GPIO_InitStruct = {0};
  17. GPIO_InitStruct.Pin = GPIO_PIN_7;
  18. // GPIO_InitStruct.Pin = GPIO_PIN_11;
  19. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  20. GPIO_InitStruct.Pull = GPIO_PULLUP;
  21. HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  22. }
  23. void Tdelay_us(uint32_t us)
  24. {
  25. uint16_t start = __HAL_TIM_GET_COUNTER(&htim15);
  26. while((__HAL_TIM_GET_COUNTER(&htim15) - start) < us);
  27. }
  28. void TFDC2214_IIC_Start(void)
  29. {
  30. TFDC2214_SDA_OUT();
  31. TSDA_HIGH();
  32. TSCL_HIGH();
  33. Tdelay_us(2);
  34. TSDA_LOW();
  35. Tdelay_us(2);
  36. TSCL_LOW();
  37. Tdelay_us(2);
  38. }
  39. void TFDC2214_IIC_Stop(void)
  40. {
  41. TFDC2214_SDA_OUT();
  42. TSCL_LOW();
  43. Tdelay_us(2);
  44. TSDA_LOW();
  45. Tdelay_us(2);
  46. TSCL_HIGH();
  47. Tdelay_us(2);
  48. TSDA_HIGH();
  49. Tdelay_us(2);
  50. }
  51. uint8_t TFDC2214_IIC_Wait_Ack(void)
  52. {
  53. uint8_t waitTime=0;
  54. TFDC2214_SDA_IN();
  55. TSDA_HIGH();
  56. Tdelay_us(2);
  57. TSCL_HIGH();
  58. Tdelay_us(2);
  59. while(TFDC2214_IIC_SDA_IN)
  60. {
  61. waitTime++;
  62. if(waitTime>250)
  63. {
  64. TFDC2214_IIC_Stop();
  65. return 1;
  66. }
  67. }
  68. TSCL_LOW();
  69. return 0;
  70. }
  71. void TFDC2214_IIC_Ack(void)
  72. {
  73. TSCL_LOW();
  74. Tdelay_us(2);
  75. TFDC2214_SDA_OUT();
  76. TSDA_LOW();//发送0是ACK
  77. Tdelay_us(2);
  78. TSCL_HIGH();
  79. Tdelay_us(2);
  80. TSCL_LOW();
  81. Tdelay_us(2);
  82. }
  83. void TFDC2214_IIC_NAck(void)
  84. {
  85. TSCL_LOW();
  86. Tdelay_us(2);
  87. TFDC2214_SDA_OUT();
  88. TSDA_HIGH();//发送1是nACK
  89. Tdelay_us(2);
  90. TSCL_HIGH();
  91. Tdelay_us(2);
  92. TSCL_LOW();
  93. Tdelay_us(2);
  94. }
  95. void TFDC2214_IIC_Send_Byte(uint8_t dat)
  96. {
  97. uint8_t t;
  98. TFDC2214_SDA_OUT();
  99. TSCL_LOW();
  100. for(t=0; t<8; t++)
  101. {
  102. Tdelay_us(2);
  103. if(dat & 0x80)
  104. TSDA_HIGH();
  105. else
  106. TSDA_LOW();
  107. dat<<=1;
  108. TSCL_HIGH();
  109. Tdelay_us(2);
  110. TSCL_LOW();
  111. Tdelay_us(2);
  112. }
  113. //SCL_LOW();
  114. }
  115. uint8_t TFDC2214_IIC_Read_Byte(uint8_t ack)
  116. {
  117. uint8_t i,receive=0;
  118. TSDA_HIGH();
  119. TFDC2214_SDA_IN();
  120. for(i=0; i<8; i++ )
  121. {
  122. receive<<=1;
  123. TSCL_LOW();
  124. Tdelay_us(2);
  125. TSCL_HIGH();
  126. Tdelay_us(2);
  127. if(TFDC2214_IIC_SDA_IN)receive++;//最低位置1
  128. }
  129. TSCL_LOW();
  130. if (!ack)
  131. TFDC2214_IIC_NAck();
  132. else
  133. TFDC2214_IIC_Ack();
  134. return receive;
  135. }