学海荡舟手机网

主页 > 实用文摘 > 教育文摘_07 > > 详细内容

TMS320F241型DSP的SPI口EEPROM扩展_DSP论文

 摘要:叙述了ti公司的tms320f241型dsp的串行外设接口(spi)扩展eeprom的软、硬件实现方法。
    关键词:dsp  spi  eeprom  x5043

    1.引言

    tms320f241型dsp是目前应用比较广泛的一款定点dsp,它具有20mips的指令执行速度,强大的内部事件管理器、i/o端口和其他外围设备。其中,串行外设接口(spi)是一个高速同步串行输入/输出(i/o)端口,它允许一个具有可编程长度(1到16位)的串行位流,以可编程的位传送速率从设备移入或移出。spi通常用于dsp控制器和外部器件或其它控制器间的通讯。

    在开发dsp系统时,某些情况下会读取或者存储一些定值,这时我们就需要扩展eeprom。具有spi接口的串行eeprom均可被tms320f241直接逻辑扩展,方便易行。x5043是xicor公司最高时钟速率为3.3mhz带有块锁保护的4kbits的cmos串行eeprom。该器件内部组织阵列是x8位,具有串行外围接口(spi)和软件协议的特点,允许在简单的四线总线上工作;该器件利用xicor专有的直接写入晶片提供最小为10万次擦写和最少100年的数据保存期。

    2.硬件设计

    x5043与tms320f241型dsp的连接关系如图1所示。dsp作为主控制器,工作于主模式下,spisimo为dsp的数据发送端,连接到x5043的数据接收端(si);spisomi为dsp的数据接收端,连接到x5043的数据发送端(so);spiste配置成i/o口连接到x5043的片选端(/cs);spiclk为spi数据传送的时钟信号,连接到x5043的串行时钟端(sck),串行时钟由dsp控制。dsp的数据在spisimo引脚上输出并从spisomi上锁存, dsp通过写入spidat寄存器的数据启动spiclk串行时钟信号从而启动数据传送,当8位串行位流传送完毕后,spiclk信号中止,传送结束。

    3.软件设计

    3.1工作模式的选择

    tms320f241的spi接口有可选择的四种不同的时钟模式,如何选择时钟模式是它与各种扩展spi接口器件实现时钟同步的关键。x5043的数据在时钟下降沿从so引脚上输出并在时钟上升沿从si引脚上锁存。读操作时,在其从si引脚输入的最低位地址所对应的时钟下降沿,其so引脚开始输出数据,如图5所示。

    作为主器件的dsp可以选择 ‘上升沿,无延时’和‘上升沿、有延时’两种时钟工作模式。‘上升沿,无延时’模式与x5043的工作模式一致,数据在spiclk信号的时钟上升边沿(从低电平到高电平)从移位寄存器移出在si引脚上锁存,在时钟下降边沿(从高电平到低电平)从so引脚上输出的数据锁存到移位寄存器中。‘上升沿,有延时’模式如图4所示,数据在spiclk信号上升沿前半个周期从移位寄存器移出,在紧接着的上升边沿在si引脚上锁存,在时钟下降边沿(从高电平到低电平)从so引脚上输出的数据锁存到移位寄存器中。

    3.2波特率的选择

    spi波特率可以由如下两种情况计算得出:

    (1)对于spibrr=3~127,波特率的计算公式为:

    spi波特率=clkout/(spibrr+1)

    (2)对于spibrr=0~2,波特率的计算公式为:

    spi波特率=clkout/4

    式中,clkout=器件的cpu时钟频率;spibrr=主spi器件中的spibrr内容。

    x5043最大的spi波特率为3.3mhz,若dsp的cpu时钟频率clkout=16mhz,则:
最大的spi波特率 =16×106/(spibrr+1)≤3.3×106hz
spibrr≥4+9

    3.3 dsp的数据传输格式

    dsp中spi有16位的发送和接收能力,且接收和发送均是双缓冲。所有数据寄存器都是16位宽的,而x5043的地址、数据寄存器均是8位的,将dsp中spi传输字符长度设置成8位宽。要向x5043存储数据时,dsp将一个8位字节长度的数据写入spidat或spitxbuf的高8位上如图2所示,在时钟信号的作用下,以左对齐方式发送,先发送数据的最高位。dsp接收一个8位字节长度的数据,是以右对齐方式接收如图3所示,8位字节长度的数据写入spidat或spirxbuf 的低8位上。

    3.4各控制寄存器设置

ldp   #spiccr>>7
splk  #0007h,spiccr
;复位spi, 8个字符长度
splk  #000eh,spictl
;主模式,使能talk,禁止spi的中断
;上升沿发送,下降沿接收,有延时
splk  #000fh,spibrr
;设置spi的传输波特率
splk  #0087h,spiccr
;spi准备好发送或接收下一字符
3.5程序设计
ram块中的变量定义:
.bss  spi_xdata,1
;spi数据传输暂存器
.bss  address1,1
;eeprom存储器地址暂存器
.bss  data1,1
;eeprom存储器数据暂存器

x5043存储器地址:
wren       .set  0600h
;设置写使能锁存指令地址
wrdi       .set  0400h
;复位写使能锁存指令地址
rsdr       .set  0500h
;读状态寄存器指令地址
wrsr       .set  0100h
;写状态寄存器指令地址
readh      .set  0b00h
readl      .set  0300h
;读存储器阵列数据指令地址
writeh     .set  0a00h
writel     .set  0200h
;写存储器阵列数据指令地址

