Как оно у тебя работает? Попробовал так же - нет, выдает "busy". Т.е. вот так - не работает:
static uint8_t i2c_startr(uint8_t addr, uint16_t nbytes){
I2C1->CR2 = I2C_CR2_START | (nbytes<<16) | addr | I2C_CR2_AUTOEND | I2C_CR2_RD_WRN;
}
А вот так - работает:
static uint8_t i2c_startr(uint8_t addr, uint16_t nbytes){
I2C1->CR2 = (nbytes<<16) | addr | I2C_CR2_RD_WRN;
I2C1->CR2 |= I2C_CR2_START;
I2C1->CR2 |= I2C_CR2_AUTOEND;
return 1;
}
Т.е. все-таки "за один присест" нельзя написать и START, и адрес...