[C.C++] 12 .IIC协议(51单片机和C语言模拟I2C协议)

812 0
Honkers 2025-8-28 12:38:10 来自手机 | 显示全部楼层 |阅读模式

一:什么是i2c

1.1 协议概述

IIC全称Inter-Integrated Circuit (集成电路总线)
是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式.

1.2 特点

简单性和有效性。

由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大 传输速率支持40个组件

多主控(multimastering)

其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

1.3 构成

IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。

二 如何实现I2C

I2C包括起始信号,终止信号,和应答信号 。其中起始信号是不可缺的

2.1 起始信号


通过起始信号时序图,我们可以看出。在虚线框之内,SCL始终为高电平。
而SDA是高到低一个电平的跳转。SDA高电平时间持续大于4.7us,低电平持续时间大于4us。

  1. void IIC_start ()
  2. {
  3. scl = 1;//首先将scl拉高
  4. sda = 1;//拉高sda
  5. Delay5us();//SDA高电平时间持续大于4.7us
  6. sda = 0;//低电平持续时间大于4us。
  7. Delay5us();
  8. }
复制代码

2.2 终止信号


通过终止信号时序图,我们可以看出。在虚线框之内,SCL始终为高电平。
而SDA是低到高一个电平的跳转。SDA高电平时间持续大于4.7us,低电平持续时间大于4us。

  1. void IIC_stop ()
  2. {
  3. scl = 1;//首先将scl拉高
  4. sda = 0;//拉低sda
  5. Delay5us();//SDA高电平时间持续大于4.7us
  6. sda = 1;//低电平持续时间大于4us。
  7. Delay5us();
  8. }
复制代码

2.3 应答信号 (ack)


发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。
应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字
节;
应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。

  1. char IIC_ack()
  2. {
  3. char flag;//建立一个标志位,来获取sda
  4. sda = 1;释放数据线
  5. Delay5us();
  6. scl = 1;
  7. Delay5us();
  8. flag = sda;
  9. Delay5us();
  10. scl = 0;
  11. Delay5us();
  12. }
复制代码

2.4 发送字节

根据时序图可以看出,当scl为高电平时发送数据。sda发送的数据可以为0或1.但sda数据线高低电平变化不能发生在SCL高电平期间,否则设备将会认为终止信号或起始信号。

  1. void IIC_send_byte (char sendata)
  2. {
  3. int i;//没执行发送一位,发送八次为一个字节
  4. for(i=0;i<8;i++){
  5. scl = 0;
  6. _nop_();//调用一个空函数 时间为5微秒
  7. sda = sendata & 0x80;//获取最高位 1000 0000
  8. _nop_();
  9. scl = 1;
  10. _nop_();
  11. scl = 0;
  12. _nop_();
  13. sendata = sendata << 1;左移一位
  14. }
  15. }
复制代码

三 总结

经过三个函数的封装,就可以使用I2C协议。配合设备时序图,就可以完成IIC通信。下一节将IIC和oled配合使用.
oled部分:oled详细教程

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2026 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行