i2c.c 9.1 KB

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