PiTeK (26.02.2008 16:04, просмотров: 3972)
Не подскажет ли кто по работе с ADS1110 через SMBus ? Добрый день!
пытаюсь оживить С8051F412 с ADS1110.
Пока пытаюсь отладить связь без прерываний.
Скорость шины задается таймером 2.
Но почему-то сигналы на шине жутко медленные (около секунды).
Кроме того, почему-то АЦП не отвечает ACK'ом на запись
статусного регистра...
Может, кто подскажет, если имел дело ?
Заранее спасибо
-----------------
void Timer_Init()
{
TCON = 0x50;
TMOD = 0x22;
CKCON = 0x3A;
TH1 = 0x96;
TMR2CN = 0x0C;
TMR2RLL = 0xFC;
TMR2RLH = 0xE9;
}
void Interrupts_Init()
{
IP = 0x10;
//EIE1 = 0x0C;
IT01CF = 0x32;
IE = 0x12;
}
void SMBus_Init()
{
SMB0CF = 0xC3;
}
uint GetADS1110()
{ uint res; uchar config; uint k;
SMBus_S =0;
SMB0CN=0x00; // clear SI
SMB0CN=0x20; // start
k=20000; while (((SMB0CN & 0x01)==0) && (k!=0)) { k--; PCA0CPH5=0;} // wait for SI=1
SMB0CN=0x00; // clear SI
SMB0DAT=0x90; // slave adress + write
k=20000; while (((SMB0CN & 0x01)==0) && (k!=0)) { k--; PCA0CPH5=0;} // wait for SI=1
if ((SMB0CN & 0x02)==0) { // check for NACK
SMB0CN=0x10; // stop
SMBus_S |=1;
return 0;
}
SMB0DAT=0x9C; // config
SMB0CN=0x00; // clear SI
k=20000; while (((SMB0CN & 0x01)==0) && (k!=0)) { k--; PCA0CPH5=0;} // wait for SI=1
if ((SMB0CN & 0x02)==0) { // check for NACK
SMB0CN=0x10; // stop
SMBus_S |=2;
return 0;
}
SMB0CN=0x00; // clear SI
SMB0CN=0x20; // restart in cycle
k=20000; while (((SMB0CN & 0x01)==0) && (k!=0)) { k--; PCA0CPH5=0;} // wait for SI=1
SMB0CN=0x00; // clear SI
SMB0DAT=0x91; // slave adress + read
k=20000; while (((SMB0CN & 0x01)==0) && (k!=0)) { k--; PCA0CPH5=0;} // wait for SI=1
if ((SMB0CN & 0x02)==0) { // check for NACK
SMB0CN=0x10; // stop
SMBus_S |=4;
return 0;
}
SMB0CN=0x00; // clear SI
k=20000; while (((SMB0CN & 0x01)==0) && (k!=0)) { k--; PCA0CPH5=0;} // wait for SI=1
if (SMB0CN & 0x08) { // if SMBus has got byte
SMB0CN |=0x02; // set ACK=1 and say it to Slave
}
else { SMB0CN=0x10; SMBus_S |=8; return 0; } // stop
res=SMB0DAT<<8; // save received byte
SMB0CN=0x00; // clear SI
k=20000; while (((SMB0CN & 0x01)==0) && (k!=0)) { k--; PCA0CPH5=0;} // wait for SI=1
if (SMB0CN & 0x08) { // if SMBus has got byte
SMB0CN |=0x02; // set ACK=1 and say it to Slave
}
else { SMB0CN=0x10; SMBus_S |=0x10; return 0; } // stop
res=res+SMB0DAT;
SMB0CN=0x00; // clear SI
k=20000; while (((SMB0CN & 0x01)==0) && (k!=0)) { k--; PCA0CPH5=0;} // wait for SI=1
if (SMB0CN & 0x08) { // if SMBus has got byte
SMB0CN |=0x02; // set ACK=1 and say it to Slave
}
else { SMB0CN=0x10; SMBus_S |=0x20; return 0; } // stop
config=SMB0DAT;
SMB0CN=0x00; // clear SI
SMB0CN=0x10; // stop
k=20000; while (((SMB0CN & 0x01)==0) && (k!=0)) { k--; PCA0CPH5=0;} // wait for SI=1
SMB0CN=0x00; // clear SI
dummy1= config;
return res;
}