STM32的IIC通信的部分理解

IIC,全名两线式串行总线,这两条线一个是数据线SDA,一个是时钟线SCL。线总是要连接东西,连接什么呢?连接CPU与被控IC,或者IC与IC。IC比如说EEPROM(24C02)存储器。同时是半双工通信,即一次总线上只能由一方传输数据。

STM32的IIC通信的部分理解_第1张图片
这个图就是说这两条线一般初始情况下都是置高电平。
另外,

IIC协议总共有6个特点:
1空闲状态
2开始信号
3停止信号
4应答信号
5数据的有效性
6数据传输

也就说,在IIC通信的代码中必须要涉及到这6个部分。下面分别来说。
1空闲状态:两条线处于高电平就是空闲状态。
2开始信号:SCL 为高电平时,SDA 由高电平向低电平跳变,开始传送数据。
3结束信号:SCL 为高电平时,SDA 由低电平向高电平跳变,结束传送数据。//这个都很好理解,不懂的可以私信。
注:起始信号和终止信号都是通过边沿触发而非电平触发
边沿触发就是电平在跳变的过程中进行触发。而电平触发是高电平触发或者低电平触发。

4应答信号:(这个相对就不太好理解了)
简单的说,就是你发送器发送一个字节过来,一个字节有8位,一个位一个时钟脉冲,那么就在第9个时钟脉冲高电平期间,释放数据线为低电平,算作为由接收器反馈了一个应答信号,如果是高电平就是没接受成功。
对应答信号ACK还有一个要求就是:接收器在第9个时钟脉冲之前的低电平期间将SDA线拉低,并且确保在该时钟的高电平期间为稳定的低电平。

STM32的IIC通信的部分理解_第2张图片
大致就是这个样子。

5数据的有效性:就是说时钟线SCL为高电平的时候,数据线SDL高低电平是不能随便跳变的,只有时钟线为低电平的时候才可以。在时钟线高低变化时数据线一定要保持稳定。

6数据的传输:在IIC协议下传送的每一位数据,都有一个时钟脉冲相对应。也就是说,在两条线的配合下,一位一位地传输数据。

接下来看代码
在myiic.h文件中
#define IIC_SCL PBout(8) //SCL
#define IIC_SDA PBout(9) //SDA
#define READ_SDA PBin(9) //输入SDA
从上看出,数据线既可以输入,也可以输出。到底用哪个,通过Mode进行配置。

另外注意几点:
1.IIC总线上可以挂很多设备:多个主设备,多个从设备(外围 设备)。上图中主设备是主控制器,剩下的都是从设备。
2.当多个主机同时想占用总线时,企图启动总线传输数据,就叫做总线竞争。I2C通过总线仲裁,以决定哪台主机控制总线。
3.每个接到I2C总线上的器件都有唯一的地址。主机与其它器件间的数据传输可以是由主机发送数据到其它器件,这时主机 即为发送器,总线上收数据的器件则为接收器。
4起始信号和终止信号都是由主机发送的。在起始信号产生之后,总线就处于被占用的状态,在终止信号产生之后,总线就处于空闲状态。
5每当发送器传输完一个字节的数据之后,发送端会等待一定的时间,等接收方的应答信号。接收端通过拉低SDA数据线,给发送端发送一个应答信号,以提醒发送端我这边已经接受完成,数据可以继续传输,接下来,发送端就可以继续发送数据了。(就两根线,主机和从机通过这两根线实现各种玩法,就像两个拿着两根绳子在玩一样)
总线寻址
6主机发送地址时,总线上的每个从机都将这7位地址码与自己的地址进行比较,若相同,则认为自己正在被主机寻址,根据R/T位将自己确定为发送器和接收器。
7主机给从机发送第一个字节(总线寻址那个字节),若是读命令,则从机接收到该 命令之后,主动往主机发送数据。
8从机地址的确定:第0位是读写位。(如对于24C02这块存储器,它若作为从机,那么它的地址中74位是固定的,更改不了,第31位是可以更改的,每一位根据硬件的管教连接来确定,连接高电平那就是1,低电平就是0)
9在起始信号后必须传送一个从机的地址(7位),第8位是数据的传送方向位(R/T),用“0”表示主机发送数据(T),“1”表示主机接收数据®。

贴一下比较重要的两个函数
一.写数据

24c02的写入数据,可以看到主从设备iic中写的过程:起始信号->器件地址(7位地址加一个读写位)->等待应答->要操作内存的地址->等待应答->写入数据->等待应答->停止

void AT24CXX_WriteOneByte(u16 WriteAddr,u8 DataToWrite)
{
IIC_Start(); //1起始信号
if(EE_TYPE>AT24C16)//如果容量大于24C216的
{
IIC_Send_Byte(0XA0); //发送写命令,器件地址
IIC_Wait_Ack();
IIC_Send_Byte(WriteAddr>>8);//发送高地址 写内存的地址
}else IIC_Send_Byte(0XA0+((WriteAddr/256)<<1)); //2发送器件地址0XA0,写
IIC_Wait_Ack(); //3等待应答
IIC_Send_Byte(WriteAddr%256); //4发送低地址
IIC_Wait_Ack(); //5等待应答
IIC_Send_Byte(DataToWrite); //6发送字节 ,写入数据
IIC_Wait_Ack(); //等待应答
IIC_Stop();//产生一个停止条件
delay_ms(10);
}

二.读数据

24c02中iic协议中读数据的过程:起始信号->器件地址(7+1位写(0))->应答->读取地址->应答->起始信号-.>器件地址(7位+读(1))->应答->读取数据->发送应答->停止信号

过程如下:

u8 AT24CXX_ReadOneByte(u16 ReadAddr)
{
u8 temp=0;
IIC_Start();
if(EE_TYPE>AT24C16)
{
IIC_Send_Byte(0XA0); //发送写命令
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr>>8);//发送高地址
}else
IIC_Send_Byte(0XA0+((ReadAddr/256)<<1)); //发送器件地址0XA0,写数据
IIC_Wait_Ack();
IIC_Send_Byte(ReadAddr%256); //发送低地址
IIC_Wait_Ack();
IIC_Start();
IIC_Send_Byte(0XA1); //进入接收模式
IIC_Wait_Ack();
temp=IIC_Read_Byte(0);
IIC_Stop();//产生一个停止条件
return temp;
}

终于有些理解了,有问题留言交流哈。

你可能感兴趣的:(STM32)