STM32的IIC通信课堂教学方法的探讨

2018-10-31 10:29侯凤云蔡晓龙
科教导刊·电子版 2018年27期
关键词:课堂教学

侯凤云 蔡晓龙

摘 要 随着嵌入式系统主频的提高,串行通信的地位逐步提高。STM32的同步串行口IIC通信效率高,占用资源少。本文介绍了STM32的IIC通信的教学方法,以24C02为从机,解析了STM32和24C02之间模拟IIC通信的实现过程。首先叙述了IIC通信基础,然后分析了STM32和24C02的接口电路设计,最后是软件的实现。

关键词 STM32 IIC通信 课堂教学

0引言

IIC 即Inter-Integrated Circuit(集成电路总线),是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线。

IIC是多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源,简化了信号传输总线接口。IIC总线是各种总线中使用信号线最少,并具有自动寻址、多主机时钟同步和仲裁等功能的总线。使用IIC总线搭建计算机系统方便灵活,体积小,随着嵌入式系统主频的提高,IIC在嵌入式系统中得到了广泛应用。

1 STM32的IIC通信基础

1.1 IIC总线结构

IIC总线一般有两根信号线,数据线SDA和时钟线SCL。IIC总线是多主机的总线,所有接到IIC总线上的设备数据线都接到总线的SDA上,各设备的時钟线接到总线的SCL上,连接关系如图1所示。

多主机情况由总线仲裁功能解决,主机能够控制信号的传输和时钟频率,任何时间点上只能有一个主机。每个连接到总线的器件可以通过唯一的地址和主机联系,主机可以是发送器或接收器。一般情况下SDA、SCL接上拉电阻,实现电平的转换以及提高驱动能力,当总线空闲时这两条线路都是高电平。

IIC时序是SCL和SDA两根信号线上的电平变化顺序,IIC正常通信时必须遵守一定的时序要求,时序信号如图2所示。

根据时序图进行分析:总线空闲状态时,SDA和SCL两条信号线都处于高电平,即总线上所有的器件都释放总线;启动信号START,时钟信号SCL保持高电平,数据信号SDA的电平被拉低(即负跳变)。启动信号必须是跳变信号,而且在建立该信号前必修保证总线处于空闲状态;停止信号STOP,时钟信号SCL保持高电平,数据线被释放,使得SDA返回高电平(即正跳变),停止信号也必须是跳变信号;数据传输过程中,数据线SDA上的数据状态在时钟线SCL的高电平期间必须保持稳定,只有在SCL线为低电平期间,SDA上的电平允许变化;应答信号ACK,IIC总线的数据都是以字节(8位)的方式传送的,发送器件每发送一个字节之后,在SCL的第9个脉冲期间释放数据总线,由接收器发送一个ACK(把数据总线的电平拉低)来表示数据成功接收;无应答信号NACK,在SCL的第9个脉冲期间发送器释放数据总线,接收器不拉低数据总线表示一个NACK,NACK有两种用途,一种表示接收器未成功接收数据字节,另一种是当接收器是主机时,接收到最后一个字节后,发送一个NACK信号,通知发送器结束数据发送,主机发送停止信号STOP。

2 IIC的接口电路设计

以24C02为例介绍IIC的接口电路,24C02是一种256B的可电擦除EEPROM,通过IIC协议与STM32进行通信,读写方便,广泛应用于智能仪器、汽车电子、家用电器等场合。

接口电路如图3所示。24C02的A2、A1、A0为地址位,用于级联,由于电路中仅1片24C02,3个端口接地即可;WP为写保护,接地时可进行读、写操作;24C02的SCL是时钟线,SDA是信号线,分别接STM32的PB10、PB11端子,并且外接上拉电阻至3.3V电源。

STM32的PB10、PB11也是硬件IIC接口,为了灵活选用端子、方便移植,这里采用模拟IIC方式通信。

通过操作两个I/O端口的高、低电平满足时序要求,从而实现IIC通信,就是模拟IIC。下面介绍软件的实现过程。

3软件实现

3.1 IIC寻址方式

图3中24C02的地址以字节表示。地址字节的高7位表示从机地址,其中高4位属于固定地址,由厂家统一规定;低3位为引脚设定地址,由外部引脚电平状态来设定。图3中的IIC设备是AT24C02,高4位由厂家规定为1010,低3位是000。

地址字节的最低位(LSB)是读/写控制位,0表示主机向从机写入信息,1表示主机由从机读取信息。

3.2 IIC通信流程

IIC通信包括写入和读取两个过程,以启动信号START来掌控总线,以停止信号STOP来释放总线;每次通信以START开始,以STOP结束。每个数据字节在传送时都是高位(MSB)在前。注意编写程序时,参考STM32用户手册中IIC通信要求的精确时序,可采用SysTick定时器。

写入的通信流程如下:

(1)主机在检测到总线空闲的状况下,发出START信号。

(2)发送一个地址字节(上述例子的地址是10100000),表示写入,等待从机应答信号ACK。

(3)主机收到ACK后,发送要写入的器件地址单元,等待从机应答信号ACK。

(4)主机收到ACK后,开始发送第一个数据字节。

(5)从机收到数据字节后发送一个ACK表示继续传送数据,发送NACK表示传送数据结束。

(6)主机发送全部数据后,发出STOP信号,结束通信并且释放总线。

读取的通信流程如下:

(1)主机在检测到总线空闲的状况下,发出START信号。

(2)发送一个地址字节(上述例子的地址是1010000),等待从机应答信号ACK。

(3)主机收到ACK后,发送要读取的器件地址单元,等待从机应答信号ACK。

(4)主机收到ACK后,启动START信号,发送一个地址字节(上述例子的地址是10100001),表示接收,等待从机应答信号ACK。

(5)主机收到ACK后释放数据总线,开始接收第一个数据字节。

(6)主机收到数据后发送ACK表示继续传送数据,发送NACK表示传送数据结束。

(7)主机接收全部数据后,发出STOP信号,结束通信并且释放总线。

根据上述IIC的通信流程和时序要求,进行程序的编写,会用到下列函数:启动信号函数、停止信号函数、等待应答函数、产生应答函数、不产生应答函数、发送字节函数、接收字节函数等,不一一列写。

4小结

实现模拟IIC通信,重点是先理解IIC的通信时序,根据IIC通信器件要求设计硬件接口电路,然后弄清楚读取和写入的通信流程,完成程序的编写。通过实验能够进一步理解和掌握模拟IIC通信方法。

猜你喜欢
课堂教学
且行且思,让批注式阅读融入课堂教学
让课堂教学“活”起来
把“三个倡导”融入课堂教学