witam, robię sobie układzik komunikujący się z kompem za pomocą i2c, napisałem cos, co wg mnie powinno działac, i okazuje sie ze jednak nie działa. piszę w Borland C++ Builderze, a układ docelowy to Atmega8. układ "slave" działa poprawnie z innym układem, dane są przesyłane poprawnie i ogolnie wszystko ok. funkcje uSDA, uSCL, cSDA. cSCL działają poprawnie (testowane diodkami), wiec wysjcia są aktywne, problem w tym ze gdy proboje wysłac ządane dane, to slave na nie nie reaguje, tzn nie reaguje za polecenie:
TWI_start(); TWI_write(adres); TWI_write(data0); TWI_write(data1); TWI_stop();
przy tak zdeklarowanych funkcjach: (podejrzewam błędy w sekwencjach, ale naprawde nie potrafie ich znalezc...)
/*założenia data0-SDA out strobe-SCL out select-SDA in paperout-SCL in
*/BYTE inportb(UINT portid) { unsigned char value; __asm mov edx,portid __asm in al,dx __asm mov value,al return value; }
void outportb(UINT portid,BYTE value) { __asm mov edx,portid __asm mov al,value __asm out dx,al }
void uSDA(char data) { if(data) outportb(0x378,0x01); else outportb(0x378,0x00); Sleep(1); }
void uSCL(char data) { if(data) outportb(0x37A,0x00); else outportb(0x37A,0x01); Sleep(1); }
bool cSDA() { bool out; out=(inportb(portid+0x01) & 0x10); return out; }
bool cSCL() { bool out; out=(inportb(portid+0x01) & 0x20); return out; }
void TWI_start() //jest ok { uSDA(1); //ustaw SDA uSCL(1); //ustaw SCL uSDA(0); //zeruj SDA }
void TWI_stop() { uSDA(0); //zeruj SDA uSCL(1); //ustaw SCL uSDA(1); //ustaw SDA }
char TWI_write(char data) { char ack=0;
for(int i=0;i<8;i++) { uSCL(0); //zeruj SCL uSDA(data<<7-i&&0x80); //ustaw bit SDA uSCL(1);//ustaw SCL while(!cSCL()); }
uSCL(0); //zeruj SCL uSDA(1); //ustaw bit SDA uSCL(1); //ustaw SCL if(cSDA()) ack=1; //jesli SDA=1, ack =1 uSCL(0); //zeruj SCL uSDA(1); //ustaw bit SDA
return ack; }
char TWI_read(UINT portid,char ack) { char data; uSCL(1); //ustaw SCL while(!cSCL()); //czekaj aż SCL=1 for(int i=0;i<8;i++) { uSCL(1); //ustaw SCL if(cSDA()) data |= (1 << i); uSCL(0); //zeruj SCL } uSDA(ack); //ustaw bit SDA uSDA(0); //zeruj bit SDA uSCL(1); //ustaw SCL uSCL(0); //zeruj SCL return data; }