引言

数字信号处理器DSP)在各领域中的应用已日趋广泛,其中 TI(Texas Instrument)公司的 TMS320 系列芯片占据了主导地位。TMS320F206(简称 F206)由于具有片内 32K 字的 Flash,支持 JTAG 扫描端口的仿真调试,并支持程序的串行下载,便于开发设计及产品的软件升级,因而在中高档仪器开发中受到青睐。


DSP 的处理速度虽然较高,但直接支持的 I/O 口线较少,控制能力相对较弱,因而与外部器件接口采用串行方式较为适合。常用的串行接口和串行总线有 UART、I2C 总线,由于 I2C 总线提供了较完善的总线协议,且接口电路简单,因而得到广泛的应用。目前,已有很多外围器件支持 I2C 接口,但多数 MCU 并不直接支持 I2C 总线,因而采用 I/O 口线模拟 I2C 的方式成为一种通用解决方案。但由于 I2C 总线协议的复杂性及操作管理的特殊性,仍给此类方式的开发造成了较大不便。好在文献中提出了一种按平台模式设计的、适用于 80C51 的虚拟 I2C 总线软件包,大大简化了 80C51 的 I2C 接口程序设计,使用户无需了解 I2C 总线协议的细节,即可实现相应的接口。文献中也给出了一种用于 MSP430 单片机的软件包。由于 DSP 尚无此类软件包,为简化 DSP 的此类 I2C 接口程序设计,本文参照文献中的设计原则,设计了一种适用于 TMS320C2XX 系列 DSP 开发的软件包。

 

1 虚拟 I2C 软件包的设计

根据文献中所提到的最佳包容性设计、后归一化设计、前归一化设计原则,软件包进行了如下定义。

 

(1)适用范围

 

① 适用主发送和主接收方式。I2C 总线有 4 种工作方式:主发送、主接收、从发送、从接收。因实际 DSP 多工作于 I2C 总线的主方式,因而软件包设计为主方式。

 

② 适用 TMS320C2XX 系列与 I2C 总线外围器件的接口,支持对外围器件 N 字节的读写,通信方式为对虚拟节点寻址后点对点的读写。

③ 模拟 I/O 口线可选择 4 根通用 I/O 口线(I/O0~ I/O4)中的任意两根。

 

(2)软件包结构设计

 

TMS320C2XX 系列产品,基本包括 4 根通用 I/O 口线 I/O0~I/O4(由于 XF 仅能作为输入口线,BIO 仅能作为输出口线,因而暂不考虑)。它们的输入输出方向由 ASPCR 的低 4 位来设定,相应口线状态的设定或读取由 IOSR 寄存器控制。但此处 DSP 与 80C51 有所不同,口线的输入输出状态不是自动切换的,且 ASPCR、IOSR 寄存器都不支持位寻址方式,因而在进行 I2C 总线工作方式模拟时较为繁琐。为避免所用寄存器其它状态位的改变,需通过较多的与、或操作来改变指定 I/O 口线的状态,因而本软件包与 80C51 的虚拟 I2C 软件包结构稍有不同。当然,这些均在软件包内部完成,使用者不必了解具体细节,用户接口同样简单易用。

 

① 软件包组成。为模拟 I2C 总线的操作时序,软件包中包括了 2 个宏定义和 12 个子函数。

 

(a)时序模拟子程序

 

Sendb-- 发送起始标志,启动 I2C 总线;senda-- 发送确认标志;

 

Sendna-- 发送非确认标志;Sende-- 发送结束标志。

 

(b)操作模拟子程序

 

geta-- 接收确认标志;sendd-- 发送 8 位数据;

 

getd-- 接收 1 个字节数据。

 

(c)数据读写子程序

 

wrnbyte-- 写入 N 字节;rdnbyte-- 读取 N 字节。

 

(d)其它宏及子函数

 

subsendd-- 根据标志位 C 设置模拟数据口线的状态;toggleclk-- 切换模拟时钟口线状态;

 

Xdelay-- 延时子程序;Sdainm-- 将模拟数据口线 A 配置为输入口线;

 

sdaoutm-- 将模拟数据口线配置为输出。

 

因 DSP 的工作频率一般远高于 I2C 总线的操作频率,因而这里需专用的延时子程序降低模拟时钟口线频率。本文所给出的源程序为 F206 采用 40 MHz 晶振时的情况,用户使用时可随实际情况调整延时时间。

 

② 软件包符号定义。软件包中包括如下符号定义:

 

VSDA、VSCL-- 分别定义了模拟数据口线和模拟时钟口线对应的屏蔽位,因 DSP 中对通用 I/O 口线的操作不能通过位操作来实现,因而仅能屏蔽位来定义,如采用 IO3 模拟数据线、IO2 模拟时钟线,则可定义 IO3 为 08h、IO2 为 04h;

 

RAM0-- 为数据暂存用的临时存储单元;

 

RIO-- 为用于保存 I/O 口线当前状态的存储单元;

 

SLA-- 用于保存总线上节点地址并确定传输方向的存储单元;

 

NUMBYTE-- 待发送或接收的字节数存储单元;

 

MTD-- 发送数据缓冲区;

 

MRD-- 接收数据缓冲区。

 

以上符号中 RAM0、RIO、SLA、NUMBYTE 为页内地址,与当前的页指针 DP 内容设置有关;MTD、MRD 为绝对地址,与 DP 内容无关。

 

③ 资源占用。使用了辅助寄存器 AR0、AR1、AR2、AR6、ACC、ASPCR、IOSR 等资源。

 

④ 应用接口。软件包将 wrnbyte、rdnbyte 作为唯一的出口接口,用户仅需正确设置对应储存单元的内容,调用相应子函数即可:

 

splk #SLAR/ SLAW,SLA;写入传输节点地址及传输方向

 

splk #N,NUMBYTE ;写入待传输字节数

 

;若输出,设置输出缓冲区内容

 

call wrnbyte/rdnbyte

 

3 应用实例

3.1 器件相关功能简介

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 至少进行一次写入操作,使其正常计数。
 

 

 

结束语

I2C 总线应用已日益广泛,而其协议的复杂性和操作的特殊性又限制了推广速度。本文介绍的一种基于 DSP 的虚拟 I2C 总线软件包,简化了 TMS320C2XX 与 I2C 器件间接口程序设计,用户无需了解 I2C 总线协议的细节,仅需通过唯一的接口界面 wrnbyte/ rdnbyte 即可实现相应的接口。本文还给出了一个 TMS320F206 与时钟芯片 X1203 间的接口实例,介绍了软件包的使用方法,希望能供读者参考。