//////////////////////////////Настраиваем I2C2 ////////////////////////////// void MAX98090_I2C2_Init(unsigned int system_frequency_hz) { RCC->APB1ENR1|=RCC_APB1ENR1_I2C2EN; // включаем тактирование I2C2 RCC->APB1SMENR1|=RCC_APB1SMENR1_I2C2SMEN; RCC->APB1RSTR1|=RCC_APB1RSTR1_I2C2RST; RCC->APB1RSTR1&=~RCC_APB1RSTR1_I2C2RST; //сбрасываем настройки I2C2 //внутренняя частота I2C2 4.5МГц при системной частоте 72МГц I2C2->TIMINGR|=I2C_TIMINGR_PRESC; //задержка между фронтом SDA и SCL I2C2->TIMINGR|=I2C_TIMINGR_SCLDEL; //задержка между фронтом SCL и SDA I2C2->TIMINGR|=I2C_TIMINGR_SDADEL; //скорее всего SDADEL SCLDEL должны быть меньше SCLL SCLH !!!! //Время низкого фронта SCL I2C2->TIMINGR|=I2C_TIMINGR_SCLL; //время высокого фронта SCL I2C2->TIMINGR|=I2C_TIMINGR_SCLH; I2C2->CR1|=I2C_CR1_PE; } ///////////////////////////////////////////////////////// void MAX98090_I2C2_Stop(void) { RCC->APB1ENR1|=RCC_APB1ENR1_I2C2EN; // включаем тактирование I2C2 RCC->APB1SMENR1|=RCC_APB1SMENR1_I2C2SMEN; RCC->APB1RSTR1|=RCC_APB1RSTR1_I2C2RST; //сбрасываем настройки I2C2 RCC->APB1ENR1 &=~ RCC_APB1ENR1_I2C2EN; // включаем тактирование I2C2 RCC->APB1SMENR1 &=~ RCC_APB1SMENR1_I2C2SMEN; } ///////////////////// static char MAX98090_I2C2_Stop_Condition(void) { int i; I2C2->CR2 |= I2C_CR2_STOP; i=0; while(I2C2->CR2 & I2C_CR2_STOP) { i++; if(i>1000000) { return 1; } } return 0; } ///////////////////// static char MAX98090_I2C2_Start_Condition(void) { int i; I2C2->CR2 |= I2C_CR2_START; i=0; while(I2C2->CR2 & I2C_CR2_START) { i++; if(i>1000000) return 1; } return 0; } ///////////////////////////пишем в регистр//////////////////////// char MAX98090_I2C2_Register_Write(unsigned char slave_address, unsigned char reg_address,unsigned char *p_data, char data_size, char stop_condition) { int i=0; int j; //сбрасываем все флаги I2C2->ICR=0xFFFFFFFF; //количество передаваемых байт I2C2->CR2 &=~ I2C_CR2_NBYTES; I2C2->CR2 |= ((data_size+1)<<16); //адрес периферии I2C2->CR2 &=~ I2C_CR2_SADD; I2C2->CR2 |=(slave_address<<0); //адрес регистра I2C2->TXDR=reg_address; //Запись I2C2->CR2 &=~ I2C_CR2_RD_WRN; // MAX98090_I2C2_Start_Condition(); while(!(I2C2->ISR & I2C_ISR_BUSY)) { i++; if(i>1000000) { //I2C2->CR1 &=~ I2C_CR1_START; MAX98090_I2C2_Stop_Condition(); return 1; } } for(j=0;jISR & I2C_ISR_TXE)) { i++; if(i>1000000) { MAX98090_I2C2_Stop_Condition(); return 2; } } I2C2->TXDR=p_data[j]; } while(!(I2C2->ISR & I2C_ISR_TXE)) { i++; if(i>1000000) { MAX98090_I2C2_Stop_Condition(); return 3; } } while(!(I2C2->ISR & I2C_ISR_TC)) { i++; if(i>1000000) { MAX98090_I2C2_Stop_Condition(); return 3; } } MAX98090_I2C2_Stop_Condition(); return 0; } //как работает I2C при чтении и записи написано тут http://ziblog.ru/2011/12/14/stm32l-interfeys-i2c.html ///////////////////////////читаем//////////////////////// char MAX98090_I2C2_Register_Read(unsigned char slave_address, unsigned char reg_address,unsigned char *p_data, char data_size) { int i=0; int j; //сбрасываем все флаги I2C2->ICR=0xFFFFFFFF; //количество передаваемых байт I2C2->CR2 &=~ I2C_CR2_NBYTES; I2C2->CR2 |= (1<<16); //адрес периферии I2C2->CR2 &=~ I2C_CR2_SADD; I2C2->CR2 |=(slave_address<<0); //адрес регистра I2C2->TXDR=reg_address; //Запись I2C2->CR2 &=~ I2C_CR2_RD_WRN; // MAX98090_I2C2_Start_Condition(); while(!(I2C2->ISR & I2C_ISR_BUSY)) { i++; if(i>1000000) { //I2C2->CR1 &=~ I2C_CR1_START; MAX98090_I2C2_Stop_Condition(); return 6; } } ////////////////////////////////////////// //чтение I2C2->CR2 |= I2C_CR2_RD_WRN; //количество передаваемых байт I2C2->CR2 &=~ I2C_CR2_NBYTES; I2C2->CR2 |= (data_size<<16); // MAX98090_I2C2_Start_Condition(); while(!(I2C2->ISR & I2C_ISR_BUSY)) { i++; if(i>1000000) { MAX98090_I2C2_Stop_Condition(); return 7; } } for(j=0;jISR & I2C_ISR_RXNE)) { i++; if(i>100000) { MAX98090_I2C2_Stop_Condition(); return 8; } } p_data[j]=I2C2->RXDR; } MAX98090_I2C2_Stop_Condition(); return 0; }