stm32i2c实验心得体会(精选2篇)
stm32i2c实验心得体会 篇1
I2C器件接口IP核的CPLD设计
摘要:根据单片机I2C串行扩展的特点,在EDA软件MaxplusII的环境下,利用AHDL语言,建立IP核。此设计利用状态机实现,在给出设计的同时详细说明IP核的建立过程,并下载到芯片通过硬件试验验证。关键词:可编程逻辑器件 I2C串行扩展 IP核
由于CPLD数字设计结构化的趋势,将出现针对CPLD不同层次的IP(Intellectual Property)核。各个IP核可重复利用,可大大提高设计能力和效率。国外各大公司都推出了专门的IP核,我国也迫切需要发展自己的IP核。本文针对I2C的主方式串行扩展通信的特点,详细给出设计过程和结果。
1 IP核简介
IP核是指:将一些在数字电路中常用但比较复杂的功能块,如FIR滤波器、SDRAM控制器、PCI接口等等设计成可修改参数的模块,让其它用户可以直接调用这些模块,以避免重复劳动。随着CPLD/FPGA的规模越来越大,设计越来越复杂,使用IP核是一个发展趋势。许多公司推荐使用现成的或经过测试的宏功能模块、IP核,用来增强已有的HDL的`设计方法。当在进行复杂系统设计的时侯,这些宏功能模块、IP核无疑将大大地减少设计风险及缩短开发周期。使用这些宏功能模块、IP核,就会将更多的时间和精力放在改善及提高系统级的产品方面,而不需要重新开发现成的宏功能模块、IP核。我国IP核库的建设已相当迫切,它是集成电路产业发展的一个重要目标。
图1 I2C传输原理图
2 I2C串行通信特点简介
Philips公司推出的I2C软、硬件协议十分巧妙,在单主方式的I2C总线系统中,总线上只有一个单片机,其余都是带I2C总线的外围器件。由于总线上只有一个单片机成为主节点,单片系统永远占据了总线,不会出现竞争,主节点不必有自己的节点地址。只要每个外围器件有自己的器件地址,两根I/O口线SCL(时钟线)和SDA(数据线)就可以虚拟I2C总线接口。I2C总线上的数据传送如图 1所示。总线上传送的每一帧数据均为1个字节。启动总线后,要求每传送1个字节后,对方回应一个应答位。在发送时,首先发送最高位。每次传送开始有起始信号,结束时有停止信号。在总线传送完1个字节后,可以通过对时钟线的控制,使传送暂停,这时可在应答信号后使SCL变低电平,控制总线暂停。 当主节点要求总线暂停时亦可采用同样的方法。图1是CPLD向外围I2C器件发送01010011 和01001001这两个数据的情况。
3 在MaxplusII环境下I2C串行扩展IP核的建立
MaxplusII是美国Altera公司用于CPLD的EDA软件,(本网网收集整理)内部有许多常用的宏单元,如计数器、四则运算、各类逻辑门乃至ROM、RAM等。这些宏单元内具体的参数都可以由用户来自行设定,这就是上面提到的IP核形式。它避免了重复劳动,提高了效率。以下将要设计的是下位机的IP核。
MaxplusII的AHDL(Altera Hard ware Description Language)是Altera公司开发的完全集成于MaxplusII中的一种模块化高级语言,特别适合于描述复杂的组合逻辑、组运算、状态机和真值表。本文利用AHDL,直接生成IP核。
设计的最终目标是生成如图 2所示的Symbol。通过输入数据来达到控制SDA和SCL的目的,将信号按要求的时序传送给I2C器件。
设计思路是利用状态机实现时序。主要包括输入数据锁存、起始、数据传输、停止等状态机。通过状态机,在每一状态下确定下一状态SDA和SCL是高电平或者低电平,通过这种方式实现了I2C所需要的每一种时序。由于使用的是AHDL,这种状态机实现起来非常方便,程序简洁明了。由于篇幅限制,仅介绍数据传输的状态机。状态图如图3所示。
以下程序中,Cmd_reg2为发送允许暂存位;Sh_reg[]为数据锁存,通过左移,最高位数据Sh_reg7为当前将发送数据,存入SDA_tmp 。通过图 3对照程序,可以看到发送一个利用状态机数据位的详细过程。程序清单如下:
IF Cmd_reg2 THEN --若“发送允许”,则将Sh_reg7作为当前发送位
SDA_tmp = Sh_reg7;
ELSE
SDA_tmp = VCC;
END IF;
St.clk = SysClk;
St.ena = BaudGen;
CASE St IS --控制传输8位数据的状态机
WHEN t0 =>
IF Cmd_reg2 OR Cmd_reg3 THEN
SDA = SDA_tmp; --开始传送数据
SCL = GND;
St = t1;
ELSE
St = t0;
END IF;
WHEN t1 =>
SCL = VCC;
SDA = SDA_tmp;
St = t1a;
WHEN t1a =>
SCL = VCC;
SDA = SDA_tmp;
St = t2;
WHEN t2 =>
Sh_reg[7..1] = Sh_reg[6..0]; --数据左移,取高位
Sh_reg[0] = GND;
Sh_reg[].ena = EXU;
SCL = GND;
SDA = SDA_tmp;
IF Bit[] == 7 THEN --若8位传完,则发应答位;否则继续
St = t3;
ELSE
St = t0;
END IF;
WHEN t3 =>--发应答位
SDA =GND;
St = t4;
WHEN t4 =>
SDA = GND;
SCL = VCC;
St = t4a;
WHEN t4a =>
SDA = GND;
SCL = VCC;
St = t5;
WHEN t5 =>
SCL = GND;
St = t6;
WHEN t6 =>
SDA = GND;
FINISHED = VCC;
St = t0;
END CASE;
Bit[] = Bit[] + 1; DD--传输完一位,已传输位数加一
图 4为仿真结果。起始信号给出以后,传输2个8位数据:每个数据后跟一个应答位,在输送完第一个数据要求的情况下,暂停一段时间,再输送第二个数据;2个数据输完以后,主机发出停止输送要求,即给出停止信号。这些信号,在SDA和SCL上完全符合I2C的时序要求。要使总线传输速率达到改进后的规范,即400 kb/s,因为根据以上叙述,每发送1位数据需要4个时钟周期,所以所给的时钟为1600 kHz。图4中Execute为执行信号,即它为高电平时,输入数据DIN[7..0]有效;EXU为发送使能信号,只有当它为高电平时,方可输送串行数据到外围器件;Start为开始控制信号,用于发生起始信号;STOP用于告知总线数据传输结束,发生停止信号。
图4 仿真结果
仿真以后,通过编程电缆将生成的pof文件用ISP(在系统编程)方式下载到FPGA板EPM7128SLC84-6,I/O口SDA和SCL挂上拉电阻,外接两片I2C器件SAA1064(LED显示I2C串入并出芯片)进行测试,结果CPLD利用该I2C的IP核,工作正常,可以按照要求显示。
stm32i2c实验心得体会 篇2
I2C (Inter Integrated Circuit) 总线是一种应用比较广泛的两线式串行总线, 由PHILIPS公司研究开发。I2C总线可用于微控制器与外围设备之间的双向高速数据传送, 数据速率可达到400 kbps, 具有连线少、允许多主机控制、可进行总线仲裁和同步传输等特点。STM32F107VCT6是一款基于ARM Cortex-M3内核的高性能嵌入式控制芯片, 主频72 MHz, 内部含有I2C总线接口, 用来连接微控制器和串行I2C总线, 提供多主机功能, 控制所有I2C总线特定的时序、协议、仲裁和定时[1]。
在嵌入式应用中, 往往有一些数据需要掉电存储, 并且根据程序需要, 相关参数可进行必要的修改。而EEPROM存储器件则可满足上述需求, 为应用程序提供参数存储和数据修改。EEPROM是一种电可擦可编程的只读存储器, 掉电后数据不丢失, 是嵌入式系统中经常使用的一种存储器。AT24C系列串行EEPROM是由美国ATMEL公司生产的, 带有I2C总线接口, 具有功耗小, 电源电压范围宽, 工作电流小, 可硬件编址等特点[2]。
本文主要研究在STM32F107VCT6平台下, 运用I2C总线接口进行AT24LC02型号EEPROM存储器使用的技术。
1 I2C总线工作原理
(1) 总线结构
典型的I2C总线应用系统结构如图1所示。I2C总线由数据线SDA和时钟线SCL两条线组成。在图1中, U1、U2、U3、U4是支持I2C总线协议的器件, 这些器件的数据引脚SDA、时钟引脚SCL分别与I2C总线的数据线SDA和时钟线SCL相连。在时钟线SCL的时钟控制下, 数据线SDA上的数据可完成各器件间双向收发。此外, 与电源相连的电阻R1与R2的作用是将I2C总线的数据线SDA和时钟线SCL电平拉高。
(2) 总线编址
I2C总线上的器件全部并接在数据线SDA和时钟线SCL上, 为了保证通信的正常进行, 相互之间需要进行身份识别, 即每个I2C器件需要有一个唯一的地址。为了满足上述要求, I2C总线协议制定了相应的编址规则。现简单介绍如下:
I2C器件的地址为一个字节 (8位) , 主要由三部分组成:第一部分为器件地址, 占4位, 这部分地址为器件固有的地址编码, 出厂时就已经设定好了, 不能更改。器件地址一般为十六进制数字“A”, 换算成二进制是“1010”。第二部分为器件引脚地址, 占3位, 由I2C器件的外围引脚A2、A1、A0决定, 根据在实际应用电路中所接电源极性的不同, 构成不同的引脚地址。第三部分为读写比特, 占一位。I2C器件在通信时一般分为主器件和从器件, 读写比特取值1时, 表示主器件读取从器件数据, 当取值0时, 表示主器件向从器件发送数据。
(3) 总线协议
I2C总线上的器件共用数据线SDA和时钟线SCL, 在通信时, 主要依靠时钟线与数据线SDA的时序配合, 才能完成系统内各用户之间有条不紊地数据收发。I2C总线协议的主要内容就是对上述数据收发时的时序进行规定。下面进行简要归纳。
I2C总线数据的传送分为数据写入和数据读出 (以主器件为例) , 其帧结构如表1、表2所示:
由表1、表2可见, 主器件在I2C总线上进行数据的写入读出时, 帧结构主要由开始信号、从机地址、读写比特、数据、应答信号A、非应答信号B以及停止信号组成, 其中, 从机地址及读写比特按着上面的总线编址方式确定, 数据则为实际工作中用户收发的相应数据。而开始信号、终止信号、应答信号以及非应答信号为SCL及SDA时序相互配合的结果, 相应的时序图如图2所示。
由图2可见, 在SCL为高电平期间, SDA由高电平向低电平变化出现下降沿时, 起始信号A用于表征一次I2C总线通信的开始。在SCL为高电平期间, SDA由低电平向高电平变化出现上升沿时, 终止信号B用于表征一次I2C总线通信的终止。在SCL为高电平期间, SDA输出低电平时, 为应答信号C。在SCL为高电平期间, SDA输出高电平时, 为非应答信号D。
需要说明的是在表1、表2的数据写入、读出帧结构中, 开始信号、终止信号、从机地址、读写比特均由主器件发出, 而数据由发送方发送, 应答及非应答信号由接收方发送[3]。
2 AT24LC02芯片I2C硬件接口设计
图3是神舟开发板中AT24LC02芯片I2C硬件接口设计图。由图可见, 该芯片的外围引脚A2、A1、A0接地, 根据上述的编址规则, 此芯片的I2C地址为0x A0, VCC、GND为电源引脚, WP引脚为写保护引脚, 图中该引脚接地配置可使I2C器件进行读写操作, SCL、SDA与STM32F107VCT6的PB6、PB7引脚相连, PB6、PB7引脚为STM32F107VCT6芯片的SCL、SDA功能引脚。R56和R57两个上拉电阻为I2C总线提供高电平[4]。
3 软件设计
为了大大减少用户的程序编写时间, 进而降低开发成本, ST官方为用户提供了STM32F10xxx系列标准外设库。采用标准外设库进行系统开发, 开发人员无需深入掌握底层硬件细节, 就可以调用库函数轻松应用每一个外设。利用STM32F10xxx系列标准外设库进行I2C器件应用软件设计, 一般遵循图4的操作流程。
以神舟开发板中AT24LC02芯片I2C硬件接口设计图为基础, 上述流程的软件设计如下[4]:
(1) GPIO初始化
GPIO初始化就是为用到的I2C功能引脚PB6、PB7提供RCC时钟, 并配置功能引脚为复用功能开漏输出, 代码如下:
(2) I2C参数配置
I2C参数配置主要配置I2C的工作模式 (I2C接口可工作在I2C模式及SMBus (系统管理总线) 模式) , 时钟分频系数, 本地地址、应答模式、时钟速率等内容, 主要代码如下
(3) I2C数据收发
当完成上述两步后, 就可以使用I2C进行数据的收发了, STM32F10xxx系列标准外设库的"stm32f10x_I2C.h"头文件定义了和I2C数据收发相关的库函数, 使用相应的库函数就可完成I2C数据的收发。库函数的声明如下:
4 结束语
本文从I2C总线的工作原理入手, 详细分析了I2C总线的系统结构、总线编址、总线协议三方面内容, 在此基础上介绍了神舟开发板中AT24LC02芯片I2C硬件接口设计, 最后以此硬件为基础给出了软件设计的基本流程。受文章篇幅限制, 本文只是给出了STM32F107VCT6平台下I2C总线使用技术的一个基本框架, 许多硬件及软件的细节未详细说明, 如果有进一步的需要, 可查阅相关的技术手册及用户手册。论文对嵌入式开发过程中使用I2C总线收发数据具有一定的借鉴作用。
参考文献
[1]意法半导体 (中国) 投资有限公司.STM32F系列ARM内核32位高性能微控制器参考手册V10_1[Z].2010.
[2]李国平, 武海艳.C51实现I2C总线的应用研究[J].福建电脑.2006 (9) :168, 182.
[3]陆彬.21天学通51单片机开发[M].北京:电子工业出版社, 2010.