Advertisement
2andnot

Untitled

Aug 10th, 2020 (edited)
1,338
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.30 KB | None | 0 0
  1. void i2c_send(uint8_t slave_adr, uint16_t adr, uint8_t data){
  2.     I2C2->CR2 &= ~(0x1111111<<1);                                   //очистка поля адресса
  3.     I2C2->CR2 |= ((slave_adr << 1));                                //установка адресса слейва к которому подключаемся
  4.     I2C2->CR2 &= ~I2C_CR2_RD_WRN;                                   //режим записи в устройство
  5.     I2C2->CR2 |= I2C_CR2_START;                                     //старт на линии и передача адресса устройства
  6.     while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);  //ждем пока регистр TXDR опустошится и освободится линия
  7.     I2C2->TXDR = (adr & 0xFF00) >> 8;                               //передаем старшый байт адресса
  8.     while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);
  9.     I2C2->TXDR = (adr & 0xFF);                                      //передаем младшый байт адресса
  10.     while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);
  11.     I2C2->TXDR = data;                                              //передаем данные
  12.     while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);
  13.     I2C2->CR2 |= I2C_CR2_STOP;                                      //отправляем стоп на линию
  14. }
  15.  
  16.  
  17. uint8_t i2c_get(uint8_t slave_adr, uint16_t adr){
  18.     uint8_t res;
  19.     uint32_t i;
  20.     I2C2->CR2 &= ~(0x1111111<<1);                                   //очистка поля адресса
  21.     I2C2->CR2 |= ((slave_adr << 1));                                //установка адресса
  22.     I2C2->CR2 &= ~I2C_CR2_RD_WRN;                                   //режим записи в слейв
  23.     I2C2->CR2 |= I2C_CR2_START;                                     //старт и передача адресса
  24.     I2C2->TXDR = (adr & 0xFF00) >> 8;                               //передаем старшый байт адресса
  25.     while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);  //ждем пока регистр TXDR опустошится и освободится линия
  26.     I2C2->TXDR = (adr & 0xFF);                                      //передаем младшый байт адресса
  27.     while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);
  28.     for(i = 0; i < 10000; i++);                                     //пауза что бы i2c eeprom успела раздуплится
  29.     I2C2->CR2 |= I2C_CR2_RD_WRN;                                    //режим чтения из слейва
  30.     I2C2->CR2 |= I2C_CR2_START;                                     //повторный старт
  31.     while(!(I2C2->ISR & I2C_ISR_RXNE) || I2C2->ISR & I2C_ISR_BUSY); //ждем пока появятся данные от слейва
  32.     res = I2C2->RXDR;                                               //считываем данные
  33.     I2C2->CR2 |= I2C_CR2_NACK;                                      //отправляем NACK
  34.     I2C2->CR2 |= I2C_CR2_STOP;                                      //стоп на линию
  35.     return res;                                                     //возврат данных
  36. }
  37.  
  38. void i2c_init(){
  39.     RCC->AHBENR |= RCC_AHBENR_GPIOFEN;                              //тактирование порта F
  40.     GPIOF->MODER |= (GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1);    //альтернативные режим
  41.     GPIOF->OTYPER |= (GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7);         //выход открытый колектор
  42.     RCC->APB1ENR |= RCC_APB1ENR_I2C2EN;                             //тактирование i2c
  43.     I2C2->TIMINGR   |= (I2C_TIMINGR_PRESC                           //временные интервалы макс длительные
  44.                     | I2C_TIMINGR_SCLDEL
  45.                     | I2C_TIMINGR_SDADEL
  46.                     | I2C_TIMINGR_SCLH
  47.                     | I2C_TIMINGR_SCLL);
  48.     I2C2->CR1 |= (I2C_CR1_PE);                                      //включаю модуль i2c
  49. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement