|
i2c總線c語言源程序 /*viicc.h*/ #pragma db cd small #include <intrins.h> #include <reg52.h> #define nop nop ( ); nop ( ); nop ( ); nop ( ) #define sda p1^7 #define scl p1^6 void sta( ); void cack( ); void stop( ); void mnack( ); void mack( ); void wrbyt(uchar shu); void wrnbyta(uchar slaw,uchar gg[],uchar n); void wrnbyt(uchar slaw,uchar ff[],uchar number); uchar rdbyt( ); void rdnbyt(uchar slar,uchar qq[],uchar number); 源程序由9個(gè)函數(shù)組成,程序清單如下: voidsta( )/*啟動i2c總線*/ { sda=1; scl=1; nop; sda=0; nop; scl=0; } void stop( )/*停止i2c總線 */ { sda=0; scl=1; nop; sda=1; nop; scl=0; } void mack( )/*發(fā)送應(yīng)答位*/ { sda=0; scl=1; nop; scl=0; sda=1; } void mnack( )/*發(fā)送非應(yīng)答位*/ { sda=1; scl=1; nop; scl=0; sda=0; } void cack( )/*應(yīng)答位檢查*/ { sda=1; scl=1; f0=0; if(sda==1) f0=1; scl=0; nop( ); } /*向虛擬i2c總線上發(fā)送1個(gè)數(shù)據(jù)字節(jié)*/ void wrbyt(uchar shu) { uchar i; for(i=0;i<8;i++){ if((shu&0x80)>0){ sda=1; scl=1; nop; scl=0; sda=0; } else{ sda=0; scl=1; nop; scl=0; } shu=shu<<1; } } /*從i2c總線上讀取1個(gè)數(shù)據(jù)字節(jié)*/ uchar rdbyt( ) { uchar nn=0xff,mm=0x80,uu=0x7f; uchar j; for(j=0;j<8;j++){ sda=1; scl=1; if(sda==0) nn=(nn&uu); else nn=(nn|mm);。 nn=crol(nn,1); scl=0; } return(nn); } void wrnbyta(uchar slaw,uchar gg[],uchar n) { do{ sta( ); wrbyt(slaw); cack( ); }while(f0==1); wrbyt(gg[n]); cack( ); } /*向虛擬i2c總線上發(fā)送n個(gè)字節(jié)的數(shù)據(jù)*/ void wrnbyt(uchar slaw,uchar ff[],uchar number) { uchar idata k; do{ sta( ); wrbyt(slaw); ?cack( ); }while(f0==1); for(k=0;k<number;k++){。 wrbyt(ff[k]); cack( ); while(f0==1) wrnbyta(slaw,ff,k); } stop( ); } /*從虛擬i2c總線上讀取n個(gè)字節(jié)的數(shù)據(jù)*/ void rdnbyt(uchar slar,uchar qq[],uchar number) { uchar idata data0,l; do{ sta( ); wrbyt(slar); cack( ); }while(f0==1);? for(l=0;l<number-1;l++){ data0=rdbyt( ); qq[l]=data0; mack( ); } data0=rdbyt( ); qq[l]=data0; mnack( ); stop( ); }
|