微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > DSP虚拟I2C总线软件包的设计

DSP虚拟I2C总线软件包的设计

时间:05-28 来源:3721RD 点击:

相关功能简介

X1203是带时钟/日历电路和两个闹钟(报警)的低功耗CMOS实时时钟芯片。提供了双埠时钟和报警寄存器,在读写操作期间也能精确工作。其工作电压从2.5~6 V均可,工作电流小于1uA。时钟使用低成本的32.768 kHz晶体输入,以秒、分、时、日、星期、月和年为单位记录时间,具有闰年自动矫正功能,并对少于31天的月份自动调整;可通过设置中断标志按指定时间激活中断引脚,满足大多数用户对定时器编程的需要。该芯片引脚结构如图1所示(SOIC封装)。

其中SCL为时钟输入端,数据随该时钟信号同步输入器件或从器件输出。此引脚上的输入缓冲器始终激活。SDA端为双向引脚,用于串行数据的输入输出;具有漏极开路,可与其它漏极开路或集电极开路输出进行线"或";需上拉电阻,与SCL引脚配合,可实现400 kHz的2线I2C接口。VBack为备用电源输入端,用于VCC出现故障时向器件供电。是中断信号输出端,可通过设置报警寄存器按指定时间在该端产生报警信号;漏极开路,低电平有效。X1、X2分别为反相放大器的输入、输出端;可在X1端接入32.768 kHz的方波基准,或在X1、X2端接入32.768 kHz的石英晶振,配置成片内振荡器,在初始上电后至少有一个字节写入RTC寄存器时,时钟才开始计数。

X1203中的时钟/控制寄存器(CCR)分5部分:2个8字节报警寄存器(Alarm0、Alarm1),1个1字节控制寄存器,1个8字节实时时钟寄存器和1个1字节状态寄存器。通过报警寄存器可设置报警发生的时间,控制寄存器可使能或禁止报警中断信号的输出,实时时钟寄存器以BCD码存储了秒、分、时、日、星期、月和年,状态寄存器中保存了用于报警状态标志位及读写使能状态位。其中状态寄存器设置决定着数据是否能成功地写入。该寄存器如表1所列。

BAT标识器件当前用VBack还是用VCC工作。AL1、AL0标识Alarm0、Alarm1是否实时时钟匹配。RTCF表示实时时钟是否失效,在总电源失效后该位置1。RWEL为寄存器写使能锁存,为0表示禁止,在任何写时钟/控制寄存器之前必须将该位置1。WEL为写使能锁存,低表示禁止,通过该位写1、其它位写0,可使该位置位;通过该位写0、其它位写0,可使该位清0。只有按规定顺序设置RWEL和WEL,才能成功写入CCR。

目前,很多DSP芯片尚不直接支持I2C的接口,F206也不例外,因而这里采用2根通用I/O口线模拟I2C接口。F206与X1203的接口采用如图2所示的接口方案。

图2中在X1、X2端接入32.768 kHz的石英晶振,将时钟源配置为片内振荡器。在VCC和VBACK之间通过二极管和电阻相连,并与地间加入1个0.47 F的大电容。这样,在电源出现故障或系统电源关闭时,仍可靠VBACK端的大电容供电维持时钟芯片的正常工作。它与F206间接口采用3根口线,这里采用IO2模拟通信用的时钟信号,IO3作为数据输入、输出口线。端可根据用户需要而定,若需要时钟芯片产生中断,可将该端接到F206的中断口线上。注意其中的SDA端和端为漏极开路,必须加上拉电阻,否则不能正常通信。

3.2 X1203的读写操作

这里仅给出F206对X1203进行读写的基本流程,如图3、图4所示,分别为对时钟芯片的读、写过程。其中进行寄存器写时,须注意SR寄存器中WEL和RWEL的设置是否正确,即首先设置WEL有效,而后将WEL、RWEL都置1,否则数据将不能正确写入。在写结束后,应将WEL、RWEL置为无效,以免产生误操作。

此外还须指出,在系统首次上电后(VBack和VCC都失效后),至少有一字节写入RTC寄存器时,系统才开始工作。在实际使用中,应首先判断SR中的RTCF位是否为1,若是,表明系统为首次使用或VBack和VCC都已失效,须对X1203至少进行一次写入操作,使其正常计数。

时钟芯片读写子程序清单如下:

.copy "init.h"
.copy "vector.h"

;以下为I2C软件包中的符号定义

VSDA .set 0008h
VSCL .set 0004h
RAM0 .set 60h
SLA .set 61h
RIO .set 62h
NUMBYTE .set 63h
MTD .set 0100h
MRD .set 0120h
setc intm ;关中断
clrc cnf ;映射块 B0 到数据存储区
ldp #0h ;页指针设置为0
clrc sxm
;数据写入使能程序段
splk #0deh,SLA
splk #3,NUMBYTE
lar ar0,#MTD
mar *,ar0
splk #0,*+
splk #03fh,*+
splk #02h,*+
call wrnbyte
splk #0deh,SLA
splk #3,NUMBYTE
lar ar0,#MTD
mar *,ar0
splk #0,*+
splk #03fh,*+
splk #06h,*+
call wrnbyte
;写入数据程序段
splk #0deh,SLA
splk #9,NUMBYTE
lar ar0,#MTD
mar *,ar0
splk #0,*+
splk #030h,*+
splk #01h,*+
splk #02h,*+
splk #03h,*+
splk #03h,*+
splk #02h,*+
splk #01h,*+
splk #21h,*+
call wrnbyte
;禁止数据写入程序段
splk #0deh,SLA
splk #3,NUMBYTE
lar ar0,#MTD
mar *,ar0
splk #0,*+
splk #03fh,*+
splk #0h,*+
call wrnbyte
;数据读取程序段
splk #0deh,SLA
splk #2,NUMBYTE
lar ar0,#MTD
mar *,ar0
splk #0,*+
splk #030h,*+
call wrnbyte
splk #0dfh,SLA
splk #7,NUMBYTE
call rdnbyte
wait: b wait

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top