历史上的今天
返回首页

历史上的今天

今天是:2025年04月20日(星期日)

正在发生

2021年04月20日 | 一种I2C设备控制方法的设计和实现

2021-04-20 来源:21ic

1 引 言


I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。AT91SAM7X256是Atmel公司于2005年推出的基于ARM7的工业级芯片,他以体积小、功耗低、连接方式广泛、处理资源丰富、控制灵活等特点受到嵌入式领域开发人员的重视。本文介绍AT91SAM7X256的I2C控制器TWI接口(two-wired interface)的使用方法,并以I2C设备E2PROM和日历时钟芯片为例,实现AT91SAM7X256对时间数据的读取与存储。同时,为了验证时间数据的读取与存储是否正确,使用AT91SAM7X256的在线仿真器J-LINK将E2PROM中的数据读至内存进行检查。


ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。技术具有性能高、成本低和能耗省的特点。适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。


2 硬件设计


2.1 硬件模块结构


电路的硬件模块结构如图1所示。


AT91SAM7X256的TWI接口由一根时钟线TWCK和一根数据线TWD组成,产生的信号时序符合I2C总线规范;PCF8563是Philips公司推出的一款内含I2C总线接口功能的工业级时钟芯片;AT24C08是Atmel公司推出的符合I2C规约的两线串口E2PROM.AT91SAM7X256的TWCK和TWD分别与芯片PCF8563和AT24C08的SCL与SDA相连,CPU通过TWI接口将时间数据读出并存储。为了保证CPU不冲突的访问PCF8563和AT24C08,本文将AT24C08的A2管脚接高电平。由于I2C总线空闲时为高电平,所以为实现"线与"功能,总线上连接的设备均是集电极开路的,因此总线需外接上拉电阻R.AT91SAM7X256的TWI有主从2种工作模式,本文中AT91SAM7X256作为控制方,应工作于主模式。





2.2 AT91SAM7X256的TWI接口


AT91SAM7X256的TWD和TWCK管脚与设备的I/O管脚复用,同时AT91SAM7X256采用单独控制功能单元的省电方案,电源管理单元PMC控制各功能单元的时钟是否工作,所以要使用TWI接口,需要首先配置TWD和TWCK为外设连线和开路状态,其次配置PMC使TWI时钟处于工作状态。


TWI接口可提供高达400 kb/s的传输速率,为使得数据的传输速率面向不同应用,可以通过配置时钟脉冲发生器的控制寄存器TWI_CWEG调整TWCK的信号频率。


TWI接口产生的信号时序符合I2C总线规范,当读/写1个字节数据时,主设备需提供从设备的设备地址、内部地址、读写控制以及起始标志和停止标志。在数据的收发过程中,主要使用控制寄存器TWI_CR、主模式寄存器TWI_MMR、内部地址寄存器TWI_IADR、状态寄存器TWI_SR、传输保持寄存器TWI_THR和接收保持寄存器TWI_RHR.从设备地址在TWI_MMR中设置,从设备的内部地址在TWI_IADR中设置;在TWI_CR中设置是否发送起始信号和停止信号;NAK(无应答)、OVER(运行错误)、TXRDY(发送准备好)、RXRDY(接收准备好)、TX-COMP(传输完成)等状态位通过查询WI_SR得到。


写数据的过程包括:当TWI_THR写入数据后,CPU产生起始信号启动传输,TWI_THR中的数据经过并串转换后由TWD传输出去,当CPU收到从设备的应答信号后,TWI_SR的TXRDY将自动置"1",说明数据已写入从设备。读数据的过程包括:CPU发出起始信号后,若TWI_SR的RXRDY位为"1",则说明TWI_RHR中有数据等待接收,当TWI_RHR中的数据被读出后,则RXRDY自动置为"0".当读/写数据完毕后,CPU将产生一个停止信号结束传输,TWI_SR的TXCOMP将自动置"1".


2.3 PCF8563日历时钟芯片的使用方法


按I2C协议规约,PCF8563具有惟一的设备地址0A2H.本文重点研究PCF8563时、分、秒数据的读取方法,在此用到的内部寄存器包括控制/状态寄存器1(地址为00H)、秒寄存器(地址为02H)、分寄存器(地址为03H)、小时寄存器(地址为04H)。由于寄存器中以BCD格式存储时、分、秒数据,所以各时间时间寄存器的高位无效。


为使PCF8563工作于普通模式,需要将控制/状态寄存器1置为00H,同时为了存储正确的时间数据,需要将读到的数据中无效的高位进行屏蔽。若需要校对时间,只需对时、分、秒寄存器进行写操作即可。


