I2C_Analog.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. #include "I2C_Analog.h"
  2. static void _SDA_IN(I2C_Handle_Struct_t* I2C_Handle)
  3. {
  4. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET);
  5. }
  6. static void _SDA_OUT(I2C_Handle_Struct_t* I2C_Handle)
  7. {
  8. __NOP();
  9. }
  10. static void _GPIO_CLK_Init(GPIO_TypeDef* GPIOx)
  11. {
  12. if(GPIOx == GPIOA)
  13. {
  14. __HAL_RCC_GPIOA_CLK_ENABLE();
  15. }
  16. else if(GPIOx == GPIOB)
  17. {
  18. __HAL_RCC_GPIOB_CLK_ENABLE();
  19. }
  20. else if(GPIOx == GPIOC)
  21. {
  22. __HAL_RCC_GPIOC_CLK_ENABLE();
  23. }
  24. else if(GPIOx == GPIOD)
  25. {
  26. __HAL_RCC_GPIOD_CLK_ENABLE();
  27. }
  28. else if(GPIOx == GPIOE)
  29. {
  30. __HAL_RCC_GPIOE_CLK_ENABLE();
  31. }
  32. }
  33. void Delay(uint32_t Tcount)//40:8us
  34. {
  35. while(Tcount--);
  36. }
  37. void I2C_GPIO_Config(I2C_Handle_Struct_t* I2C_Handle)
  38. {
  39. GPIO_InitTypeDef GPIO_InitStruct;
  40. _GPIO_CLK_Init(I2C_Handle->SCL_GPIOx);
  41. _GPIO_CLK_Init(I2C_Handle->SDA_GPIOx);
  42. GPIO_InitStruct.Pin = I2C_Handle->SCL_GPIO_Pin;
  43. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  44. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  45. HAL_GPIO_Init(I2C_Handle->SCL_GPIOx, &GPIO_InitStruct);
  46. GPIO_InitStruct.Pin = I2C_Handle->SDA_GPIO_Pin;
  47. GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
  48. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;
  49. HAL_GPIO_Init(I2C_Handle->SDA_GPIOx, &GPIO_InitStruct);
  50. }
  51. void I2C_Start(I2C_Handle_Struct_t* I2C_Handle)
  52. {
  53. _SDA_OUT(I2C_Handle);
  54. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET);
  55. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET);
  56. Delay(DLY_US);
  57. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET);
  58. Delay(DLY_US);
  59. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET);
  60. }
  61. void I2C_Stop(I2C_Handle_Struct_t* I2C_Handle)
  62. {
  63. _SDA_OUT(I2C_Handle);
  64. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET);
  65. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET);
  66. Delay(DLY_US);
  67. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET);
  68. Delay(DLY_US);
  69. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET);
  70. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET);
  71. }
  72. void I2C_Write_Byte(I2C_Handle_Struct_t* I2C_Handle, const uint8_t s)
  73. {
  74. uint8_t temps;
  75. uint8_t dat,i;
  76. temps=s;
  77. dat=0x80;
  78. _SDA_OUT(I2C_Handle);
  79. for(i=0;i<8;i++)
  80. {
  81. if(dat&temps)
  82. {
  83. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET);
  84. Delay(DLY_US);
  85. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET);
  86. Delay(DLY_US);//t(HIGH) Clock high period See Note 2 4.0~50us
  87. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET);
  88. Delay(DLY_US - 1);
  89. }
  90. else
  91. {
  92. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET);
  93. Delay(DLY_US);
  94. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET);
  95. Delay(DLY_US);
  96. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET);
  97. Delay(DLY_US - 1);
  98. }
  99. dat=dat>>1;
  100. }
  101. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET);
  102. Delay(1);
  103. }
  104. void I2C_Read_Byte(I2C_Handle_Struct_t* I2C_Handle, uint8_t *s)
  105. {
  106. uint8_t temps=0,i;
  107. uint8_t text=0x80;
  108. uint8_t sdain;
  109. _SDA_IN(I2C_Handle);
  110. for(i=0;i<8;i++)
  111. {
  112. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET);
  113. Delay(DLY_US);
  114. sdain = HAL_GPIO_ReadPin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin);
  115. if(1==sdain)
  116. {
  117. temps |=(text>>i);
  118. }
  119. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET);
  120. Delay(DLY_US);
  121. }
  122. *s=temps;
  123. Delay(1);
  124. }
  125. uint8_t I2C_Check_Ack(I2C_Handle_Struct_t* I2C_Handle)
  126. {
  127. uint8_t sdain;
  128. _SDA_IN(I2C_Handle);;
  129. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET);
  130. Delay(1);
  131. sdain = HAL_GPIO_ReadPin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin);
  132. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET);
  133. Delay(1);
  134. if(1==sdain)
  135. {
  136. return 1;
  137. }
  138. else
  139. {
  140. return 0;
  141. }
  142. }
  143. void I2C_Send_Ack(I2C_Handle_Struct_t* I2C_Handle)
  144. {
  145. _SDA_OUT(I2C_Handle);
  146. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET);
  147. Delay(1);
  148. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET);
  149. Delay(DLY_US);
  150. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET);
  151. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET);
  152. Delay(DLY_US);
  153. }
  154. void I2C_Send_Nack(I2C_Handle_Struct_t* I2C_Handle)
  155. {
  156. _SDA_OUT(I2C_Handle);
  157. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_SET);
  158. Delay(1);
  159. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_SET);
  160. Delay(DLY_US);
  161. HAL_GPIO_WritePin(I2C_Handle->SCL_GPIOx, I2C_Handle->SCL_GPIO_Pin, GPIO_PIN_RESET);
  162. HAL_GPIO_WritePin(I2C_Handle->SDA_GPIOx, I2C_Handle->SDA_GPIO_Pin, GPIO_PIN_RESET);
  163. Delay(1);
  164. }