I2C.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. #include "bsp.h"
  2. #include "utils.h"
  3. #include "I2C.h"
  4. void I2C_Device_Init(void)
  5. {
  6. GPIO_InitTypeDef GPIO_InitStruct;
  7. BSP_I2Cx_SCL_GPIO_CLK_ENABLE();
  8. BSP_I2Cx_SDA_GPIO_CLK_ENABLE();
  9. BSP_EEROM_WRITE_PROTECT_CLK_ENABLE();
  10. BSP_RTC_INTERRUPT_CLK_ENABLE();
  11. GPIO_InitStruct.Pin = BSP_I2Cx_SDA_PIN;
  12. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_OD;//GPIO_MODE_OUTPUT_PP;
  13. GPIO_InitStruct.Pull = BSP_I2Cx_SDA_PULL;
  14. GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  15. HAL_GPIO_Init(BSP_I2Cx_SDA_GPIO_PORT, &GPIO_InitStruct);
  16. GPIO_InitStruct.Pin = BSP_I2Cx_SCL_PIN;
  17. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  18. GPIO_InitStruct.Pull = GPIO_PULLUP;
  19. GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  20. HAL_GPIO_Init(BSP_I2Cx_SCL_GPIO_PORT, &GPIO_InitStruct);
  21. GPIO_InitStruct.Pin = BSP_EEROM_WRITE_PROTECT_PIN;
  22. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  23. GPIO_InitStruct.Pull = BSP_EEROM_WRITE_PROTECT_PULL;
  24. GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  25. HAL_GPIO_Init(BSP_EEROM_WRITE_PROTECT_PORT, &GPIO_InitStruct);
  26. BSP_EEROM_WRITE_FORBIDEN();
  27. GPIO_InitStruct.Pin = BSP_RTC_INTERRUPT_PIN;
  28. GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  29. GPIO_InitStruct.Pull = BSP_RTC_INTERRUPT_PULL;
  30. GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
  31. HAL_GPIO_Init(BSP_RTC_INTERRUPT_PORT, &GPIO_InitStruct);
  32. HAL_NVIC_SetPriority(BSP_RTC_INTERRUPT_IRQn, BSP_RTC_INTERRUPT_PRIORITY, 0);
  33. HAL_NVIC_EnableIRQ(BSP_RTC_INTERRUPT_IRQn);
  34. }
  35. //Set SDA to pushpull output
  36. void I2C_GPIO_Out_Config(void)
  37. {
  38. GPIO_InitTypeDef GPIO_InitStruct;
  39. GPIO_InitStruct.Pin = BSP_I2Cx_SDA_PIN;
  40. GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  41. GPIO_InitStruct.Pull = BSP_I2Cx_SDA_PULL;
  42. GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  43. HAL_GPIO_Init(BSP_I2Cx_SDA_GPIO_PORT, &GPIO_InitStruct);
  44. }
  45. //Set SDA to pull up input
  46. void I2C_GPIO_In_Config(void)
  47. {
  48. GPIO_InitTypeDef GPIO_InitStruct;
  49. GPIO_InitStruct.Pin = BSP_I2Cx_SDA_PIN;
  50. GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  51. GPIO_InitStruct.Pull = BSP_I2Cx_SDA_PULL;
  52. GPIO_InitStruct.Speed = GPIO_SPEED_FAST;
  53. HAL_GPIO_Init(BSP_I2Cx_SDA_GPIO_PORT, &GPIO_InitStruct);
  54. }
  55. #ifdef __GNUC__
  56. #pragma GCC optimize ("O0")
  57. #elif defined(__ICCARM__)
  58. #pragma optimize=none
  59. #endif
  60. void I2C_Start(void)
  61. {
  62. BSP_I2Cx_SCL_LOW();
  63. I2C_GPIO_Out_Config();
  64. BSP_I2Cx_SDA_HIGH();
  65. BSP_I2Cx_SCL_HIGH();
  66. Delay_us(I2C_DELAY_COUNT);
  67. BSP_I2Cx_SDA_LOW();
  68. Delay_us(I2C_DELAY_COUNT);
  69. BSP_I2Cx_SCL_LOW();
  70. }
  71. #ifdef __GNUC__
  72. #pragma GCC optimize ("O0")
  73. #elif defined(__ICCARM__)
  74. #pragma optimize=none
  75. #endif
  76. void I2C_Stop(void)
  77. {
  78. BSP_I2Cx_SCL_LOW();
  79. I2C_GPIO_Out_Config();
  80. BSP_I2Cx_SDA_LOW(); //I2CStop is generated after SCL is low
  81. Delay_us(I2C_DELAY_COUNT);
  82. BSP_I2Cx_SCL_HIGH();
  83. BSP_I2Cx_SDA_HIGH();
  84. Delay_us(I2C_DELAY_COUNT);
  85. }
  86. //Wait for ack
  87. //Retur: 1, fails
  88. // 0, success
  89. #ifdef __GNUC__
  90. #pragma GCC optimize ("O0")
  91. #elif defined(__ICCARM__)
  92. #pragma optimize=none
  93. #endif
  94. uint8_t I2C_Wait_Ack(void)
  95. {
  96. uint8_t ucErrTime=0;
  97. BSP_I2Cx_SDA_HIGH();
  98. I2C_GPIO_In_Config();
  99. Delay_us(I2C_DELAY_COUNT);
  100. BSP_I2Cx_SCL_HIGH();
  101. Delay_us(I2C_DELAY_COUNT);
  102. while(BSP_I2Cx_SDA_STATUS())
  103. {
  104. ucErrTime++;
  105. if(ucErrTime>250)
  106. {
  107. I2C_Stop();
  108. return 1;
  109. }
  110. }
  111. BSP_I2Cx_SCL_LOW();//Set SCL = 0
  112. return 0;
  113. }
  114. //Generate ACK
  115. #ifdef __GNUC__
  116. #pragma GCC optimize ("O0")
  117. #elif defined(__ICCARM__)
  118. #pragma optimize=none
  119. #endif
  120. void I2C_Ack(void)
  121. {
  122. BSP_I2Cx_SCL_LOW();
  123. I2C_GPIO_Out_Config();
  124. BSP_I2Cx_SDA_LOW();
  125. Delay_us(I2C_DELAY_COUNT);
  126. BSP_I2Cx_SCL_HIGH();
  127. Delay_us(I2C_DELAY_COUNT);
  128. BSP_I2Cx_SCL_LOW();
  129. }
  130. //No ACK
  131. #ifdef __GNUC__
  132. #pragma GCC optimize ("O0")
  133. #elif defined(__ICCARM__)
  134. #pragma optimize=none
  135. #endif
  136. void I2C_NAck(void)
  137. {
  138. BSP_I2Cx_SCL_LOW();
  139. I2C_GPIO_Out_Config();
  140. BSP_I2Cx_SDA_HIGH();
  141. Delay_us(I2C_DELAY_COUNT);
  142. BSP_I2Cx_SCL_HIGH();
  143. Delay_us(I2C_DELAY_COUNT);
  144. BSP_I2Cx_SCL_LOW();
  145. }