I2C串行总线组成及其工作原理
();
}
void respons()//应答信号
{
uchar i;
scl = 1;
delay();
while((sda ==1)&&(i<250))//等到第九个时钟周期的时候,还没有变为0,
//那么scl将自动的变为0,表示收到信号
{
i++;
}
scl = 0;
}
void init()
{
sda = 1;
scl = 1;//把线全部释放
}
void write_byte(uchar date)
{
uchar i,temp;
temp = date;
scl = 0;
delay();
for(i = 0;i<8;i++)//写8次
{
temp = temp<<1;//表示将temp左移1位,将最高位移入psw寄存器中的cy位,
//然后将最高位赋值给sda,送走数据
scl = 1;//数据稳定了
delay();
sda = CY;
delay();
scl = 0;//读走数据
delay();
}
sda = 1;//注意养成释放总线的习惯
delay();
}
uchar read_byte()
{
uchar i,j,k;
scl = 0;
delay();
sda = 1;//释放数据总线
delay();
for(i=0;i<8;i++)
{
scl = 1;
delay();
j = sda ;//读取数据
k =(k<<1)"j;
scl = 0;
delay();
}
return k;
}
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);//表示写入器件的地址
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void write_add(uchar address,uchar date)
{
init();//初始化信号总线和地址总线
start();//启动信号
write_byte(0xa0);//表示写入器件的地址
respons();
write_byte(address);//表示往这个器件内部的第三个地址处写入地址
respons();
write_byte(date);//表示器件内部的数据
respons();
stop();
}
void delay1(uint z)
{
uint x,y;
for(x= z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
init();
write_add(23,125);
delay1(100);
P1=read_add(23);
while(1);
}
- 基于I2C总线图像传感器配置的FPGA实现(06-24)
- 模拟I2C总线多主节点通信原理简介(09-02)
- 通过SerDes远端I2C接口访问16位I2C外设寄存器地址(03-05)
- 基于Linux操作系统的ARM/DSP多机I2C通信设计方案(02-20)
- 基于pic单片机的模拟I2C通信(05-28)
- 模拟I2C总线多主节点通信原理及实现方法(12-14)