evilbald (20.11.2015 19:24, просмотров: 1063)
XC167 I2C не могу считать байт из памяти M24128-BWMN6P, подскажите что не так? Сделал кусок проекта DaVe-ом, соответственно для чтения делаю следующее: unsigned short rd_i2c_eeprom(unsigned char addr_low, unsigned char addr_high)
{
int d;
unsigned short val;
I2C_vGenStartCond();
I2C_vWriteData(0xA0);//запись
ReadACK();
I2C_vWriteData(addr_high);//адрес
ReadACK();
I2C_vWriteData(addr_low);//адрес
ReadACK();
I2C_vGenStartCond();
I2C_vWriteData(0xA1);//чтение
ReadACK();
DP90 = 0;
I2C_vDisableACK();
val = I2C_uwReadData();
I2C_vGenStopCond();
DP90 = 1;
return val;
}
Но по осциллограмме я вижу, что после отсылки первого сообщения формируется сразу же стоп, не пойму - это что ли бит ACK не приходит или что-то еще? Его пытаюсь считать так:
void ReadACK(void)
{
char E_ACK;
// прием от eeprom ACK
//SDA = 0;
SDA = 0; DP90 = 0;
_nop_( ); SCL = 1; _nop_( ); _nop_( ); _nop_( );
E_ACK = SDA;
//while(SDA) _srvwdt_( );
SCL = 0; _nop_( );
DP90 = 1;
}
Я думал, что Keil берет на себя всю лабуду по формированию тактов, но вот с этим ACK-ом ничего не могу понять.
Если кто знает в чем ошибка - подскажите пожалуйста!