|
signed char i2c_ReadAcknowledge(void)
{
unsigned char ack;
SCL = 0;
SCL_DIR = I2C_OUTPUT;
SDA=1;
SDA_DIR = I2C_INPUT;/* disable data line - listen for ack */
DelayUs(I2C_TM_SCL_TO_DATA);/* SCL low to data out valid */
SCL_DIR = I2C_INPUT;/* float clock high */
DelayUs(I2C_TM_DATA_SU);
ack = SDA;/* read the acknowledge */
/* wait for slave to release clock line after processing byte */if(i2c_WaitForSCL())
return I2C_ERROR;
return ack;
}
только непонятно, зачем второй SCL_DIR = I2C_INPUT; ?
посмотрел это место в своем исходнике:
/* теперь ждем ACK */
PIN_DIRECT(I2C_SDA, I);
I2C_DELAY5();
PIN_ON(I2C_SCK);I2C_DELAY5(); /* ждем установки ACK */
if (PIN_SIGNAL(I2C_SDA))
{
/* если нет ACK от слейва - это плохо! */
PIN_OFF(I2C_SCK);
PIN_DIRECT(I2C_SDA, O);
I2c_Stop();
return(FALSE);
}
PS. Весь исходник не имею права показать.
E-mail: info@telesys.ru