Не получается стабильно читать из eeprom по i2c.
Код: Выделить всё
void I2C_EE_ReadBytes(uint8_t addr, uint8_t* data, uint8_t size)
{
_data = data;
bytes = 0;
I2C1->CR2 &= ~(I2C_CR2_ADD10 | I2C_CR2_RD_WRN);
I2C1->CR2 |= (1 << I2C_CR2_NBYTES_Pos) | addr | I2C_CR2_START;
while((I2C1->ISR & I2C_ISR_TXIS) != I2C_ISR_TXIS);
I2C1->TXDR = 0x00;
while((I2C1->ISR & I2C_ISR_TC) != I2C_ISR_TC);
I2C1->CR2 |= I2C_CR2_AUTOEND | (size << I2C_CR2_NBYTES_Pos) | I2C_CR2_RD_WRN
| I2C_CR2_START | addr;
for(bytes = 0; bytes < size; ++bytes)
{
while((I2C1->ISR & I2C_ISR_RXNE) != I2C_ISR_RXNE);
_data[bytes] = I2C1->RXDR;
}
}Не выставляется флаг I2C_ISR_TXIS и программа зависает...
Если закомментировать кусок кода
Код: Выделить всё
I2C1->CR2 &= ~(I2C_CR2_ADD10 | I2C_CR2_RD_WRN);
I2C1->CR2 |= (1 << I2C_CR2_NBYTES_Pos) | addr | I2C_CR2_START;
while((I2C1->ISR & I2C_ISR_TXIS) != I2C_ISR_TXIS);
I2C1->TXDR = 0x00;
while((I2C1->ISR & I2C_ISR_TC) != I2C_ISR_TC);то тогда все читается, но так нельзя выставить позицию с которой надо читать.
Где может быть затык?
Спасибо.