|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
关于AT89C51对AT45DB161B的读写,期盼热心人! |
作者:TLWXB 栏目:单片机 |
下面是我从网络上搜索整理出来的,但实现不了。 这也许在别人眼里很简单,但我实在是菜,小城市,可供查找的资料 实在有限,网络中搜到的内容也就那么多,只盼在这碰到热心人!把这些语句修改一下看能不能用。 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 |
2楼: | >>参与讨论 |
作者: CHUANDAOXY 于 2007/3/12 10:09:00 发布:
由网友推荐仅供参考 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 于 2007/3/12 13:06:00 发布:
谢谢CHUANDAOXY 非常感谢 CHUANDAOXY ,先消化一下,不懂之处还望指教。也请其他朋友多多指教。 |
4楼: | >>参与讨论 |
作者: TLWXB 于 2007/3/19 13:25:00 发布:
再求助关于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 于 2007/3/19 13:26:00 发布:
DATAASHEET1 DATA1 |
6楼: | >>参与讨论 |
作者: TLWXB 于 2007/3/19 13:28:00 发布:
DATAASHEET2 DATASHEET2 |
7楼: | >>参与讨论 |
作者: TLWXB 于 2007/3/22 21:39:00 发布:
扛一下 扛一下 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |