koyodza (02.03.2008 22:25, просмотров: 81) ответил PiTeK на А можно поделиться примером кода ?
С АВР на 51 переделаем, не проблема, тем более если он на С...
Просто такое впечатление, что я неправильно понимаю логику его работы...
Заранее благодарен!
работал с 1110 на 52 без аппаратного I2C. Впечатления весьма положительные
sbit SCL = P2^6;
sbit SDA = P2^7;
/* ********************************************** */
/* ** I2C *********************************** */
/* ********************************************** */
bit I2Cbit(bit x)
{
SDA = x;
SDA = x;
SCL = 1;
SCL = 1;
x = SDA;
SCL = 0;
return x;
}
void I2Cstart(void)
{
SDA = 0;
SDA = 0;
SCL = 0;
}
void I2Cstop(void)
{
SDA = 0;
SCL = 1;
SDA = 1;
}
bit I2Ctx(BYTE x)
{
BYTE i = 8;
SCL = 0;
do
{
I2Cbit(x & 0x80);
x <<= 1;
}
while (--i);
return I2Cbit(1); /* ACK */
}
BYTE I2Crx(bit ack)
{
BYTE i = 8, x = 0;
SCL = 0;
do
{
x <<= 1;
x |= 1 & I2Cbit(1);
}
while (--i);
I2Cbit(ack);
return x;
}
/* ********************************************** */
/* ** ADC *********************************** */
/* ********************************************** */
bit ADCread(BYTE* stat, int* code16)
{
I2Cstart();
if (I2Ctx(ADC_ADR + 1))//0x91))
{
I2Cstop();
return 1;
}
*(((BYTE*)code16)) = I2Crx(0);
*(((BYTE*)code16) + 1) = I2Crx(0);
*stat = I2Crx(0);
I2Cstop();
return 0;
}
bit ADCwrite(BYTE x)
{
I2Cstart();
if (I2Ctx(ADC_ADR))//0x90))
{
I2Cstop();
return 1;
}
I2Ctx(x);
I2Cstop();
return 0;
}
bit ADCget(int* pCode, bit gain)
{
BYTE stat = 0x9C;
if (gain)
stat = 0x9F;
if (ADCwrite(stat))
return 1;
do
{
RxDecode();
if (ADCread(&stat, pCode))
return 1;
}
while (stat & 0x80);
return 0;
}
bit ADCdetect(void)
{
ADC_ADR = 0x90;
do
{
ADCwrite(0x9C);
if (!ADCwrite(0x9C))
return 0;
ADC_ADR += 2;
}
while (ADC_ADR < 0x9F);
return 1;
}