3.5.1 dsp的spi数据发送、接收子程序代码
xmit_value:
ldp   #0
  lacc  spi_xdata
  ldp   #spitxbuf>>7
  sacl  spitxbuf
;写需发送的值到spi传输缓冲器
xmit_rdy:
  ldp   #spists>>7
  bit   spists,bit6
  bcnd  xmit_rdy,ntc
;测试spi_int位,如果spi_int=0,则重复循环
;等待数据发送完毕进行下一步操作
 ldp   #spirxbuf>>7
  lacl  spirxbuf
;读取数据清除spi_int标志位
 ldp #0
 sacl  spi_xdata
;将接收的值存入数据传输暂存器
ret

3.5.2 x5043内部非易失性写判断子程序代码
rsdr_wip:
spiste_low
;置低spiste引脚,从而选通x5043
ldp  #0
splk #rsdr,spi_xdata
call xmit_value
;写读状态寄存器地址,高8位
spiste_high
;置高spiste引脚,禁止x5043
ldp   #0
bit  spi_xdata,bit0
bcnd rsdr_wip,tc
;测试状态寄存器wip位。如果wip=1,正在进行内部写操作。
;等待内部写操作完成进行下一步操作
ret

    使用上述判断子程序能够保证x5043完成内部写操作。向x5043存储器阵列写入数据时后面将跟随一次非易失性写操作。可以读状态寄存器检查wip位,若wip为高则非易失性写正在进行。x5043存储器非易失性写周期为10ms,也可以在一个写操作完成后作一个大于10ms的延时,以保证x5043完成内部写操作。

    3.5.3向x5043 eeprom存储器阵列中写数据

    如图4所示,向eeprom存储器阵列写入任何数据之前,必须用wren指令设置wel位。首先将cs拉低,向器件输入wren指令,然后拉高/cs。再次拉低/cs并输入write指令,紧跟随8位地址,然后是要写入的数据。write指令的位3是地址位a8,该位选择阵列的高半部分或是低半部分。如果/cs在wren和write之间不变为高,则write指令将被忽略。为了完成写操作,在最后一个被写入的数据字节的位0完成后/cs必须被拉高。如果它在任何其它时间被拉高,写操作将不完成。

写1个字节数据的程序代码如下:
write:
     kick_dog
     call rsdr_wip
     ;读状态寄存器检查wip位
     ;写wren指令代码段
     spiste_low
;置低spiste引脚,从而选通x5043
     ldp   #0
     splk  #wren,spi_xdata
     call xmit_value
     spiste_high
;置高spiste引脚,禁止x5043
     call rsdr_wip
     ;读状态寄存器检查wip位
     ;写write指令/地址/数据代码段
     spiste_low
;置低spiste引脚,从而选通x5043
     ldp   #0
     splk  #writel(h),spi_xdata
     call xmit_value
   ;输入寄存器指令
     ldp   #0
     lacl  address1
     sacl  spi_xdata
     call  xmit_value
     ;输入寄存器地址
     ldp   #0
     lacl  data1
     sacl  spi_xdata
     call  xmit_value
     ;输入寄存器数据
     spiste_high
     ;置高spiste引脚,禁止x5043
     call  rsdr_wip
     ;读状态寄存器检查wip位,x5043完成内部非易失性写
     ret

    3.5.4从x5043 eeprom中读取数据

如图5所示,/cs只要拉低选中器件。8位read指令送到器件,后面跟随8位地址,就可以读取指定地址下的eeprom存储器阵列中的数据。read指令的位3选择器件的高半部分或是低半部分。在read指令码和地址送出后,在选定地址的存储在存储器中的数据即在so线上移出。读操作由拉高/cs而终止。
读1个字节数据的程序代码如下:
  read:
 kick_dog
 call  rsdr_wip
    ;读状态寄存器检查wip位
    spiste_low
;置低spiste引脚,从而选通x5043
    ldp   #0
    splk  #readl(h),spi_xdata
    call xmit_value
    ;输入寄存器指令
    ldp   #0
    lacl  address1
    sacl  spi_xdata
    call  xmit_value
   ;输入寄存器地址
    ldp   #0
    lacl  data1
    sacl  spi_xdata
    call  xmit_value
    ;此data1无意义,使spi口连续提供时钟信号,使数据输出
    ;输出的数据存储在spi_xdata中
    spiste_high
    ;置高spiste引脚,禁止x5043
    ret

    由于x5043是一个半双工器件,在write子程序中从spirxbuf中读出来的数据是无效的,同时,在read子程序中写向spitxbuf的data1数据也是无效的,只起启动发送时钟的作用。

    4.结束语

    dsp可以连续的向eeprom中写入多至16个字节的数据。唯一的限制是16个字节必须在同一页中。一页地址由[x xxxx 0000]开始,由[x xxxx 1111]结束。如果字节地址达到了页中的最后字节而时钟仍在继续,则计数器将返转至该页的第一个地址并重写前面已写过的数据。在连续地提供时钟脉冲的条件下储存在存储器地址处的数据可被连续地读出。在每个数据字节被移出后,器件即自动将地址增加至下一个更高的地址。当达到最高的地址时,地址计数器即翻转到地址00h,使读周期无限制地连续下去。上面只给出了x5043单个字节的读写程序代码,对于多个字节或一页16个字节的读写程序代码可根据单个字节的读写程序代码进行扩展给出。