IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> IIC/I2C总线的基本操作学习笔记------51单片机基础篇 -> 正文阅读

[嵌入式]IIC/I2C总线的基本操作学习笔记------51单片机基础篇

I2C总线(Inter IC BUS)是由Philips公司开发的一种通用数据总线,通用这个词画起来要考,说白了就是为了避免你每次都要重新学习协议,所以有些大公司制定的大家认可的协议,也可以是说是使用规范,下面进入正题
IIC总线,字如其名,下面放图方便理解
在这里插入图片描述
可以看出,IIC就是负责主机和从机之间通讯的时钟线和数据线,可以理解为,从主机伸出两条线SDA,SCL,然后下面可以挂载一个或者多个主机。
那么具体要怎么用呢,其实也就是初始化,写函数。不过比较复杂
/下面是IIC时序部分******/
IIC时序其实也就是我们之前说的制定的规则,不要想为什么,记和学就行
首先要了解六个初始化规则,上图
在这里插入图片描述
比如说起始条件,你想要开始,就要先让SCL处于高电平,然后在SCL高电平器件,让SDA完成高电平切换到低电平这个动作。完成这一步,你就相当于做了一个“开始”的信号,终止条件同上,就是让SCL处于高电平,然后SDA完成电平从地到高,就是做了终止信号。
继续
在这里插入图片描述
就是说发送字节这个动作,你要在SCL低电平的时候,把你要发送的数据放到SDA上面,比如说,你要发送1,你就把SDA上拉,你要发送0,就让SDA下拉,然后保持不能动,从机就会在SCL高电平的时候读取你要发送的0或者1,这样就完成了发送一个位数据,而要发送一个字节,就只要循环8次即可。
PASS
在这里插入图片描述
接收一个字节,同上,就不讲了
PASS
在这里插入图片描述
记住,0表示应答,1表示非应答即可

好了,一共6个动作已经了解了,接下来,把他们封装好,
IIC.c

#include <REGX52.H>

sbit I2C_SCL=P2^1;
sbit I2C_SDA=P2^0;

/**

  • @brief I2C开始
  • @param 无
  • @retval 无
    */
    void I2C_Start(void)
    {
    I2C_SDA=1;
    I2C_SCL=1;
    I2C_SDA=0;
    I2C_SCL=0;
    }

/**

  • @brief I2C停止
  • @param 无
  • @retval 无
    */
    void I2C_Stop(void)
    {
    I2C_SDA=0;
    I2C_SCL=1;
    I2C_SDA=1;
    }

/**

  • @brief I2C发送一个字节
  • @param Byte 要发送的字节
  • @retval 无
    */
    void I2C_SendByte(unsigned char Byte)
    {
    unsigned char i;
    for(i=0;i<8;i++)
    {
    I2C_SDA=Byte&(0x80>>i);
    I2C_SCL=1;
    I2C_SCL=0;
    }
    }

/**

  • @brief I2C接收一个字节
  • @param 无
  • @retval 接收到的一个字节数据
    */
    unsigned char I2C_ReceiveByte(void)
    {
    unsigned char i,Byte=0x00;
    I2C_SDA=1;
    for(i=0;i<8;i++)
    {
    I2C_SCL=1;
    if(I2C_SDA){Byte|=(0x80>>i);}
    I2C_SCL=0;
    }
    return Byte;
    }

/**

  • @brief I2C发送应答
  • @param AckBit 应答位,0为应答,1为非应答
  • @retval 无
    */
    void I2C_SendAck(unsigned char AckBit)
    {
    I2C_SDA=AckBit;
    I2C_SCL=1;
    I2C_SCL=0;
    }

/**

  • @brief I2C接收应答位
  • @param 无
  • @retval 接收到的应答位,0为应答,1为非应答
    */
    unsigned char I2C_ReceiveAck(void)
    {
    unsigned char AckBit;
    I2C_SDA=1;
    I2C_SCL=1;
    AckBit=I2C_SDA;
    I2C_SCL=0;
    return AckBit;
    }

仔细观察可以看出来每个子函数都是对应上面讲的一个个小动作的,

接下来拼接小动作施展连招
/下面是拼接部分*******/
发送一帧数据
在这里插入图片描述
看着上面的格子,S,第一步是起始信号,也就是上面介绍的第一个,开始动作,第二个,绿色的,发送,不过发送的不是数据,是地址,也就是从机地址,因为挂载的可能不是只有一台主机而已,而是多台,那么怎么判断发送给谁呢,这个时候发送一个地址,每个从机都会接收地址,然后对比是不是自己的地址,如果不是,那就不应答,如果是自己,那么就发送应答信号,也就是黑色的RA:0,然后主机就发送数据,从机应答,主机发送,从机应答,反复循环,最后结束了,主机发送终止信号,end结束
PSAA
继续
在这里插入图片描述
接收一帧数据,同样的,主机发出开始信号,然后发出地址,注意后面的+R,R是代表要接收,+W代表要发送,好的继续,主机发送了地址和要接收的信号,那么对应的从机对比发送是自己后,发出应答信号,并且发送一个数据,然后从机应答,从机发送,主机应答,以次反复,最后,主机的应答信号带1,代表非应答,主机发出终止信号,结束

注意:
起始和终止信号都是由主机发出,

在这里插入图片描述
这里要注意的是,发送完还要接收的话,不要发送终止信号,但是接收的时候要重新发送开始信号,最后主机发送带1的非应答,再发送终止信号。
PSAA
还有下面的直接写,随机读,就不介绍了,
在这里插入图片描述
学习笔记结束

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-30 15:46:40  更:2021-11-30 15:48:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 10:41:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码