2.4 AT24C08的使用方法


AT24C08是容量为8192 b(1024 B)的E2PROM.AT24C08内部分为4页,每一页有256字节单元,所以若要访问某个单元则需要10位进行寻址,其中最高两位是页地址,低8位是页内地址。设备地址的定义如图2所示,其中P1P0对应页地址,管脚A2可为AT24C08设定两组设备地址。当A2为低电平时,4页的设备地址分别为0A0H,0A2H,0A4H,0A6H;当A2为高电平时;反之为0A8H,0AAH,0ACH,0AEH.因此,为了避免AT24C08与PCF8563的设备地址冲突,需将A2连接高电平。


微博桌面截图_20121112143951.jpg?imageView2/2/w/550




AT24C08的写操作支持"字节写"和"页面写"两种方式。"字节写"方式中每写一个字节均需主设备提供起始信号、设备地址、内部地址以及停止信号;"页面写"方式即连续写数据,需主设备提供起始标志、设备地址以及内部地址,数据全部写完后再发送停止标志。


AT24C08的读操作支持"当前地址读"、"随机读"和"顺序读"3种方式。"当前地址读"表示从当前内部地址单元读出1个字节,所以主设备仅需提供起始信号、设备地址和停止信号;"随机读"表示从任意内部地址单元读出1个字节,所以主设备需要先提供1次起始信号、设备地址、写操作、设备内部地址和停止信号,设定设备的内部地址,之后再按"当前地址读"方式读数据即可;"顺序读"表示从当前地址开始连续读多个字节,所以主设备需提供起始信号、设备地址、读操作,数据全部读完后再发送停止信号。


为了快速读写数据,本文采用页面写的方式将数据写入AT24C08;采用"随机读"和"顺序读"相结合的方式读取AT24C08数据。


3 软件设计


3.1 TWI初始化程序的设计


根据TWI的功能特点,TWI初始化的初始化包括以下4步:


(1)配置PIO控制器使复用管脚驱动TWI信号;


(2)配置PMC使TWI时钟处于工作状态;


(3)配置TWI为主工作模式。本文CPU为主设备,日历和存储芯片为从设备;


(4)设置数据传输速率,配置TWI时钟波形发生器寄存器。


3.2 PCF8563驱动程序的设计


为了控制PCF8563的工作方式,需要对其写入控制字;为了得到PCF8563输出的时间信息,需要对其进行读操作,读/写数据的流程如图3所示。


本文设计编写如下读函数和写函数:





其中,pTwi是结构体指针,指向的结构体中存放TWI的寄存器,通过pTwi即可访问各TWI寄存器;address表示设备地址;im_address表示设备内部地址;data代表读写数据的变量指针。





因此,若使PCF8563工作于普通模式,并读"时"数据,可用以下代码实现:





3.3 AT24C08驱动程序的设计


由于AT24C08由4个具有不同设备地址的页组成,且采用连续读写数据的操作方式,所以AT24C08的读写与PCF8563读写有以下几点区别。


(1)先设置TWI_CR的起始标志,之后通过TWI_RHR和TWI_THR读/写TWI接口的数据;发送最后一个数据之前,再设置TWI_CR的停止标志。


(2)对于多字节数据的读写,全部数据若没有传输完毕,便不发送停止信号,所以需通过判断TWI_SR寄存器中的TXRDY和RXRDY决定是否读TWI_RHR和写TWI_THR,而将是否出现停止信号作为是否停止发送和接收的判断依据。


(3)由于数据量和起始单元均是随机的,所以有可能出现一页写不下的情况,因此针对给定的数据量和起始单元参数需要计算出共需几页,以便在进行页面切换时更换设备地址。


本文设计编写了如下读函数和写函数。



3.4 软件的调试与运行


本文采用IAR开发环境和J-LINK仿真器进行软件的在线调试和加载运行。调用函数完成以下程序设计:首先从PCF8563连续读出若干数据并写入AT24C08;其次,将AT24C08中的数据读至数组变量中。在程序中的读完AT24C08数据后设置断点,观测数组中存放的数据,从而验证驱动程序的正确性。


4 结 语


本文介绍了PCF8563和AT24C08的使用方法,通过分析基于ARM核的AT91SAM7X256的TWI接口控制方法,设计PCF8563和AT24C08的驱动程序,实现时钟数据的读取和存储。


