Цитата(MiklPolikov @ Mar 17 2018, 14:58)
А если пытаться передавать повторный старт из STM32F103 , то не работает он , а именно при последующей передаче адреса не выставляет бит "адрес передан". Да и в документации на МК написано, что "старт нужно передавать при сброшенном бите BUSY" , а когда обмен идёт, этот бит уже стоит.
В 103 довольно капризный I2C, требующий точного соблюдения всей циклограммы, расписанной в даташите событийно (EV5-EV9), и правильной очистки статусных бит, как написано. Вот псевдо-код (псевдо - потому, что на бесконечных циклах ожидания), работающий на 103 в режиме мастера, с repeated start, без прерываний (чтение из регистра устройства с I2C адресом 0):
Код
void CI2C1::ReadByte(u8 nOffset, u8* pData)
{
u8 data;
u16 sr1, sr2;
I2C1->CR1 |= I2C_CR1_START;
while (!(I2C1->SR1 & I2C_SR1_SB));
I2C1->DR = 0x00;
while (!(I2C1->SR1 & I2C_SR1_ADDR));
sr1 = I2C1->SR1;
sr1 = sr1; // prevent warning
sr2 = I2C1->SR2;
sr2 = sr2; // prevent warning
I2C1->DR = nOffset;
while (!(I2C1->SR1 & I2C_SR1_BTF));
I2C1->CR1 |= I2C_CR1_START; // repeated start
while (!(I2C1->SR1 & I2C_SR1_SB));
I2C1->DR = 0x01;
while (!(I2C1->SR1 & I2C_SR1_ADDR));
sr1 = I2C1->SR1;
sr2 = I2C1->SR2;
while (!(I2C1->SR1 & I2C_SR1_RXNE));
data = I2C1->DR;
I2C1->CR1 |= I2C_CR1_STOP;
*pData = data;
}