i2c.c 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /******************************************************************************
  2. * Драйвер модуля I2C микроконтроллера STM8S003F
  3. *
  4. * Автор: Осипов Андрей
  5. * Дата: 17 июля 2014
  6. * URL: http://hamlab.net/mcu/stm8/i2c.html
  7. ******************************************************************************/
  8. #include "i2c.h"
  9. /* Таймаут ожидания события I2C */
  10. extern __IO uint8_t I2C_timeout;
  11. /* Ожидание наступления события event в течении времени timeout в мс */
  12. #define wait_event(event, timeout) I2C_timeout = timeout;\
  13. while(event && I2C_timeout);\
  14. if(!I2C_timeout) return I2C_TIMEOUT;
  15. #define set_I2C_timeout_ms(time) I2C_timeout = time
  16. /**
  17. * @brief Инициализация I2C интерфейса
  18. */
  19. void i2c_master_init(void) {
  20. uint16_t ccr;
  21. /* Настройка GPIO SDA SCL - HiZ, Open drain, Fast */
  22. GPIOB->DDR |= (GPIO_PIN_4 | GPIO_PIN_5);
  23. GPIOB->ODR |= (GPIO_PIN_4 | GPIO_PIN_5);
  24. GPIOB->CR2 |= (GPIO_PIN_4 | GPIO_PIN_5);
  25. //Частота тактирования периферии MHz
  26. I2C->FREQR = (uint8_t)(F_MASTER_MHZ);
  27. //Отключаем I2C
  28. I2C->CR1 &= (uint8_t)(~I2C_CR1_PE);
  29. //Выбираем режим
  30. #ifdef I2C_FAST
  31. I2C->CCRH = I2C_CCRH_FS; // | I2C_CCRH_DUTY;
  32. #else
  33. I2C->CCRH = 0;
  34. #endif
  35. //CCR = Fmaster/2*Fiic = 16MHz/2*100kHz = 80
  36. ccr = (uint16_t)(F_MASTER_HZ / (2 * F_I2C_HZ));
  37. //Set Maximum Rise Time: 1000ns max in Standard Mode
  38. //= [1000ns/(1/InputClockFrequencyMHz.10e6)]+1
  39. //= InputClockFrequencyMHz+1
  40. I2C->TRISER = (uint8_t)(F_MASTER_MHZ + 1);
  41. I2C->CCRL = (uint8_t)ccr;
  42. I2C->CCRH |= (uint8_t)((uint8_t)(ccr >> 8) & I2C_CCRH_CCR);
  43. //Включаем I2C
  44. I2C->CR1 |= I2C_CR1_PE;
  45. //Разрешаем подтверждение в конце посылки
  46. I2C->CR2 |= I2C_CR2_ACK;
  47. }
  48. /**
  49. * @brief Send data to slave device.
  50. */
  51. t_i2c_status i2c_wr_data(const uint8_t address, const uint8_t num_bytes_to_wr, uint8_t * data) {
  52. uint8_t adr = address << 1;
  53. uint8_t length = num_bytes_to_wr;
  54. //Ждем освобождения шины I2C
  55. wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
  56. //Генерация СТАРТ-посылки
  57. I2C->CR2 |= I2C_CR2_START;
  58. //Ждем установки бита SB
  59. wait_event(!(I2C->SR1 & I2C_SR1_SB), 5);
  60. //Записываем в регистр данных адрес ведомого устройства
  61. I2C->DR = adr;
  62. //Ждем подтверждения передачи адреса
  63. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 5);
  64. //Очистка бита ADDR чтением регистра SR3
  65. I2C->SR3;
  66. //Отправка данных
  67. while (length--) {
  68. //Ждем освобождения регистра данных
  69. wait_event(!(I2C->SR1 & I2C_SR1_TXE), 5);
  70. //Отправляем адрес регистра
  71. I2C->DR = *data++;
  72. }
  73. //Ловим момент, когда DR освободился и данные попали в сдвиговый регистр
  74. wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 5);
  75. //Посылаем СТОП-посылку
  76. I2C->CR2 |= I2C_CR2_STOP;
  77. //Ждем выполнения условия СТОП
  78. wait_event((I2C->CR2 & I2C_CR2_STOP), 5);
  79. return I2C_SUCCESS;
  80. }
  81. /**
  82. * @brief Чтение регистра slave-устройства
  83. * @note Start -> Slave Addr -> Reg. addr -> Restart -> Slave Addr <- data ... -> Stop
  84. */
  85. t_i2c_status i2c_rd_data(const uint8_t address, const uint8_t num_bytes_to_rd, uint8_t * data) {
  86. uint8_t addr = (address << 1) | 1;
  87. uint8_t length = num_bytes_to_rd;
  88. //Ждем освобождения шины I2C
  89. wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
  90. //Разрешаем подтверждение в конце посылки
  91. I2C->CR2 |= I2C_CR2_ACK;
  92. //Генерация СТАРТ-посылки
  93. I2C->CR2 |= I2C_CR2_START;
  94. //Ждем установки бита SB
  95. wait_event(!(I2C->SR1 & I2C_SR1_SB), 2);
  96. //Записываем в регистр данных адрес ведомого устройства и переходим
  97. //в режим чтения (установкой младшего бита в 1)
  98. I2C->DR = addr;
  99. //Дальше алгоритм зависит от количества принимаемых байт
  100. //N=1
  101. if(length == 1){
  102. //Запрещаем подтверждение в конце посылки
  103. I2C->CR2 &= ~I2C_CR2_ACK;
  104. //Ждем подтверждения передачи адреса
  105. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  106. //Заплатка из Errata
  107. disableInterrupts();
  108. //Очистка бита ADDR чтением регистра SR3
  109. I2C->SR3;
  110. //Устанавлием бит STOP
  111. I2C->CR2 |= I2C_CR2_STOP;
  112. //Заплатка из Errata
  113. enableInterrupts();
  114. //Ждем прихода данных в RD
  115. wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 2);
  116. //Читаем принятый байт
  117. *data = I2C->DR;
  118. }
  119. //N=2
  120. else if (length == 2) {
  121. //Бит который разрешает NACK на следующем принятом байте
  122. I2C->CR2 |= I2C_CR2_POS;
  123. //Ждем подтверждения передачи адреса
  124. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  125. //Заплатка из Errata
  126. disableInterrupts();
  127. //Очистка бита ADDR чтением регистра SR3
  128. I2C->SR3;
  129. //Запрещаем подтверждение в конце посылки
  130. I2C->CR2 &= ~I2C_CR2_ACK;
  131. //Заплатка из Errata
  132. enableInterrupts();
  133. //Ждем момента, когда первый байт окажется в DR,
  134. //а второй в сдвиговом регистре
  135. wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
  136. //Заплатка из Errata
  137. disableInterrupts();
  138. //Устанавлием бит STOP
  139. I2C->CR2 |= I2C_CR2_STOP;
  140. //Читаем принятые байты
  141. *data++ = I2C->DR;
  142. //Заплатка из Errata
  143. enableInterrupts();
  144. *data = I2C->DR;
  145. }
  146. //N>2
  147. else if (length > 2) {
  148. //Ждем подтверждения передачи адреса
  149. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  150. //Заплатка из Errata
  151. disableInterrupts();
  152. //Очистка бита ADDR чтением регистра SR3
  153. I2C->SR3;
  154. //Заплатка из Errata
  155. enableInterrupts();
  156. while (length-- > 3 && I2C_timeout) {
  157. //Ожидаем появления данных в DR и сдвиговом регистре
  158. wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
  159. //Читаем принятый байт из DR
  160. *data++ = I2C->DR;
  161. }
  162. //Время таймаута вышло
  163. if (!I2C_timeout) return I2C_TIMEOUT;
  164. //Осталось принять 3 последних байта
  165. //Ждем, когда в DR окажется N-2 байт, а в сдвиговом регистре
  166. //окажется N-1 байт
  167. wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
  168. //Запрещаем подтверждение в конце посылки
  169. I2C->CR2 &= ~I2C_CR2_ACK;
  170. //Заплатка из Errata
  171. disableInterrupts();
  172. //Читаем N-2 байт из RD, тем самым позволяя принять в сдвиговый
  173. //регистр байт N, но теперь в конце приема отправится посылка NACK
  174. *data++ = I2C->DR;
  175. //Посылка STOP
  176. I2C->CR2 |= I2C_CR2_STOP;
  177. //Читаем N-1 байт
  178. *data++ = I2C->DR;
  179. //Заплатка из Errata
  180. enableInterrupts();
  181. //Ждем, когда N-й байт попадет в DR из сдвигового регистра
  182. wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 2);
  183. //Читаем N байт
  184. *data++ = I2C->DR;
  185. }
  186. //Ждем отправки СТОП посылки
  187. wait_event((I2C->CR2 & I2C_CR2_STOP), 2);
  188. //Сбрасывает бит POS, если вдруг он был установлен
  189. I2C->CR2 &= ~I2C_CR2_POS;
  190. return I2C_SUCCESS;
  191. }