|
{ sda=1; delay(); scl=1; delay(); sda=0; delay(); } 應(yīng)答信號(hào):每傳送一個(gè)字節(jié)數(shù)據(jù),都要有接收設(shè)備產(chǎn)生應(yīng)答信號(hào)。在SCL為高電平期間,接收設(shè)備將SDA拉為低電平表示數(shù)據(jù)傳輸正確。 { uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay(); } 停止信號(hào):在全部數(shù)據(jù)發(fā)送完畢后,主機(jī)發(fā)送停止信號(hào)。即在SCL為高電平期間,SDA上產(chǎn)生一個(gè)上升沿信號(hào)。 停止信號(hào): void stop() { sda=0; delay(); scl=1; delay(); sda=1; delay(); } IIC總線初始化 void init() { sda=1; delay(); scl=1; delay(); } 根據(jù)IIC總線寫數(shù)據(jù)函數(shù): void write_byte(uchar date) //寫數(shù)據(jù)函數(shù) { uchar i,temp; temp=date; for(i=0;i<8;i++) { temp=temp<<1;//將數(shù)據(jù)左移一位,最高位移至CY scl=0; delay(); sda=CY; delay(); scl=1; delay(); } scl=0; delay(); sda=1; delay(); } 根據(jù)IIC讀數(shù)據(jù)函數(shù) uchar read_byte() { uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } return k; } 在某寄存器上寫數(shù)據(jù) void write_add(uchar address,uchar date) //在某地址上寫數(shù)據(jù) { start(); write_byte(0xa0); //發(fā)送器件地址,最低位為0,表示主機(jī)發(fā)送 respons(); //應(yīng)答 write_byte(address);//發(fā)送某器件存儲(chǔ)單元地址 respons(); //應(yīng)答 write_byte(date); //寫數(shù)據(jù) respons(); //應(yīng)答 stop(); //停止 } 其中a0表示主機(jī)固定地址。 在模寄存器上讀數(shù)據(jù) uchar read_add(uchar address) //在某地址上讀數(shù)據(jù) { uchar date; start(); write_byte(0xa0); //發(fā)送器件地址,最低位為0,表示主機(jī)發(fā)送 respons(); //應(yīng)答 write_byte(address);//發(fā)送某器件存儲(chǔ)單元地址,表示要讀此位置的數(shù)據(jù) respons(); //應(yīng)答 start(); write_byte(0xa1);//發(fā)送器件地址,最低位為1,表示主機(jī)接受數(shù)據(jù) respons(); date=read_byte(); stop(); return date; } |
|
|