i2c.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  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 == 0) return I2C_TIMEOUT;
  15. /**
  16. * @brief Инициализация I2C интерфейса
  17. */
  18. void i2c_master_init(void) {
  19. /* Настройка GPIO SDA SCL - HiZ, Open drain, Fast */
  20. GPIOB->ODR |= (GPIO_PIN_4 | GPIO_PIN_5); // default high level
  21. GPIOB->DDR |= (GPIO_PIN_4 | GPIO_PIN_5); // output mode
  22. // GPIOB->CR1 &= ~(GPIO_PIN_4 | GPIO_PIN_5); // open drain
  23. GPIOB->CR2 |= (GPIO_PIN_4 | GPIO_PIN_5); // fast mode
  24. //Частота тактирования периферии MHz
  25. I2C->FREQR = (uint8_t)(F_MASTER_MHZ);
  26. //Отключаем I2C
  27. I2C->CR1 &= (uint8_t)(~I2C_CR1_PE);
  28. #ifdef I2C_FAST
  29. /* Set Maximum Rise Time: 300ns max in Fast Mode
  30. = [300ns/(1/F_MASTER_HZ)]+1
  31. = [(F_MASTER_MHZ * 3)/10]+1
  32. = ((16 * 3 )/ 10 +) 1 = 5 */
  33. I2C->TRISER = 5;
  34. /* Fast mode speed calculate: Tlow/Thigh = 16/9 */
  35. //ccr = (uint16_t) 1; //(F_MASTER_HZ / (25 * F_I2C_HZ)); // = 16000 / (25 * 400) = 1,6 = 1
  36. /* Write CCR with new calculated value */
  37. I2C->CCRL = 1;
  38. I2C->CCRH = (uint8_t)(I2C_CCRH_FS | I2C_CCRH_DUTY);
  39. #else
  40. // uint16_t ccr;
  41. //CCR = Fmaster/2*Fiic = 16MHz/2*100kHz = 80
  42. // ccr = (uint16_t)(F_MASTER_HZ / (2 * F_I2C_HZ));
  43. //Set Maximum Rise Time: 1000ns max in Standard Mode
  44. //= [1000ns/(1/InputClockFrequencyMHz.10e6)]+1
  45. //= InputClockFrequencyMHz+1
  46. I2C->TRISER = 17; //(uint8_t)(F_MASTER_MHZ + 1);
  47. /* Write CCR with new calculated value */
  48. I2C->CCRL = 80; //ccr;
  49. I2C->CCRH = 0; //(uint8_t)((uint8_t)((uint8_t)(ccr >> 8) & I2C_CCRH_CCR));
  50. #endif // I2C_FAST
  51. //Включаем I2C
  52. I2C->CR1 |= I2C_CR1_PE;
  53. //Разрешаем подтверждение в конце посылки
  54. I2C->CR2 |= I2C_CR2_ACK;
  55. //Выключаем I2C -- сброса флага BUSY
  56. I2C->CR1 &= ~I2C_CR1_PE;
  57. }
  58. /**
  59. * @brief Запись регистра slave-устройства
  60. */
  61. t_i2c_status i2c_wr_reg(uint8_t address, uint8_t reg_addr, \
  62. const uint8_t * data, uint8_t length) {
  63. //Включаем I2C
  64. I2C->CR1 |= I2C_CR1_PE;
  65. //Ждем освобождения шины I2C
  66. wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
  67. //Генерация СТАРТ-посылки
  68. I2C->CR2 |= I2C_CR2_START;
  69. //Ждем установки бита SB
  70. wait_event(!(I2C->SR1 & I2C_SR1_SB), 2);
  71. //Записываем в регистр данных адрес ведомого устройства
  72. I2C->DR = address & 0xFE;
  73. //Ждем подтверждения передачи адреса
  74. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  75. //Очистка бита ADDR чтением регистра SR3
  76. I2C->SR3;
  77. //Ждем освобождения регистра данных
  78. wait_event(!(I2C->SR1 & I2C_SR1_TXE), 2);
  79. //Отправляем адрес регистра
  80. I2C->DR = reg_addr;
  81. //Отправка данных
  82. while(length --) {
  83. //Ждем освобождения регистра данных
  84. wait_event(!(I2C->SR1 & I2C_SR1_TXE), 2);
  85. //Отправляем адрес регистра
  86. I2C->DR = *data++;
  87. }
  88. //Ловим момент, когда DR освободился и данные попали в сдвиговый регистр
  89. wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 2);
  90. //Посылаем СТОП-посылку
  91. I2C->CR2 |= I2C_CR2_STOP;
  92. //Ждем выполнения условия СТОП
  93. wait_event((I2C->CR2 & I2C_CR2_STOP), 2);
  94. //Отключаем I2C
  95. I2C->CR1 &= (uint8_t)(~I2C_CR1_PE);
  96. return I2C_SUCCESS;
  97. }
  98. /**
  99. * @brief Запись байта в slave-устройство
  100. */
  101. t_i2c_status i2c_wr_byte(uint8_t address, uint8_t byte) {
  102. //Включаем I2C
  103. I2C->CR1 |= I2C_CR1_PE;
  104. //Ждем освобождения шины I2C
  105. wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
  106. //Генерация СТАРТ-посылки
  107. I2C->CR2 |= I2C_CR2_START;
  108. //Ждем установки бита SB
  109. wait_event(!(I2C->SR1 & I2C_SR1_SB), 2);
  110. //Записываем в регистр данных адрес ведомого устройства
  111. I2C->DR = address & 0xFE;
  112. //Ждем подтверждения передачи адреса
  113. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  114. //Очистка бита ADDR чтением регистра SR3
  115. I2C->SR3;
  116. //Ждем освобождения регистра данных
  117. wait_event(!(I2C->SR1 & I2C_SR1_TXE), 2);
  118. //Отправляем байт
  119. I2C->DR = byte;
  120. //Ловим момент, когда DR освободился и данные попали в сдвиговый регистр
  121. wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 2);
  122. //Посылаем СТОП-посылку
  123. I2C->CR2 |= I2C_CR2_STOP;
  124. //Ждем выполнения условия СТОП
  125. wait_event((I2C->CR2 & I2C_CR2_STOP), 2);
  126. //Отключаем I2C
  127. I2C->CR1 &= (uint8_t)(~I2C_CR1_PE);
  128. return I2C_SUCCESS;
  129. }
  130. /**
  131. * @brief Чтение регистра slave-устройства
  132. * @note Start -> Slave Addr -> Reg. addr -> Restart -> Slave Addr <- data ... -> Stop
  133. */
  134. t_i2c_status i2c_rd_reg(uint8_t address, uint8_t reg_addr, \
  135. uint8_t * data, uint8_t length) {
  136. //Включаем I2C
  137. I2C->CR1 |= I2C_CR1_PE;
  138. //Ждем освобождения шины I2C
  139. wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
  140. //Разрешаем подтверждение в конце посылки
  141. I2C->CR2 |= I2C_CR2_ACK;
  142. //Генерация СТАРТ-посылки
  143. I2C->CR2 |= I2C_CR2_START;
  144. //Ждем установки бита SB
  145. wait_event(!(I2C->SR1 & I2C_SR1_SB), 2);
  146. //Записываем в регистр данных адрес ведомого устройства
  147. I2C->DR = address & 0xFE;
  148. //Ждем подтверждения передачи адреса
  149. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  150. //Очистка бита ADDR чтением регистра SR3
  151. I2C->SR3;
  152. //Ждем освобождения регистра данных RD
  153. wait_event(!(I2C->SR1 & I2C_SR1_TXE), 2);
  154. //Передаем адрес регистра slave-устройства, который хотим прочитать
  155. I2C->DR = reg_addr;
  156. //Ловим момент, когда DR освободился и данные попали в сдвиговый регистр
  157. wait_event(!((I2C->SR1 & I2C_SR1_TXE) && (I2C->SR1 & I2C_SR1_BTF)), 2);
  158. //Генерация СТАРТ-посылки (рестарт)
  159. I2C->CR2 |= I2C_CR2_START;
  160. //Ждем установки бита SB
  161. wait_event(!(I2C->SR1 & I2C_SR1_SB), 2);
  162. //Записываем в регистр данных адрес ведомого устройства и переходим
  163. //в режим чтения (установкой младшего бита в 1)
  164. I2C->DR = address | 0x01;
  165. //Дальше алгоритм зависит от количества принимаемых байт
  166. //N=1
  167. if(length == 1){
  168. //Запрещаем подтверждение в конце посылки
  169. I2C->CR2 &= ~I2C_CR2_ACK;
  170. //Ждем подтверждения передачи адреса
  171. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  172. //Заплатка из Errata
  173. disableInterrupts();
  174. //Очистка бита ADDR чтением регистра SR3
  175. I2C->SR3;
  176. //Устанавлием бит STOP
  177. I2C->CR2 |= I2C_CR2_STOP;
  178. //Заплатка из Errata
  179. enableInterrupts();
  180. //Ждем прихода данных в RD
  181. wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 2);
  182. //Читаем принятый байт
  183. *data = I2C->DR;
  184. }
  185. //N=2
  186. else if(length == 2){
  187. //Бит который разрешает NACK на следующем принятом байте
  188. I2C->CR2 |= I2C_CR2_POS;
  189. //Ждем подтверждения передачи адреса
  190. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  191. //Заплатка из Errata
  192. disableInterrupts();
  193. //Очистка бита ADDR чтением регистра SR3
  194. I2C->SR3;
  195. //Запрещаем подтверждение в конце посылки
  196. I2C->CR2 &= (uint8_t)(~I2C_CR2_ACK);
  197. //Заплатка из Errata
  198. enableInterrupts();
  199. //Ждем момента, когда первый байт окажется в DR,
  200. //а второй в сдвиговом регистре
  201. wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
  202. //Заплатка из Errata
  203. disableInterrupts();
  204. //Устанавлием бит STOP
  205. I2C->CR2 |= I2C_CR2_STOP;
  206. //Читаем принятые байты
  207. *data++ = I2C->DR;
  208. //Заплатка из Errata
  209. enableInterrupts();
  210. *data = I2C->DR;
  211. }
  212. //N>2
  213. else if(length > 2){
  214. //Ждем подтверждения передачи адреса
  215. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  216. //Заплатка из Errata
  217. disableInterrupts();
  218. //Очистка бита ADDR чтением регистра SR3
  219. I2C->SR3;
  220. //Заплатка из Errata
  221. enableInterrupts();
  222. I2C_timeout = 10; // 10 ms ???
  223. while (length-- > 3 && I2C_timeout) {
  224. //Ожидаем появления данных в DR и сдвиговом регистре
  225. wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
  226. //Читаем принятый байт из DR
  227. *(data++) = I2C->DR;
  228. }
  229. //Время таймаута вышло
  230. if(!I2C_timeout) {
  231. //Отключаем I2C
  232. I2C->CR1 &= (uint8_t)(~I2C_CR1_PE);
  233. return I2C_TIMEOUT;
  234. }
  235. //Осталось принять 3 последних байта
  236. //Ждем, когда в DR окажется N-2 байт, а в сдвиговом регистре
  237. //окажется N-1 байт
  238. wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
  239. //Запрещаем подтверждение в конце посылки
  240. I2C->CR2 &= (uint8_t)(~I2C_CR2_ACK);
  241. //Заплатка из Errata
  242. disableInterrupts();
  243. //Читаем N-2 байт из RD, тем самым позволяя принять в сдвиговый
  244. //регистр байт N, но теперь в конце приема отправится посылка NACK
  245. *(data++) = I2C->DR;
  246. //Посылка STOP
  247. I2C->CR2 |= I2C_CR2_STOP;
  248. //Читаем N-1 байт
  249. *(data++) = I2C->DR;
  250. //Заплатка из Errata
  251. enableInterrupts();
  252. //Ждем, когда N-й байт попадет в DR из сдвигового регистра
  253. wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 2);
  254. //Читаем N байт
  255. *(data++) = I2C->DR;
  256. }
  257. //Ждем отправки СТОП посылки
  258. wait_event((I2C->CR2 & I2C_CR2_STOP), 2);
  259. //Сбрасывает бит POS, если вдруг он был установлен
  260. I2C->CR2 &= ~I2C_CR2_POS;
  261. //Отключаем I2C
  262. I2C->CR1 &= (uint8_t)(~I2C_CR1_PE);
  263. return I2C_SUCCESS;
  264. }
  265. /**
  266. * @brief Чтение байт из slave-устройства
  267. * @note Start -> Slave Addr <- data ... -> Stop
  268. */
  269. t_i2c_status i2c_rd_bytes(uint8_t address, uint8_t * data, uint8_t length) {
  270. //Включаем I2C
  271. I2C->CR1 |= I2C_CR1_PE;
  272. //Ждем освобождения шины I2C
  273. wait_event((I2C->SR3 & I2C_SR3_BUSY), 10);
  274. //Разрешаем подтверждение в конце посылки
  275. I2C->CR2 |= I2C_CR2_ACK;
  276. //Генерация СТАРТ-посылки
  277. I2C->CR2 |= I2C_CR2_START;
  278. //Ждем установки бита SB
  279. wait_event(!(I2C->SR1 & I2C_SR1_SB), 2);
  280. //Записываем в регистр данных адрес ведомого устройства
  281. I2C->DR = address;
  282. //Дальше алгоритм зависит от количества принимаемых байт
  283. //N=1
  284. if(length == 1){
  285. //Запрещаем подтверждение в конце посылки
  286. I2C->CR2 &= ~I2C_CR2_ACK;
  287. //Ждем подтверждения передачи адреса
  288. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  289. //Заплатка из Errata
  290. disableInterrupts();
  291. //Очистка бита ADDR чтением регистра SR3
  292. I2C->SR3;
  293. //Устанавлием бит STOP
  294. I2C->CR2 |= I2C_CR2_STOP;
  295. //Заплатка из Errata
  296. enableInterrupts();
  297. //Ждем прихода данных в RD
  298. wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 2);
  299. //Читаем принятый байт
  300. *data = I2C->DR;
  301. }
  302. //N=2
  303. else if(length == 2){
  304. //Бит который разрешает NACK на следующем принятом байте
  305. I2C->CR2 |= I2C_CR2_POS;
  306. //Ждем подтверждения передачи адреса
  307. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  308. //Заплатка из Errata
  309. disableInterrupts();
  310. //Очистка бита ADDR чтением регистра SR3
  311. I2C->SR3;
  312. //Запрещаем подтверждение в конце посылки
  313. I2C->CR2 &= (uint8_t)(~I2C_CR2_ACK);
  314. //Заплатка из Errata
  315. enableInterrupts();
  316. //Ждем момента, когда первый байт окажется в DR,
  317. //а второй в сдвиговом регистре
  318. wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
  319. //Заплатка из Errata
  320. disableInterrupts();
  321. //Устанавлием бит STOP
  322. I2C->CR2 |= I2C_CR2_STOP;
  323. //Читаем принятые байты
  324. *data++ = I2C->DR;
  325. //Заплатка из Errata
  326. enableInterrupts();
  327. *data = I2C->DR;
  328. }
  329. //N>2
  330. else if(length > 2){
  331. //Ждем подтверждения передачи адреса
  332. wait_event(!(I2C->SR1 & I2C_SR1_ADDR), 2);
  333. //Заплатка из Errata
  334. disableInterrupts();
  335. //Очистка бита ADDR чтением регистра SR3
  336. I2C->SR3;
  337. //Заплатка из Errata
  338. enableInterrupts();
  339. I2C_timeout = 10; // 10 ms ???
  340. while (length-- > 3 && I2C_timeout) {
  341. //Ожидаем появления данных в DR и сдвиговом регистре
  342. wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
  343. //Читаем принятый байт из DR
  344. *(data++) = I2C->DR;
  345. }
  346. //Время таймаута вышло
  347. if(!I2C_timeout) {
  348. //Отключаем I2C
  349. I2C->CR1 &= (uint8_t)(~I2C_CR1_PE);
  350. return I2C_TIMEOUT;
  351. }
  352. //Осталось принять 3 последних байта
  353. //Ждем, когда в DR окажется N-2 байт, а в сдвиговом регистре
  354. //окажется N-1 байт
  355. wait_event(!(I2C->SR1 & I2C_SR1_BTF), 2);
  356. //Запрещаем подтверждение в конце посылки
  357. I2C->CR2 &= (uint8_t)(~I2C_CR2_ACK);
  358. //Заплатка из Errata
  359. disableInterrupts();
  360. //Читаем N-2 байт из RD, тем самым позволяя принять в сдвиговый
  361. //регистр байт N, но теперь в конце приема отправится посылка NACK
  362. *(data++) = I2C->DR;
  363. //Посылка STOP
  364. I2C->CR2 |= I2C_CR2_STOP;
  365. //Читаем N-1 байт
  366. *(data++) = I2C->DR;
  367. //Заплатка из Errata
  368. enableInterrupts();
  369. //Ждем, когда N-й байт попадет в DR из сдвигового регистра
  370. wait_event(!(I2C->SR1 & I2C_SR1_RXNE), 2);
  371. //Читаем N байт
  372. *(data++) = I2C->DR;
  373. }
  374. //Ждем отправки СТОП посылки
  375. wait_event((I2C->CR2 & I2C_CR2_STOP), 2);
  376. //Сбрасывает бит POS, если вдруг он был установлен
  377. I2C->CR2 &= ~I2C_CR2_POS;
  378. //Отключаем I2C
  379. I2C->CR1 &= (uint8_t)(~I2C_CR1_PE);
  380. return I2C_SUCCESS;
  381. }