打印

关于AT89C51对AT45DB161B的读写,期盼热心人!

[复制链接]
3226|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
TLWXB|  楼主 | 2007-3-11 18:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



下面是我从网络上搜索整理出来的,但实现不了。

这也许在别人眼里很简单,但我实在是菜,小城市,可供查找的资料
实在有限,网络中搜到的内容也就那么多,只盼在这碰到热心人!把这些语句修改一下看能不能用。


AT45DB161B内的内容我是用编程器写进去的。

;AT89C51对AT45DB161B进行读操作,12M晶振      

ORG     0000H      ;程序执行开始地址
             LJMP MAIN  ;跳至START执行

MAIN:

SPI_SI   bit  P1.0      ;定义1脚为数据输入脚
SPI_CK  bit  p1.1      ;定义2脚为时钟脚
SPI_SO   bit    P1.2    ;定义3脚为数据输出脚
SPI_CS   bit      P1.3

GREEN   bit   P3.4    ;控制绿灯
   red   bit   P3.3   ;控制红灯


;以下语句希望能把AT45DB161B的102030地址中的数值读出来,
;如果该值等于55H则点亮绿灯,否则点亮红灯

MOV   R0,#52H    
LCALL   SPIOUT       ;写入52H这一命令字
MOV     R0,#10H  
LCALL    SPIOUT      ;写入高位地址10H
MOV     R0,#20H  
LCALL    SPIOUT     ;写入中位地址20H
MOV    R0,#30H  
LCALL     SPIOUT     ;写入低位地址30H
MOV  R0,#0FFH    
LCALL   SPIOUT      ;加载8位任意字节0FFH
MOV  R0,#0FFH    
LCALL   SPIOUT      ;加载8位任意字节0FFH
MOV  R0,#0FFH   
LCALL   SPIOUT      ;加载8位任意字节0FFH
MOV  R0,#0FFH     
LCALL   SPIOUT      ;加载8位任意字节0FFH
LCALL SPIIN  ;调读一字节子程序
SETB SPI_CS

CJNE A,#55,ERR
CLR GREEN
AJMP $
ERR:   CLR  RED
AJMP $


;将MCS51寄存器R0中的数据传送至SPI_SI线上
SPIOUT:
CLR   SPI_CS
SETB SPI_CK   ;使P1.1(时钟)输出为1

MOV R1, #08H ;置循环次数
MOV A, R0            ;8位数据送入累加器ACC
SPIOUT1:
CLR SPI_CK  ;使P1.1(时钟)输出为0
NOP                ;延时
NOP                 ;延时
RLC A               ;左移累加器ACC最高位至C
MOV SPI_SI, C         ;进位C送SPI_SI线上
SETB SPI_CK             ;使P1.1(时钟)输出为1
NOP ;留点写入所需的时间
NOP
DJNZ R1, SPIOUT1     ;是8次吗?
RET

        
;从SPI_SO线上接收8位数据并放入寄存器R0中
SPIIN: SETB SPI_CK     ;使P1.1(时钟)输出为1
MOV R1, #08H         ;置循环次数
SPIIN1:   CLR SPI_CK            ;使P1.1(时钟)输出为0
NOP ;延时
NOP ;延时
MOV C, SPI_SO    ;AT45BD161B输出SPI_SO送进位C
RLC A                  ;左移至累加器ACC
SETB SPI_CK      ;使P1.0输出为1

DJNZ R1, SPIIN1      ;是8次吗?

MOV R0, A             ;8位送入R0
RET


END
 

相关帖子

沙发
TLWXB|  楼主 | 2007-3-12 13:06 | 只看该作者

谢谢CHUANDAOXY

非常感谢 CHUANDAOXY ,先消化一下,不懂之处还望指教。也请其他朋友多多指教。

使用特权

评论回复
板凳
TLWXB|  楼主 | 2007-3-19 13:25 | 只看该作者

再求助关于AT45DB161B的24位地址的问题

仔细看完,参考后修改我的程序,已能读出个别位置的数据。但有个问题还想请教一下CHUANDAOXY和其他朋友,就是关于24位地址的问题,这方面的内容从DATASHEET里看来看去却总是不开窍。

1:)我这样理解:以AT45DB161B来说,先只讨论读任意字节命令(E8H)
参考CHUANDAOXY的例子,FLAADD0所表示的2位保留位加高6位页地址共8位的取值范围从00000000~00111111,,共可表示512“块”,且每“块”有8页,所以同一“块”内的每一页的FLADDD0的值是相同的,例如,第1~8页的FLLADD0=00H最后8页的FLAADD0=3FH,这样理解对吗?

2:)FLAADD1所表示的低6位页地址我这样理解:前3位的值由处于哪一“块”来决定,例如,处于最后一“块”则其值位111,倒数第二“块”其值则为110,后3位由处于“块”内的哪一页决定,例如“块”内第一页,则其值为000,最后一页则值为111,3位数刚好可以有8种可能,可以表示8页,这样理解对吗?那高2位字节地址的值由谁(那个值)来决定,取值范围是多少?

3:)FLAADD2所代表的低八位地址取值为00~FF,对吗?

4:)512字节为1页,那么任何一页的字节地址都是00~1FF,对吗?

5:)我试过在FLAADD0=00H,FLAADD1=00H,FLAADD2=00H和FLAADD0=00H,FLAADD1=02H,FLAADD2=00H时能把数据正确读出,
但在FLAADD0=00H,FLAADD1=02H,FLAADD2=10H和FLAADD0=3FH,FLAADD1=0FFH,FLAADD2=0FFH时就出错,什么原因?

最后,大家可不可以帮我算一下050505H,102030H,20FFFFH这三个地址值所对应的FLAADD0,FLAADD1,FLAADD2的值分别是多少?如何算出来的?

使用特权

评论回复
地板
TLWXB|  楼主 | 2007-3-19 13:26 | 只看该作者

DATAASHEET1

DATA1

使用特权

评论回复
5
TLWXB|  楼主 | 2007-3-19 13:28 | 只看该作者

DATAASHEET2

DATASHEET2

使用特权

评论回复
6
TLWXB|  楼主 | 2007-3-22 21:39 | 只看该作者

扛一下

扛一下

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