1. Посылаю старт-условие и управляющий байт (0b10100000);
2. Посылаю 2 байта адреса (нули);
3. Посылаю байт данных (например, 0xAA);
4. Посылаю стоп-условие.
Прием байтов (пп. 1-3) слейв подтверждает, затем контроллер генерит стоп-условие, однако память почему-то в это время держит SDA в нуле, поэтому стоп условия не получает. Зациклил для наблюдений такой кусочек кода:
CODE
while(1){
t = i2c_WriteTo(I2C_DEVICE_ADDRESS);
t = i2c_PutByte (0);
t = i2c_PutByte (0);
t = i2c_PutByte (0xAA);
i2c_Stop();
__delay_ms(10);
}
t = i2c_WriteTo(I2C_DEVICE_ADDRESS);
t = i2c_PutByte (0);
t = i2c_PutByte (0);
t = i2c_PutByte (0xAA);
i2c_Stop();
__delay_ms(10);
}
Симуляция в протеусе показывает, что слейв не отпускает SDA:
В реальном железе наблюдаю настоящим осциллографом то же самое. в линиях включены резисторы по 150 Ом, со стороны контроллера "стоповый" импульс примерно 2 В, со стороны памяти совсем маленький...
В даташите процесс записи нарисован так:
Вроде все правильно делаю, а работает неправильно.
Прилагаю модель для протеуса и прошивку, хелп!