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 还有下面的直接写,随机读,就不介绍了, 学习笔记结束
|