这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » MSP430F449,FRAM,SPI 请教MSP430F449与FRAM之间通

共2条 1/1 1 跳转至

MSP430F449,FRAM,SPI 请教MSP430F449与FRAM之间通过硬件SPI通讯的问题。

院士
2006-09-17 18:14:16     打赏
MSP430F449,FRAM,SPI 请教MSP430F449与FRAM之间通过硬件SPI通讯的问题。



关键词: MSP430F449     请教     之间     通过     硬件     通讯    

院士
2006-12-22 22:43:00     打赏
2楼
FRAM用的是RAMTRON公司的FM25CL64。FM25CL64支持SPI模式0和模式3。用软件模拟SPI方式,发送和接收均无问题,说明449和FRAM之间的连线正常,且FRAM可正常读写。但是将449设为硬件SPI方式时,则写入和读出均不成功。

449SPI方式初始化程序如下:(主时钟为8M,二分频后为4M。用过ACLK以降低SCK频率,不成功。)
SetIO3 mov.b #0eh, &P3SEL
;set P3.1, P3.2 and P3.3 as USART. others as I/O
mov.b #0f1h, &P3DIR ;set p3.0, P3.4 to P3.7 as output
mov.b #0f0h, &P3OUT ;output 1 to P3.4 to P3.7
SetU0CTL bis.b #SWRST, &U0CTL ;reset USART, as master and SPI mode
bis.b #MM+SYNC+CHAR, &U0CTL ;use 8-bit data
bic.b #020h, &U0CTL ;set SPI mode
SetU0TCTL bic.b #CKPH+CKPL, &U0TCTL ;mode 0
bis.b #SSEL0+SSEL1+STC, &U0TCTL
;use SMCLK as source, 3-pin mode
SetUxBR mov.b #02h, &U0BR0
mov.b #00h, &U0BR1 ;set baud speed as SMCLK/2
SetU0MCTL clr.b &U0MCTL ;move 00h to U0MCTL0
bis.b #USPIE0, &ME1 ;enable SPI mode
bic.b #SWRST, &U0CTL ;release USART
bic.b #URXIFG0, &IFG1 ;clear recieve interrupt IFG
bic.b #UTXIFG0, &IFG1

FRAM程序如下:
beginwrt bic.b #10h, &P3OUT ;select first FRAM
nop
mov.b #06h, &U0TXBUF ;send write enable command to FRAM
call #waitint
bis.b #10h, &P3OUT ;change /CS to high level
nop
nop
bic.b #10h, &P3OUT ;turn /CS to low
nop
nop
mov.b #02h, &U0TXBUF ;send write command to FRAM
call #waitint
GoWrt mov.b wrtAddrH, &U0TXBUF ;send high address
call #waitint
mov.b wrtAddrL, &U0TXBUF ;send low address
call #waitint
mov.b WriteNum, &U0TXBUF ;write data to Fram
call #waitint
nop
nop
bis.b #10h, &P3OUT ;turn /CS to high
inc.b wrtAddrL ;inc address
inc.b WriteNum ;inc write number
cmp.b #0ffh, WriteNum
jlo beginwrt

FRAM的程序段如下:
bis.b #10h, &P3OUT ;turn /CS to high
mov.b #00h, wrtAddrL
mov.b #00h, WriteNum
ReadFRam bic.b #10h, &P3OUT ;turn /CS to low
nop
nop
mov.b #03h, &U0TXBUF ;send read command to FRAM
call #waitint
mov.b wrtAddrH, &U0TXBUF ;send high address
call #waitint
mov.b wrtAddrL, &U0TXBUF ;send low address
call #waitint
mov.b #00h, &U0TXBUF
call #waitint
mov.b &U0RXBUF, R6
nop
bis.b #10h, &P3OUT ;turn /CS to high
mov.b wrtAddrL, r5
mov.b r6, ReadArea(r5)
inc.b wrtAddrL
cmp.b #0ffh, wrtAddrL
jlo ReadFRam
;-----------------------------------------------
waitint
loop bit.b #UTXIFG0, &IFG1 ;test UTXIFG0
jz loop ;if UTXIFG0=0, wait
bic.b #UTXIFG0, &IFG1 ;clr UTXIFG0
ret

试着用软件模拟的方法写入,按硬件SPI方式读出,则U0RXBUF中始终为0。
怀疑两者的控制时序不兼容。RAMTRON的技术手册上倒是标明了时钟信号需在片选信号有效之后至少延迟10ns再出现,以及其他具体的时序要求。但未查到449的相应指标。照理两者都遵循SPI协议的话,应该不会有时序上的冲突的。

诸位大侠有无使用过硬件SPI接口或类似的外部RAM器件经验?望不吝赐教!多谢! 1: 是软件造成的时序不匹配问题。用示波器观察SCK,CS,SIMO和SOMI信号,发现两点:一是数据发送未结束,CS即跳高;二是时钟与数据同步出现。
原先程序中是根据TXIFG信号判断数据是否发送完毕。实际上TXIFG只表明数据已经从TXBUF中送出,此数据还得经过发送移位寄存器一位一位地送出。因此应判断UxTCTL中的TXEPT位来确定发送完毕后再拉高CS信号。
FRAM在时钟上升沿读取数据。因此449提供的同步时钟应延迟半个周期出现。

一点心得,仅供参考。:) 2: 谢谢! 3: 楼主,我在研究SPI模式与RF模块通信,有关SPI工作方式的资料是否可以提供小弟一些,这方面资料好少啊
xieguangyeyahoo.com.cn

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]