TMS320F241型DSP的SPI口EEPROM扩展
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必须被拉高。如果它在任何其它时间被拉高,写操作将不完成。
javascript:window.open(this.src);" style="cursor:pointer;"/>
写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中读取数据
javascript:window.open(this.src);" style="cursor:pointer;"/>
如图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个字节的读写程序代码可根据单个字节的读写程序代码进行扩展给出。