登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

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

作者:TLWXB 栏目:单片机
关于AT89C51AT45DB161B的读写,期盼热心人!



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

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


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

;AT89C51AT45DB161B进行读操作,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   ;控制红灯


;以下语句希望能把AT45DB161B102030地址中的数值读出来,
;如果该值等于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



2楼: >>参与讨论
CHUANDAOXY
由网友推荐仅供参考
stack            data 0e0h        ;定义堆栈初始地址
addprot        data p0            ;本机地址设定端口(p0.0~p0.3)
localadd        data 22h        ;存放本机地址字节
tim_reg2    data 24h        ;存放比较时间
tim_reg        data 23h        ;记录周期寄存器
data_buf        data 40h        ;内部ram起始地址
cmd_tmp        data 30h        ;FLASH命令寄存器
flaadd0        data 31h        ;FLASH地址寄存器最高位
flaadd1        data 32h        ;FLASH地址寄存器中位
flaadd2        data 33h        ;FLASH地址寄存器最低位
sav_tim        data 34h        ;FLASH每页的存储次数
dog        data 31h        ;看门狗计数器地址
wdrtrst        data 0a6h        ;看门狗计数器
addbuf0        data 38h        ;FLASH地址缓存
addbuf1        data 39h        ;FLASH地址缓存
addbuf2        data 3ah        ;FLASH地址缓存


ser_fla        bit 20h.1            ;串口数据标志位
serr_fla    bit 20h.2            ;串口通讯错误标志位
scl                 bit  p1.0        ;I2C时钟线
sda                bit  p1.1        ;I2C数据线
sela4052        bit  p1.2        ;U2(4052)选择位A
selb4052        bit  p1.3        ;U2(4052)选择位B
led                bit  p1.4        ;发光二极管控制位
ea485            bit  p1.5        ;U3(MAX485)允许位
ea4852            bit  p1.6        ;U10(MAX485)允许位
rb                    bit  p2.0        ;AT45DB161B的状态查询位
res                bit  p2.1        ;AT45DB161B的复位控制位
cs1                bit  p2.2        ;U5(AT45DB161B)的片选位
sck                bit  p2.3        ;SPI时钟线
si                bit  p2.4        ;SPI数据输入线
so                bit  p2.5        ;SPI数据输出线
cs2            bit  p2.6        ;U6(AT45DB161B)的片选位
dq                bit  p2.7        ;U11(DS18B20)数据位

read_buf1_mod3                    equ    0d4h        ;读buf1
read_buf2_mod3                    equ    0d6h    ;读buf2
read_status_mod3                  equ    0d7h    ;读状态寄存器
write_buf1                            equ     84h    ;写buf1
write_buf2                            equ     87h    ;写buf2
FLASH_pg_era_wr_frbuf1_cmd    equ     83h    ;FLASH通过buf1先擦后写
FLASH_pg_era_wr_frbuf2_cmd    equ     86h    ;FLASH通过buf2先擦后写
buf1_pg_rd_frFLASH_cmd        equ     53h    ;FLASH读入buf1
buf2_pg_rd_frFLASH_cmd        equ     55h    ;FLASH读入buf2
comp_buf1_FLASHpg_cmd        equ     60h    ;FLASH、buf1比较
comp_buf2_FLASHpg_cmd        equ     61h    ;FLASH、buf2比较
FLASH_pg_wr_frbuf1_cmd        equ     88h    ;FLASH通过buf1直接写(无擦除)
FLASH_pg_wr_frbuf2_cmd        equ     89h    ;FLASH通过buf2直接写(无擦除)
FLASH_pg_era_cmd                equ     81h    ;FLASH页擦除
FLASH_pg_rd_cmd_mod3        equ    0d2h    ;FLASH
bolck_era_cmd                    equ  50h    ;FLASH块擦除
pg_w_through_buf1_cmd  &nbs
3楼: >>参与讨论
TLWXB
谢谢CHUANDAOXY
非常感谢 CHUANDAOXY ,先消化一下,不懂之处还望指教。也请其他朋友多多指教。

4楼: >>参与讨论
TLWXB
再求助关于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的值分别是多少?如何算出来的?

5楼: >>参与讨论
TLWXB
DATAASHEET1
DATA1

6楼: >>参与讨论
TLWXB
DATAASHEET2
DATASHEET2

7楼: >>参与讨论
TLWXB
扛一下
扛一下

参与讨论
昵称:
讨论内容:
 
 
相关帖子
求助:SRAM的S什么意思?DRAM的D什么意思?
c8051进入中断的问题!
请教2402驱动。
关于按键消抖
发现了一个新的查询 IC DataSheet的地方
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号