lt_fdc2214_iic.c 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "lt_fdc2214_iic.h"
  2. #include "stm32l4xx_hal.h"
  3. #include "main.h"
  4. extern TIM_HandleTypeDef htim15;
  5. void FDC2214_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 FDC2214_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 delay_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 FDC2214_IIC_Start(void)
  29. {
  30. FDC2214_SDA_OUT();
  31. SDA_HIGH();
  32. SCL_HIGH();
  33. delay_us(2);
  34. SDA_LOW();
  35. delay_us(2);
  36. SCL_LOW();
  37. delay_us(2);
  38. }
  39. void FDC2214_IIC_Stop(void)
  40. {
  41. FDC2214_SDA_OUT();
  42. SCL_LOW();
  43. delay_us(2);
  44. SDA_LOW();
  45. delay_us(2);
  46. SCL_HIGH();
  47. delay_us(2);
  48. SDA_HIGH();
  49. delay_us(2);
  50. }
  51. uint8_t FDC2214_IIC_Wait_Ack(void)
  52. {
  53. uint8_t waitTime=0;
  54. FDC2214_SDA_IN();
  55. SDA_HIGH();
  56. delay_us(2);
  57. SCL_HIGH();
  58. delay_us(2);
  59. while(FDC2214_IIC_SDA_IN)
  60. {
  61. waitTime++;
  62. if(waitTime>250)
  63. {
  64. FDC2214_IIC_Stop();
  65. return 1;
  66. }
  67. }
  68. SCL_LOW();
  69. return 0;
  70. }
  71. void FDC2214_IIC_Ack(void)
  72. {
  73. SCL_LOW();
  74. delay_us(2);
  75. FDC2214_SDA_OUT();
  76. SDA_LOW();//发送0是ACK
  77. delay_us(2);
  78. SCL_HIGH();
  79. delay_us(2);
  80. SCL_LOW();
  81. delay_us(2);
  82. }
  83. void FDC2214_IIC_NAck(void)
  84. {
  85. SCL_LOW();
  86. delay_us(2);
  87. FDC2214_SDA_OUT();
  88. SDA_HIGH();//发送1是nACK
  89. delay_us(2);
  90. SCL_HIGH();
  91. delay_us(2);
  92. SCL_LOW();
  93. delay_us(2);
  94. }
  95. void FDC2214_IIC_Send_Byte(uint8_t dat)
  96. {
  97. uint8_t t;
  98. FDC2214_SDA_OUT();
  99. SCL_LOW();
  100. for(t=0; t<8; t++)
  101. {
  102. delay_us(2);
  103. if(dat & 0x80)
  104. SDA_HIGH();
  105. else
  106. SDA_LOW();
  107. dat<<=1;
  108. SCL_HIGH();
  109. delay_us(2);
  110. SCL_LOW();
  111. delay_us(2);
  112. }
  113. //SCL_LOW();
  114. }
  115. uint8_t FDC2214_IIC_Read_Byte(uint8_t ack)
  116. {
  117. uint8_t i,receive=0;
  118. SDA_HIGH();
  119. FDC2214_SDA_IN();
  120. for(i=0; i<8; i++ )
  121. {
  122. receive<<=1;
  123. SCL_LOW();
  124. delay_us(2);
  125. SCL_HIGH();
  126. delay_us(2);
  127. if(FDC2214_IIC_SDA_IN)receive++;//最低位置1
  128. }
  129. SCL_LOW();
  130. if (!ack)
  131. FDC2214_IIC_NAck();
  132. else
  133. FDC2214_IIC_Ack();
  134. return receive;
  135. }