I2C总线时序模拟(一)-加深理解总线协议
#include<reg52.h>
#define uchar unsigned char
sbit sda=P2^0;
sbit scl=P2^1;//用单片机的两个I/O口模拟I2C接口
uchar a;
***************************************************************************
void delay()//简单延时函数
{ ;; }
***************************************************************************
void start() //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号
{
sda=1; //释放SDA总线
delay();
scl=1;
delay();
sda=0;
delay();
}
***************************************************************************
void stop() //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}***************************************************************************
void respons() //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答
{
uchar i;
scl=1;
delay();
while((sda==1)&&(i<250))i++;
scl=0;
delay();
}
***************************************************************************
void init()//总线初始化 将总线都拉高一释放总线 发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号
{
sda=1;
delay();
scl=1;
delay();
}
***************************************************************************
void write_byte(uchar date) //写一个字节
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿
delay();
sda=CY;
delay();
scl=1;//拉高SCL,此时SDA上的数据稳定
delay();
}
scl=0;//拉低SCL,为下次数据传输做好准备
delay();
sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号
delay();
}
***************************************************************************
uchar read_byte()//读一个字节
{
uchar i,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦
delay();
k=(k<<1)|sda;
scl=0;//拉低SCL,使发送端可以把数据放在SDA上
delay();
}
return k;
}
***************************************************************************
void write_add(uchar address,uchar date)//任意地址写一个字节
{
start();//启动
write_byte(0xa0);//发送从设备地址
respons();//等待从设备的响应
write_byte(address);//发出芯片内地址
respons();//等待从设备的响应
write_byte(date);//发送数据
respons();//等待从设备的响应
stop();//停止
}
***************************************************************************
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;//返回数据
}
分享到:
相关推荐
本文档详细描述了I2C总线的工作时序,主要包括启动信号,数据传输,停止信号以及总线仲裁和总线封锁的时序说明
I2C总线时序分析及其模拟,已论述的方式讲述了i2c模拟时序,和i2c特点
详细的I2C总线时序介绍,包括起始、停止、应答信号的时序。
:简要介绍了I。C 总线及其外围器件的结构,分析了I。C 总线的时序,并利用微控制器 的i/o 口线和操作指令对I。C 总线的时序进行了模拟。 关键词:虚拟技术;I。C 总线;微控制器
描述了I2C 总线的时序和开发过程中的一些注意事项
不错的资料快点下载摘要:以I2C总线协议为根据。用有限状态机(FSM:Finite State Machine)设计了基于FPGA的I2C初始化程序模块。主要内容包括简述I2C总线的特点;介绍用FPGA中FSM开发I2C总线模块时的设计思想和实现...
详细描述了I2C总线的结构、工作时序,还给出了汇编语言的编程实例。
I2C总线时序详解.doc
对于硬件设计和驱动程序的I2C参考资料,精心总结
模拟i2c总线时序 数据可输入输出E2PROM--24lc64
(转发) 对I2C通讯模式的简介,包括启动信号和停止信号/数据位传送/应答时序/插入等待时间/时钟同步/总线仲裁等。
i2c 总线的时序和读写 i2c 总线的时序和读写 i2c 总线的时序和读写 i2c 总线的时序和读写 i2c 总线的时序和读写
用avr单片机写的IIC驱动程序,用io口模拟iic总线的时序,经验证可以以使用,以400k的速度非常稳定
单片机模拟I2C总线通信,虚拟i2c的程序
详细介绍I2C总线协议,介绍其器件内部结构,时序讲解,以及一些个人理解。
I2C 时序详解 ,快速了解I2C的传输机制
I2CV2.1版本,里面描述了I2C的结构以及时序要求,如果需要了解I2C协议,请查看博客文章, I2CV2.1版本,里面描述了I2C的结构以及时序要求,如果需要了解I2C协议,请查看博客文章。。