新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > I2C总线实现TMS320VC5509A引导装载设计

I2C总线实现TMS320VC5509A引导装载设计

——
作者: 时间:2007-01-26 来源:《现代电子技术》 收藏

1 引言

dsp芯片的bootloader程序用于上电时将用户程序从外部非易失性、慢速存储器或外部控制器中装载到片内高速ram中,保证用户程序在dsp内部高速运行,ti公司的c55x系列dsp芯片提供多种装载模式,主要包括hpi引导装载、串行e2rom引导装载、并行引导装载、串行口引导装载、i2c总线e2rom引导装载等,通常使用的是并行引导装载模式,该方式引导速度快实现简单,但是体积和功耗也较大,随着串行接口存储设备容量的提高,串行引导方式体积小、功耗低的优势便显现出来了,所以使用arm的串行接口对dsp进行引导装载,不仅能省去存储芯片,而且利用arm的isp功能,可以根据需要改变用户程序,有利于系统的维护和升级。

本文以tms320vc5509a芯片引导装载为例,详细介绍了利用arm通过i2c串行引导方式来实现程序的引导装载,其他引导过程可参考相关技术资料[1]。

tms320vc5509a是ti公司一款16位定点低功耗dsp芯片,其指令周期最快为5ns,片内拥有128×16k高速ram,性价比很高,被广泛用于嵌入式手持设备、通信、数据采集等领域。

ti公司的dsp芯片出厂时,在片内rom中固化有引导装载程序(bootloader),其主要功能就是将外部的程序装载到片内ram中运行,以提高系统的运行速度,c55x系列dsp其bootloader程序位于片内rom空间的0xff0000-0xff8000处,进入bootloader程序后,程序先对dsp进行初始化,配置dsp的堆栈寄存器、中断寄存器和dsp状态寄存器,保证在引导装载用户程序时不会被中断,从而引导程序加载失败。

由于dsp可以通过自举表对寄存器进行修改,需要注意在bootloader程序运行时,尽量不要修改bootloader程序配置过的中断控制寄存器,否则会导致不可预料的后果。

2.1 i2c引导模式硬件连接

为了通过i2c总线来实现对dsp引导装载,通常情况是选择具有i2c总线接口的e2rom,电路框图如图1所示,其中gpio0-gpio3是用来选择bootloader引导模式,当dsp复位后对这4个管脚电平采样,根据不同的组合进入到对应的bootloader程序,表1列出了gpio0-gpio3的管脚不同状态的组合以及对应的bootloader引导方式。sdl和sda分别为i2c的时钟和数据线,其上拉电阻的大小取决于所连接i2c设备的多少[2]。

本文引用地址:https://www.eepw.com.cn/article/21541.htm

如果通过i2c总线对dsp实现引导装载,对存储数据的i2c设备有如果几点要求:

(1)该设备首先必须兼容philips的i2c总线规范v2.1,工作在从设备模式,并且其从设备地址为0x50。

(2)设备内部使用两个字节寻址,即在接收到主机写命令后,其后接收到的数据是16位的地址数据。

(3)对设备读取时,相关设备必须支持自动寻址增量,即每读一次,其内部地址指针自增1,保证程序按顺序读出。

常用的i2c接口e2rom有st公司的m24系列及philips的pcf85系列的e2rom,根据程序大小选择相应的芯片,需要注意的是i2c引导模式最多支持64kb的数据。

在i2c引导模式运行时,dsp作为主设备来控制i2c总线的时钟,对于dsp来说,scl必须满足根据方程(1)所得到的速率,而i2c引导模式支持的最高时钟速率为400khz,所以如果想利用i2c引导模式,dsp上电时输入时钟就不能大于12mhz。

scl(高)=scl(低)
=15×(dsp输入时钟周期) (1)

2.2 i2c引导模式数据存储方式

为了能正确地将数据从外部存储器搬移至dsp内部,用户程序需要将数据按照一定格式存储在e2rom中,按照这些格式存储的数据便是自举表(boot table),自举表是bootloader程序能正常运行的保证,只有将数据按照自举表的要求存储,用户程序才能被搬移到dsp内部正常运行,在自举表中除了用户数据外还需要一些bootloader控制数据,如程序入口地址(entry point address)、寄存器配置(register configurations)和可编程延迟(programmable delay)等,自举表的结构如图2所示。

其中程序入口地址在将用户程序搬移至dsp内部后,用户程序从该地址处开始运行,通常情况是中断向量表的reset处,在bootloader搬移数据之前,如果需要可以改变某些寄存器的值,如dsp的clock配置寄存器、emif配置等,通过自举表配置这些寄存器后,需要一定时间才能正常工作,否则会导致引导程序失败。延迟计数器是让bootloader推迟相应的cpu周期再进行数据搬移,确保引导程序正常工作,由于dsp是采用分段格式来组织数据的,如代码段、数据段和用户自定义数据段等,所以生成的自举表也是按照对应格式来建立的分段存储,这样有利于程序维护,实现模块化设计。

