本人初學C,曾為這個問題大傷腦筋^_^,就是一個單片機系統有兩個以上的相同地址的I2C設備,無法用兩個同一對SDA/SCL引腳,
#include "stc89c51.h"
#include "iic.h"
sbit scl0=P3^5;
sbit sda0 = P3^4;
sbit scl1= P3^3;
sbit sda1 = P3^2;
//這裡只寫了兩個I2C設備,如果需要可以再加上 sbit scl2=xx; sbit sda2=xx; 實際上多個設備的scl腳可以共用
unsigned char iic_delay_time = 8;
void scl(device,value);
void sda(device,value);
bit sdasense(char device);
// delay
void iic_delay(unsigned char m)
{
unsigned char n;
for(n=0;n<m;n++);
}
//
void scl(device,value)
{
if (device==0) //設備1
scl1=value;
if (device==1) //設備2
scl2=value;
}
void sda(device,value)
{
if (device==0) //設備1
sda1=value;
if (device==1) //設備2
sda2=value;
}
bit sdasense(char device)
{
switch(device)
{
case 1: return sda1;
break;
case 2: return sda2;
break;
}
}
//啟動I2C匯流排的函數,當scl為高電平時使sda產生一個負跳變
void iic_start(device)
{
sda(device,1);
scl(device,1);
iic_delay(iic_delay_time);
sda(device,0);
iic_delay(iic_delay_time);
scl(device,0);
iic_delay(iic_delay_time/2);
}
//終止I2C匯流排,當scl為高電平時使sda產生一個正跳變
void iic_stop(device)
{
scl(device,0);
sda(device,0);
scl(device,1);
iic_delay(iic_delay_time);
sda(device,1);
iic_delay(iic_delay_time);
}
//發送應答信號
void iic_ack(device) {
sda(device,0);
scl(device,1);
scl(device,0);
sda(device,1);
}
//發送無應答信號
void iic_noack(device)
{
sda(device,1);
scl(device,1);
scl(device,0);
}
//檢測應答信號
bit iic_testack(device)
{
bit errorbit; //真確應答,返回0
sda(device,1);
iic_delay(iic_delay_time);
scl(device,1);
iic_delay(iic_delay_time);
errorbit=sdasense(device);
scl(device,0);
iic_delay(iic_delay_time);
return(errorbit);
}
//發送一個位元組
void iic_write8bit(device,unsigned char input)
{
unsigned char temp;
for(temp=0;temp<8;temp++)
{
if((input<<temp)&0x80)
sda(device,1);
else
sda(device,0);
scl(device,1);
iic_delay(iic_delay_time);
scl(device,0);
}
}
//讀一個位元組
unsigned char iic_read8bit(device)
{
unsigned char temp,rbyte=0;
for(temp=0;temp<8;temp++)
{
scl(device,1);
iic_delay(iic_delay_time);
if(sdasense(device))
rbyte=(rbyte<<1)+1;
else
rbyte=rbyte<<1;
scl(device,0);
}
return(rbyte);
}
[admin via 研發互助社區 ] 連接多個相同地址I2C設備的C51程序已經有2931次圍觀
http://cocdig.com/docs/show-post-42236.html