Цитата(DimaM @ May 29 2007, 11:59)

aduc848 не работал, но тем не менее кажется ошибка в его программе
функции типа i2c_rx(0); сам писал?
я когда то много времени потратил на i2c, пока application note не взял и не написал прерывание для i2c как в примере.
Эти функции опробованы на часах и на двух рахличных датчиках:
void i2c_dly (void)
{
}
void i2c_start (void)
{
MDE=1; MDO=1;//bSDA = 1;
i2c_dly ();
MCO=1;//bSCL = 1;
i2c_dly ();
MDE=1; MDO=0;//bSDA = 0;
i2c_dly ();
MCO=0;//bSCL = 0;
i2c_dly ();
}
void i2c_stop (void)
{
MDE=1; MDO=0;//bSDA = 0;
i2c_dly ();
MCO=1;//bSCL = 1;
i2c_dly ();
MDE=1; MDO=1;//bSDA = 1;
i2c_dly ();
}
char i2c_rx(char ack)
{
char x, d=0;
MDE=1; MDO=1;//bSDA = 1;
for(x=0; x<8; x++)
{
d <<= 1;
do
{
MCO=1;//bSCL = 1;
i2c_dly ();
}
while(MCO==0); //SCL_IN==0
i2c_dly();
MDE=0;
if(MDI) d |= 1; //SDA_IN
MCO=0;//bSCL = 0;
}
if(ack){MDE=1; MDO=0;}// bSDA = 0;
else {MDE=1; MDO=1;}//bSDA = 1;
MCO=1;//bSCL = 1;
i2c_dly();
MCO=0;//bSCL = 0;
MDE=1; MDO=1;//bSDA = 1;
return d;
}
bit i2c_tx(unsigned char d)
{
char x;
static bit b;
for(x=8; x; x--)
{
if(d&0x80) {MDE=1; MDO=1;}//bSDA = 1;
else {MDE=1; MDO=0;}//bSDA = 0;
MCO=1;//bSCL = 1;
d <<= 1;
i2c_dly ();
MCO=0;//bSCL = 0;
i2c_dly ();
}
MDE=1; MDO=1;//bSDA = 1;
MCO=1;//bSCL = 1;
i2c_dly();
MDE=0;
b = MDI;//b = bSDA; //SDA_IN
MCO=0;//bSCL = 0;
return b;
}