为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形:

如下图所示的写操作的时序图:

读时序的理解同理。对于时序不理解的朋友请参考“I2C总线之(二)—时序”

完整的程序如下:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define write_ADD 0xa0
#define read_ADD 0xa1
uchar a;
sbit SDA=P2^0;
sbit SCL=P2^1;
void SomeNop();     //短延时
void init();    //初始化
void check_ACK(void);
void I2CStart(void);
void I2cStop(void);
void write_byte(uchar dat);//写字节
void delay(uint z);
uchar read_byte();     //读字节
void write(uchar addr,uchar dat);  //指定地址写
uchar read(uchar addr);       //指定地址读
bit flag;  //应答标志位
void main()
{init();write_add(5,0xaa); //向地址5写入0xaadelay(10);      //延时,否则被坑呀!!!P1=read_add(5);      //读取地址5的值while(1);    }//***************************************************************************
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(); //至多等待250个CPU时钟周期 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;//返回数据
}

以C语言的方式理解IIC总线相关推荐

  1. IIC总线随机读VHDL实现FIFO实现乒乓操作HM62256测试定制IP核

    博客简介 本博客是本人大二上学期数字系统实验硬件描述3的内容,在此记录以防丢失.目录如下: IIC串行总线时序分析 VHDL编程设计专门状态机与2片异步FIFO来实现乒乓操作 设计HM62256测试电 ...

  2. I2C总线之(三)---以C语言理解IIC

    为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形: 如下图所示的写操作的时序图: 读时序的理解同理.对于时序不理解的朋友请参考"I2C总线之(二)---时序" ...

  3. Linux底层IIC 总线的理解、调用函数以及常见面试问题

    对 IIC 总线的理解.调用函数以及常见面试问题 一.IIC 总线概述: IIC 即Inter-Integrated Circuit(集成电路总线) I2C总线是PHLIPS公司推出的一种串行总线, ...

  4. 对 IIC 总线的理解、调用函数以及常见面试问题

    一.IIC 总线概述: IIC 即Inter-Integrated Circuit(集成电路总线) I2C总线是PHLIPS公司推出的一种串行总线, I2C总线只有两根双向信号线.一根是数据线SDA, ...

  5. STM32使用IIC总线通讯协议在OLED屏幕上显示字符串、汉字、图像(硬件IIC)

    参考:基于STM32-Oled(IIC)的使用 作者:奋斗的小殷 发布时间: 2021-05-07 13:09:26 网址:https://blog.csdn.net/boybs/article/de ...

  6. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析

    关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸机开发 -- IIC总线 ,下面回顾下 IIC 基础概念 一.IIC 基础概念 IIC(Inter-Integrated Ci ...

  7. iic总线从机仲裁_IIC协议底层原理超详细解析!示波器,逻辑分析仪多图预警

    1. 协议基础 1.1.     协议简介 IIC-BUS(Inter-IntegratedCircuit Bus)最早是由PHilip半导体(现在被NXP收购)于1982年开发.主要是用来方便微控制 ...

  8. Exynos4412 IIC总线驱动开发(一)—— IIC 基础概念及驱动架构分析 (iic驱动框架,i2c驱动框架)...

    转载于 : http://blog.csdn.net/zqixiao_09/article/details/50917655 关于Exynos4412 IIC 裸机开发请看 :Exynos4412 裸 ...

  9. FPGA实现IIC协议(一)----初识IIC总线

    写在前面 IIC协议系列博文: FPGA实现IIC协议(一)----初识IIC总线 FPGA实现IIC协议(二)----IIC总线的FPGA实现(单次读写驱动) 1.什么是IIC协议 IIC通讯协议( ...

最新文章

  1. python输出print(x+y)_Python语句序列“x='car';y=2; print(x+y)”的输出结果是_学小易找答案...
  2. 自学python找到工作-学完python能找到工作么
  3. DCMTK:转换dicom文件编码
  4. YbOJ-网格序列【拉格朗日插值】
  5. 为什么说选择正确的编程语言很重要,以及如何正确的选择
  6. Python max 函数 - Python零基础入门教程
  7. Redis 中两种持久化机制详解
  8. [tf] Unknown: Failed to get convolution algorithm. This is probably because cuDNN failed to initial
  9. react实现浏览器自动刷新_react调用什么刷新页面
  10. 面试题大全-操作系统面试题
  11. 腾讯会议共享屏幕,ppt如何使用演讲者模式
  12. 4.计算机网络 -- 4.6 综合布线
  13. centos6.5安装自动化工具ansible和图形化工具tower
  14. 经典卷积网络--ResNet残差网络
  15. 如何获取国际短信验证码---创蓝253国际短信接口调用demo
  16. Day13_01_Java中的加解密之Base64编码
  17. 小张的个人信息管理系统
  18. 线性代数之——消元法
  19. 相机对焦、标定等近期学习
  20. Linux配置SSH服务器

热门文章

  1. 磁学基础 永久磁铁的磁力线分布
  2. imx6ull用C语言实现按键点灯代码
  3. chatgpt赋能Python-python_0j
  4. 乐播科技java怎样,乐播投屏用不了
  5. win10要用php几,win10有多大
  6. Android支付宝,微信,银联支付支付的集成
  7. 北京计算机软件王珊珊,王珊珊 中文主页 北京航空航天大学教师个人主页系统...
  8. java无限循环小数_java基础——java无限循环小数判定问题以及BigDecimal详解
  9. 模仿移动端淘宝购物车
  10. 离散制造业该如何实现工业信息化?