共2条
1/1 1 跳转至页
MSP430F449,FRAM,SPI 请教MSP430F449与FRAM之间通过硬件SPI通讯的问题。
问
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
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 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |