Дополнение.
//Ошибка возникает в функции SoftI2CWriteByte400 в момент передачи //байта выбора ОЗУ:
unsigned char SoftI2CWriteByte400(unsigned char data)
{
unsigned char i,ack;
for(i=0;i‹8;i++)
{
SOFT_I2C_SCL_LOW;
Q_DEL_250ns;
if(data & 0x80)
SOFT_I2C_SDA_HIGH;
else
SOFT_I2C_SDA_LOW;
// Следующая задержка (H_DEL_250ns
по непонятной причине не //выполняется.
// смена данных и установление SCL (SOFT_I2C_SCL_HIGH
происходит //одновременно,
// что и фиксирует симулятор. Микросхема соответственно не
// выбирается - нет ack.
H_DEL_250ns;
SOFT_I2C_SCL_HIGH;
H_DEL_250ns;
while((SCLPIN & (1‹‹SCL))==0);
data=data‹‹1;
}
//The 9th clock (ACK Phase)
SOFT_I2C_SCL_LOW;
Q_DEL_250ns;
Q_DEL_250ns;
SOFT_I2C_SDA_HIGH;
H_DEL_250ns;
H_DEL_250ns;
SOFT_I2C_SCL_HIGH;
H_DEL_250ns;
H_DEL_250ns;
ack=!(SDAPIN & (1‹‹SDA));
SOFT_I2C_SCL_LOW;
H_DEL_250ns;
//H_DEL_250ns;
return ack;
}
//Приложил картинку с осциллографа - справа мелкий масштаб с //корректным запросом и начало запроса с ошибкой. Слева вверху //увеличил с ошибкой, внизу без ошибки.
//Ошибка 5 штук на 2000 операций.
//Загадка.
//Если использовать TWI такое не наблюдается, но есть другие проблемы // (в каких-то конкретных условиях происходит зависание в TWI, //прерывания от портов перестают обслуживаться на 40 мс).
//По этой причине от него отказываюсь от TWI.