Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void i2c_send(uint8_t slave_adr, uint16_t adr, uint8_t data){
- I2C2->CR2 &= ~(0x1111111<<1); //очистка поля адресса
- I2C2->CR2 |= ((slave_adr << 1)); //установка адресса слейва к которому подключаемся
- I2C2->CR2 &= ~I2C_CR2_RD_WRN; //режим записи в устройство
- I2C2->CR2 |= I2C_CR2_START; //старт на линии и передача адресса устройства
- while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY); //ждем пока регистр TXDR опустошится и освободится линия
- I2C2->TXDR = (adr & 0xFF00) >> 8; //передаем старшый байт адресса
- while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);
- I2C2->TXDR = (adr & 0xFF); //передаем младшый байт адресса
- while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);
- I2C2->TXDR = data; //передаем данные
- while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);
- I2C2->CR2 |= I2C_CR2_STOP; //отправляем стоп на линию
- }
- uint8_t i2c_get(uint8_t slave_adr, uint16_t adr){
- uint8_t res;
- uint32_t i;
- I2C2->CR2 &= ~(0x1111111<<1); //очистка поля адресса
- I2C2->CR2 |= ((slave_adr << 1)); //установка адресса
- I2C2->CR2 &= ~I2C_CR2_RD_WRN; //режим записи в слейв
- I2C2->CR2 |= I2C_CR2_START; //старт и передача адресса
- I2C2->TXDR = (adr & 0xFF00) >> 8; //передаем старшый байт адресса
- while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY); //ждем пока регистр TXDR опустошится и освободится линия
- I2C2->TXDR = (adr & 0xFF); //передаем младшый байт адресса
- while(!(I2C2->ISR & I2C_ISR_TXE) || I2C2->ISR & I2C_ISR_BUSY);
- for(i = 0; i < 10000; i++); //пауза что бы i2c eeprom успела раздуплится
- I2C2->CR2 |= I2C_CR2_RD_WRN; //режим чтения из слейва
- I2C2->CR2 |= I2C_CR2_START; //повторный старт
- while(!(I2C2->ISR & I2C_ISR_RXNE) || I2C2->ISR & I2C_ISR_BUSY); //ждем пока появятся данные от слейва
- res = I2C2->RXDR; //считываем данные
- I2C2->CR2 |= I2C_CR2_NACK; //отправляем NACK
- I2C2->CR2 |= I2C_CR2_STOP; //стоп на линию
- return res; //возврат данных
- }
- void i2c_init(){
- RCC->AHBENR |= RCC_AHBENR_GPIOFEN; //тактирование порта F
- GPIOF->MODER |= (GPIO_MODER_MODER6_1 | GPIO_MODER_MODER7_1); //альтернативные режим
- GPIOF->OTYPER |= (GPIO_OTYPER_OT_6 | GPIO_OTYPER_OT_7); //выход открытый колектор
- RCC->APB1ENR |= RCC_APB1ENR_I2C2EN; //тактирование i2c
- I2C2->TIMINGR |= (I2C_TIMINGR_PRESC //временные интервалы макс длительные
- | I2C_TIMINGR_SCLDEL
- | I2C_TIMINGR_SDADEL
- | I2C_TIMINGR_SCLH
- | I2C_TIMINGR_SCLL);
- I2C2->CR1 |= (I2C_CR1_PE); //включаю модуль i2c
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement