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
还有下面的直接写,随机读,就不介绍了,
在这里插入图片描述
学习笔记结束

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

泰7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值