|
发表于 2007-9-17 10:56:44
|
显示全部楼层
谢谢tiker 田开坤的关注,我现在测试6116能正常工作了,但是CF卡一直不能就绪。程序如下:
//CF.h
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define DATA_REG XBYTE[0x8000]
#define Features XBYTE[0x8001]
#define SEC_COUNT_REG XBYTE[0x8002]
#define SEC_NUM_REG XBYTE[0x8003]
#define CYL_LOW_REG XBYTE[0x8004]
#define CYL_HI_REG XBYTE[0x8005]
#define DRV_HD_REG XBYTE[0x8006]
#define STATUS_REG XBYTE[0x8007]
#define COMMAND_REG XBYTE[0x8007]
#define SECTOR 512
void CF_Read(ulong sector,uchar *buffer);
void CF_Write(ulong sector,uchar *buffer);
//读写子程序
#include <CF.h>
void CF_Write(ulong sector,uchar*cfbuf_add)
{
uint i=0 ;
uchar temp=0 ;
if((STATUS_REG&0x02)!=0x02)
{
while((STATUS_REG&0xf0)!=0x50)
P1=STATUS_REG ; //不知道为什么一到这里就停住了
//CF等待就绪
}
SEC_COUNT_REG=0x01 ;
//写的扇区数为1
SEC_NUM_REG=(sector&0xff);
//要求读写的扇区低字节
CYL_LOW_REG=((sector&0xffff)>>8);
//要求读写的扇区中间字节
CYL_HI_REG=(sector>>16);
//要求读写的扇区高字节
DRV_HD_REG=0xe0 ;
//选择LBA模式
COMMAND_REG=0x30 ;
//命令字,写扇区
if((STATUS_REG&0x02)!=0x02)
{
while((STATUS_REG&0xf8)!=0x58)
P1=STATUS_REG ;
//CF请求发送数据
}
//写一个扇区512字节
for(i=0;i<SECTOR;i++)
{
temp=cfbuf_add;
DATA_REG=temp ;
}
}
void CF_Read(ulong sector,uchar*cfbuf_add)
{
uint i=0 ;
uchar temp ;
if((STATUS_REG&0x02)!=0x02)
{
while((STATUS_REG&0xf0)!=0x50)
P1=STATUS_REG ;
}
SEC_COUNT_REG=0x01 ;
SEC_NUM_REG=(sector&0xff);
CYL_LOW_REG=((sector&0xffff)>>8);
CYL_HI_REG=(sector>>16);
DRV_HD_REG=0xe0 ;
COMMAND_REG=0x20 ;
if((STATUS_REG&0x02)!=0x02)
{
while((STATUS_REG&0xf8)!=0x58)
P1=STATUS_REG ;
}
for(i=0;i<SECTOR;i++)
{
temp=DATA_REG ;
*cfbuf_add=temp ;
cfbuf_add++;
}
}
//CF测试
#include <CF.h>
uchar code Dat[512]="0123456789abcdefghijklmnopqrstuvwxyz";
uchar xdata buf[512] _at_ 0x4010;
void Delay(uint n)
{
uchar i,j;
for(;n;n--)
for(i=0;i<50;i++)
for(j=0;j<124;j++)
;
}
void main(void)
{
uint i;
Delay(10);
CF_Write(0x0040,Dat);
//P1=0xF0;
CF_Read(0x0040,buf);
while(1)
{
for(i=0;i<SECTOR;i++)
{
P1=buf;
Delay(30);
}
}
}
请各位看一下问题出在哪里,谢谢! |
|