求助:STC单片机读写W29c011A的问题,请大家帮忙
//晶振22.1184M
//STC89C58RD+
#include " "
#define uchar unsigned char
#define uint unsigned int
#define RAM_ADDR 0x0000 //外部ram 首地址
#define FLASH_ADDR 0x8000 //flash 首地址
sbit CE=P2^7;
void select_segment(uchar seg)
{
P1&=0xfc;
switch(seg)
{
case 0: P1|=0x00; break; // 29c011 a16a15= 00 00000-0ffff
case 1: P1|=0x01; break; // 29c011 a16a15= 01 10000-1ffff
case 2: P1|=0x02; break; // 29c011 a16a15= 10 20000-2ffff
case 3: P1|=0x03; break; // 29c011 a16a15= 11 30000-3ffff
}
}
void erase()//整片擦除
{
select_segment(0);/*必须写到第0段*/
CE=1;
XBYTE[0xd555]=0xaa;
XBYTE[0xaaaa]=0x55;
XBYTE[0xd555]=0x80;
XBYTE[0xd555]=0xAA;
XBYTE[0xaAAA]=0x55;
XBYTE[0xd555]=0x10;
CE=0;
Delay_ms(20);
_nop_();
}
void protect() //解除保护
{
select_segment(0);/*必须写到第0段*/
CE=1;
XBYTE[0x5555+0x8000]=0xaa; //p2.7脚为芯片w29c011a使能信号,高电平有效
XBYTE[0x2aaa+0x8000]=0x55;
XBYTE[0x5555+0x8000]=0xa0;
CE=0;
}
void write_data(uint m_addr,uint s_sector,uint acount) //写数据
{
u int data addraa; /* addraa 为内存地址,addrbb 为29C040地址 */
u int data i,j;
bit flag;
addraa=m_addr;
for(j=acount;j> 0;j--)
{
CE=1; //?
select_segment(s_sector/256);
protect(); //解除保护
CE=1;
for(i=0;i <128;i++,addraa++)
{
CE=1;
XBYTE[addraa]=i; //
}
//翻转位判断写入完成
--addraa;
ACC=127;
flag=ACC^7;
while(1)
{
ACC=XBYTE[addraa];
if(ACC^7==flag) break;
// flag=ACC^7;
}
CE=0;
s_sector++;
}
}
void Read(uint r_addr)//读数据
{
uchar i;
uint Data;
CE=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
for(i=0;i <128;i++)
{
Data=XBYTE[r_addr+i]; //从flash中读数据
XBYTE[RAM_ADDR+0x0200+i]=Data; //写入ram
}
CE=0;
}
void main(void)
{
erase();
//write_data(FLASH_ADDR,0,1);
//Read(FLASH_ADDR);
while(1)
{
write_data(FLASH_ADDR,0,1);//写flash
Read(FLASH_ADDR); //读flash
SendtoPC(); //发给上位机
}
}
/*
读出来的都是FF,应该是没写进去,请大家帮忙,谢谢!
*/
发表时间:2009年4月13日0:51:12