本文设计的驱动模块已成功地用于智能煤矿分站实验系统中,完成了历史时间数据的记录功能,同时本文为ARM控制多个I2C设备提供了可以借鉴的方法。


推荐阅读

史海拾趣

Gardner Denver公司的发展小趣事

Galaxy Semi-Conductor Co Ltd(尽管通常指的是三星电子在半导体领域的业务,但“Galaxy Semi-Conductor”并非一个直接对应的公司名,这里我们假设其代表三星电子的半导体部门)在电子行业中的发展可以通过以下几个关键故事来概述:

1. 苏州工业园区的崛起

三星半导体(中国)研究开发有限公司,作为三星电子在中国的重要研发基地,于2003年在苏州工业园区成立。这家公司由韩国三星电子株式会社独资兴办,注册资本达到450万美元,专注于电子零部件和集成电路的软件与硬件设计,以及电子产品解决方案的研发。随着公司的不断发展,它不仅在技术研发上取得了显著成果,还积极推动了半导体技术的本地化应用,成为三星电子全球研发网络中的重要一环。

2. 半导体技术的全球领先地位

三星半导体自1983年起就拥有了半导体全线工程技术,并迅速成为世界上第三个超大规模集成电路(VLSI)生产商。这一技术突破标志着三星在半导体领域的崛起。此后,三星持续投入研发,不断推动半导体技术的创新与发展。例如,三星在DRAM(动态随机存取存储器)和NAND Flash存储技术方面取得了全球领先地位,推出了多款具有划时代意义的行业标杆产品,如高性能的SSD固态硬盘,这些产品在全球范围内得到了广泛应用。

3. 绿色工厂的环保实践

三星电子一直致力于可持续发展,其半导体工厂也不例外。例如,三星电子(苏州)半导体有限公司在2019年入选了工业和信息化部绿色工厂名单。这家工厂在生产过程中注重节能减排,采用先进的环保技术和设备,有效降低了生产过程中的能耗和排放。同时,三星还积极推动绿色供应链管理,与供应商共同致力于环境保护和可持续发展。

4. 技术创新与产品多元化

三星半导体不仅在存储技术方面取得了卓越成就,还在其他多个领域进行了广泛的技术创新和产品多元化。例如,三星在移动处理器(如Exynos系列)和图像传感器(如ISOCELL系列)方面也取得了显著进展。这些产品不仅提升了三星自身产品的竞争力,还为全球电子行业的发展注入了新的活力。

5. 全球化布局与战略合作

三星半导体在全球范围内进行了广泛的布局,建立了多个研发中心和生产基地。这些基地不仅负责本地市场的产品研发和生产,还积极参与全球供应链的建设和合作。同时,三星还积极寻求与其他企业的战略合作,共同推动半导体技术的发展和应用。例如,三星与联发科技在移动平台上的合作,以及与红帽在CXL存储生态系统上的合作,都体现了三星在全球化布局和战略合作方面的远见卓识。

这些故事共同展示了三星半导体在电子行业中的发展历程和成就,也体现了其在技术创新、可持续发展和全球化布局方面的努力与贡献。

Glorious Sources Co Ltd公司的发展小趣事
在光学实验中,用于演示光的传播、反射、折射等现象;在光学教学中,作为辅助教学工具帮助学生理解光学原理。
AUSTIN公司的发展小趣事

随着汽车市场的不断变化和消费者需求的多样化,奥斯汀汽车也在不断调整市场策略和产品布局。公司根据市场需求推出了一系列新的车型,并积极拓展海外市场。虽然奥斯汀汽车在历史长河中经历了许多波折和挑战,但其品牌精神和传统始终得以传承和发扬。如今,奥斯汀汽车已经成为了英国汽车文化的重要组成部分,其经典车型和品牌形象仍然深受消费者喜爱。

这些故事展示了AUSTIN汽车公司在汽车行业中的发展历程,从创始与早期成功,到危机与重生,再到技术合作与国际化发展,以及产品创新与多样化,最终实现了市场调整与品牌传承。这些事实性的描述,旨在呈现AUSTIN汽车公司在历史长河中的真实面貌,而不涉及任何褒贬评价。

Crystek公司的发展小趣事

为了进一步扩大市场份额和提升品牌影响力,Crystek公司积极拓展国际市场,与全球多家知名企业建立了合作关系。通过与这些企业的深入合作,Crystek公司的产品得以广泛应用于无线、微波无线电、电信、工业、企业、航空航天和政府部门等各个领域。同时,公司还积极参加国际电子展览和技术交流会议,与全球同行交流学习,不断提升自身的技术水平和市场竞争力。

