I2C_Analog.c 5.4 KB

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