在自举表的最后,是连续的4个字节的全零数据,其目的是为了告诉dsp程序引导完成,可以传至程序入口执行,同时dsp也发出指示给外部存储设备告知引导结束,在i2c模式中,作为主机接收设备的dsp信号将会在接收到结束标志后在数据总线上给出停止标志,用来结束数据传输。

要建立自举表,可以利用ti提供的hex转换程序(hex55.exe),将生成的连接文件转换成用于存储器的数据格式[1]。首先,需要建立一个cmd(链接命令文件linker command file)文件,输入需要的链接选项,hex55利用该文件提供的各种选项来转换文件,下面是一个为i2c引导方式建立的cmd文件和其选项以及具体含义:

通常情况下还需定义采用某种方式如-serial8、-parallel16等选项,表示采用何种boot方式从而生成对应的存储格式,由于采用了i2c模式来引导,所以这些选项可以不使用,另外还可以使用-reg_config和-delay选项,分别来设置需要改变的寄存器值以及需要延迟的cpu周期数,最后需要注意的是hex55程序要使用v2.1及后续版本,早期版本生成的自举表不能正确引导程序。

3 arm端设计

上面介绍了利用i2c接口的e2rom来实现引导装载的硬件连接和需要的数据存储形式,实际利用arm自身的i2c控制器,将自举表存储在arm的flash中,并且让arm按照i2c引导模式中e2rom的时序向dsp发送对应的数据,实现对dsp的引导装载,所选用的arm是philips的lpc2138。lpc2813是基于32b arm7的内核,内部拥有多达512k的高速flash和32k的静态ram,其工作频率可达60mhz,其i2c总线控制器支持i2c所有工作模式,这些在用于引导dsp时就不用使用端口来模拟i2c时序,使用十分方便,引导dsp时,只要arm按照对应的顺序来发送数据,就能实现dsp的程序引导,使用arm引导时,只需将图1中的scl和sda分别与arm的scl和sda连接即可。

bootloader使用i2c读取数据时其时序如图2所示。引导开始后,dsp首先会使用随机读取指令(random read command)从0x0000地址处读取数据,该读取指令由一个虚假的写指令和当前地址读取指令(current address read command)组成,arm正确响应该指令后,dsp便继续采用当前地址读取指令读取剩余数据。

在lpc2138中,i2c总线有专门的控制器,并且每次接收到数据后对应的i2c状态寄存器会以不同的代码来表示当前i2c总线状态,用户可以根据不同的状态来进行下一步的操作[3],整个引导过程就是arm根据不同的总线状态来发送或接收相应的数据,使用arm引导dsp程序加载时,arm作为从设备工作,在两种工作模式之间切换,分别为从设备接收(slave receiver和从设备传输(slave transmitter)。

下面介绍arm端程序的运行状况,程序中首先通过i2c地址寄存器(i2addr)将arm的从设备地址置为0x50,再利用i2c置位控制寄存器(i2conset)将其中的i2en和aa置1,这样arm就工作在从设备模式,一旦i2c总线接收到有效数据,程序就进入到中断服务程序中运行,用户程序根据i2c状态寄存器(i2stat)的值判断当前状态从而进入下一步操作,图3为中断服务程序工作流程。

图3中state代表接收到数据后,i2c状态寄存器中的值,不同的值代表总线上可能出现的各种状态。0xa0代表程序收到的是start或是stop标志,返回主程序继续等待中断,0x60代表接收到自己的从设备地址和写命令,并返回ack信号,count1代表收到的写命令次数,由于整个引导过程中只能接收到一次写命令,所以只要count大于1则接收出错,需要重新启动引导程序,利用arm控制dsp的复位信号重新开始引导过程,直至成功引导,0x80表示arm进入了从设备接收数据状态,并且前边已经收到了本机的设备地址,此次接收到了数据并返回ack信号,i2dat在从设备接收模式时存储接收到的数据,发送模式时存储待传输的数据,引导开始后,连续两次接收的数据应该为0,若并不为0,表示引导程序出错,需要复位dsp重新开始接收。



count为连续两次接收数据0的计数器,一旦满足条件,将发送缓冲区的首地址取出存储在trans_addr中,0xa8代表接收到当前地址读取命令,一旦接收到此命令,将待发送数据取出送入发送数据寄存器i2dat,以便下一次传输时将数据送出,0xc0表示数据发送成功,而且没有收到ack信号,意味着当前地址读取命令结束,此时将发送缓冲区地址加1,取出下一次待发送数据地址,这样便完成了1个字节数据的发送,整个引导过程一直到dsp收到自举表结束标志后停止,需要注意的是,i2c中断标志位需要通过软件清除,每次中断返回时都必须用i2c清零控制寄存器(i2conclr)手动清除i2c控制寄存器中的中断标志。

按照上述方法就完成了i2c引导装载模式,用户可以在程序中加入测试程序,通过控制gpio高低变化生成脉冲,利用示波器观察从而判断程序引导是否成功。

4 结语

本文提出的引导方式已经成功地应用于一款低功耗、小型户数传设备当中,免去了对外部存储器的编程,特别有利于设备的升级和维护。



关键词:

评论


相关推荐

技术专区

关闭