Communications公司的发展小趣事

在电子行业的跨界融合趋势下,一家名为“智联通信”的公司通过整合不同领域的技术和资源,成功打造出了一个全新的通信生态系统。他们不仅拥有先进的通信技术,还积极与互联网、物联网等领域的企业进行合作,共同开发新的应用场景。

通过跨界融合,“智联通信”成功地将通信技术应用于智能家居、智慧城市等多个领域,为用户提供了更加便捷、高效的服务体验。同时,他们还积极拓展海外市场,与全球伙伴共同推动通信行业的发展。

Hosiden Corporation公司的发展小趣事

近年来,Hosiden在技术创新方面取得了显著成果。特别是在汽车市场,公司积极参与并推动了MIPI A-PHY标准的验证与应用。Hosiden与Valens Semiconductor等领先企业合作,完成了其连接器和电缆对Valens VA7000芯片组的验证,这是市场上首个符合MIPI A-PHY的芯片组。这一里程碑式的成就不仅展示了Hosiden在技术创新方面的实力,也进一步巩固了其在汽车电子市场中的领先地位。

问答坊 | AI 解惑

学习单片机需要掌握的硬件问题,大家一起分享

学习单片机需要掌握的硬件问题,大家一起分享 就单片机学习过程中硬件设计方面的几个基本问题一起分享 1、电阻电容的封装形式如何选择,有没有什么原则?比如,同样是 104 的电容有 0603、0805 的封装,同样是 10uF 电容有 3216、0805、3528 ...…

查看全部问答>

施耐德触摸屏XBTGT5330之COM1或COM2口进行串口通讯得进

想利用XBTGT5330的COM口(com1或com2口)与第三方厂家的仪表进行串行通讯 该第三方的通讯协议符合modbus协议。其具体协议数据格式为: 开始符       指令代码          ...…

查看全部问答>

高人求救

请问A/D转换显示 S3C44BO 4路LCD显示曲线 屏幕显示三分钟 超过三分钟将右半屏移到左半屏 每秒采样60次,外接5V电压 请高手指点…

查看全部问答>

关于IAR Embeded 串行下载

我用的芯片是ADuC7026,开发工具为IAR Embeded 当我用RS-232下载程序时,能够成功。 也可在线调试,运行无误,但是拔下电源后,再插上电源程序没有保存在芯片中,反复试过很多次,都不成功。 希望各位高手能给指点一下。先谢谢了。 …

查看全部问答>

msp430c程序

最近得到一段这样的程序,请高手指点一下它的功能:加上注释就好了 interrupt [TIMERA0_VECTOR] void Timer_A(void) { float i,j; PidIntNo++; if(PidIntNo>25){PidEn=1;PidIntNo=0;} KeyLedIntNo++; if(KeyLedIntNo>10){KeyLedE ...…

查看全部问答>

关于P1011的DDR内存配置的问题

我使用的CPU :P1011 DDR3:H5TQ1G63BFR      两片共(256M byte)       MCS0片选 我想知道:CONFIG_SYS_DDR_CS0_BNDS 这个怎么配置呢、? 看了资料是这样说的:Starting address for chip select (ban ...…

查看全部问答>

求助

用msp430g2452怎么接受莫尔斯秘密,捕获比较怎么用啊?????求帮助啊~~~~有谁有相关的程序啊,可以参考参考啊~~…

查看全部问答>

请问am335x如何在CCS下debug Linux的内核?

本人使用的环境是vmware+ubuntu10.04+CCS5.1,starter kit直接通过网线和电脑相连, 请问在这种环境下,am335x如何 debug Linux的内核?具体步骤如何? 目前已经成功debug SPL和u-boot了,谢谢…

查看全部问答>

always的敏感信号是clk,描述语句中可以是“="的赋值语句吗?

[讨论] always的敏感信号是clk,描述语句中可以是“=\"的赋值语句吗?always, reg DE1的开发板有个LED灯控PWM IP核实验。在PWM核中,有个always的敏感信号是psedge CLK时,描述语句中的左边的寄存器被“=\"赋值成什么电路?而且该描述语句怎么 ...…

查看全部问答>

各位大侠,请问怎样在IAR中查看一段程序的执行步数?

请问怎样在IAR中查看一段程序的执行步数?我想根据执行的步数,算出子程序的执行时间长度。请各位大侠,多指点,麻烦详细点,多谢啦。…

查看全部问答>