ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
27 ноября
113956
PiTeK (26.02.2008 16:04, просмотров: 3975)
Не подскажет ли кто по работе с 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; }