CH375无法读扇区 求指导
时间:10-02
整理:3721RD
点击:
哪位大哥做过CH375呀?望指教呀
#include <reg52.h>
#include <ch375.h>
#include <CH375HF4.H>
#include <uart.h>
#include <absacc.h>
#include <intrins.h>
void delay2us(void)
{
_nop_();
_nop_();
}
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar Wait_Int()
{
// INT=1;
delay2us();
while(INT);
IO_Write_Cmd(CMD_GET_STATUS);
return IO_Read_Data();
}
void Ch375_Init()
{
IO_Write_Cmd(CMD_RESET_ALL);
delay(40);
IO_Write_Cmd(CMD_CHECK_EXIST);
IO_Write_Cmd(0xaa);
if(IO_Read_Data()==0x55)
{
UART_Send_Str("SUCCESS \n");
}
else
{
UART_Send_Str("ERR \n");
}
IO_Write_Cmd(CMD_SET_USB_MODE);
IO_Write_Data(6);
delay(1);
if(IO_Read_Data()==CMD_RET_SUCCESS)
{
UART_Send_Str("SUCCESS \n");
}
else
{
UART_Send_Str("ERR \n");
}
// IO_Write_Cmd(CMD_SET_BAUDRATE);
// IO_Write_Data(0x02);
// IO_Write_Data(0xd9);
delay(2);
}
void Disk_Init() //U盘初始化
{
uchar Status;
IO_Write_Cmd(CMD_GET_STATUS);
Status=IO_Read_Data(); //?
if(Status==USB_INT_CONNECT)
{
led=0;
UART_Send_Str("OK \n");
delay(5);
}
else
{
led=1;
UART_Send_Str("BAD \n"); //while(Status=Wait_Int())
delay(5);
//{if(Status==USB_INT_CONNECT)break;}
}
IO_Write_Cmd(CMD_DISK_INIT);
Status=Wait_Int();
if(Status==USB_INT_SUCCESS)
{
UART_Send_Str("OK \n");
delay(5);
}
else
{
led=1;
UART_Send_Str("BAD \n"); //while(Status=Wait_Int())
//{if(Status==USB_INT_SUCCESS)break;}
}
}
uchar Read_Sector(unsigned long Sector_Start,uchar Sector_Count) //Start为起始扇区地址,Count为扇区数
{
uchar Status=0,i=0,len,j;
uchar *buf;
IO_Write_Cmd(CMD_DISK_READ);
Status=Wait_Int();
IO_Write_Data((uchar)Sector_Start);
IO_Write_Data((uchar)Sector_Start>>8); //32位的地址
IO_Write_Data((uchar)Sector_Start>>16);
IO_Write_Data((uchar)Sector_Start>>24);
IO_Write_Data(Sector_Count); //所读扇区数
for(i=0;i<Sector_Count*BLK_PER_SEC;i++) //共读取8次,512字节
{
if(Status==USB_INT_DISK_READ)
{
IO_Write_Cmd(CMD_RD_USB_DATA);
delay2us(); //读缓存
len=IO_Read_Data(); //第一个为数据长度
for(j=0;j<len;j++)
{
*(buf)=IO_Read_Data();
buf++;
UART_Send_Str("SUCCESS");
}
delay2us();
IO_Write_Cmd(CMD_DISK_RD_GO);
Status=Wait_Int();
}
else
{
break;
}
}
if(Status==USB_INT_SUCCESS)
{
led=0;
UART_Send_Str("USB_INT_SUCCESS \n");
return 0;
}
else
{
led=1;
UART_Send_Str("USB_INT_ERR \n");
return Status;
}
}
uchar Write_Sector(unsigned long Sector_Start,uchar Sector_Count) //Start为起始扇区地址,Count为扇区数
{
uchar Status=0,i=0,j;
uchar *buf;
IO_Write_Cmd(CMD_DISK_READ);
Status=Wait_Int();
IO_Write_Data((uchar)Sector_Start);
IO_Write_Data((uchar)Sector_Start>>8); //32位的地址
IO_Write_Data((uchar)Sector_Start>>16);
IO_Write_Data((uchar)Sector_Start>>24);
IO_Write_Data(Sector_Count); //所读扇区数
for(i=0;i<8;i++) //共读取8次,512字节
{ //Status=Wait_Int(); //Status=Wait_Int();
if(Status==USB_INT_DISK_WRITE)
{
IO_Write_Cmd(CMD_WR_USB_DATA7);
delay2us(); //读缓存
IO_Write_Data(64); //第一个为数据长度
for(j=0;j<64;j++)
{
IO_Write_Data(*buf);
buf++;
UART_Send_Str("good");
delay2us();
}
IO_Write_Cmd(CMD_DISK_WR_GO);
Status=Wait_Int();
}
else
{
led=1;
UART_Send_Str("USB_ERR \n");
return Status;
}
}
if(Status==USB_INT_SUCCESS)
{
led=0;
UART_Send_Str("USB_INT_SUCCESS");
return 0;
}
else
{
led=1;
return Status;
}
}
unsigned char IO_Read_Data()
{
return CH_DATA;
}
void IO_Write_Data(uchar Data)
{
delay2us();
CH_DATA=Data;
delay2us();
}
void IO_Write_Cmd(uchar Cmd)
{
delay2us();
CH_CMD=Cmd;
delay2us();
}
void Read_Size()
{
uchar Status,Size=0;
uchar len,i=0;
IO_Write_Cmd(CMD_DISK_SIZE);
Status=IO_Read_Data();
if(Status==USB_INT_SUCCESS)
{
IO_Write_Cmd(CMD_RD_USB_DATA);
len=IO_Read_Data();
for(i=0;i<len;i++)
{
Size=IO_Read_Data();
UART_Send_Str("Size");
}
}
else
{
UART_Send_Str("bad");
}
}
这是我照着别人写的程序,初始化可以,关键就是读写扇区不行,哪位大侠做过的,指导指导 244816711@qq.com
#include <reg52.h>
#include <ch375.h>
#include <CH375HF4.H>
#include <uart.h>
#include <absacc.h>
#include <intrins.h>
void delay2us(void)
{
_nop_();
_nop_();
}
void delay(uint z)
{
uint x;
uchar y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchar Wait_Int()
{
// INT=1;
delay2us();
while(INT);
IO_Write_Cmd(CMD_GET_STATUS);
return IO_Read_Data();
}
void Ch375_Init()
{
IO_Write_Cmd(CMD_RESET_ALL);
delay(40);
IO_Write_Cmd(CMD_CHECK_EXIST);
IO_Write_Cmd(0xaa);
if(IO_Read_Data()==0x55)
{
UART_Send_Str("SUCCESS \n");
}
else
{
UART_Send_Str("ERR \n");
}
IO_Write_Cmd(CMD_SET_USB_MODE);
IO_Write_Data(6);
delay(1);
if(IO_Read_Data()==CMD_RET_SUCCESS)
{
UART_Send_Str("SUCCESS \n");
}
else
{
UART_Send_Str("ERR \n");
}
// IO_Write_Cmd(CMD_SET_BAUDRATE);
// IO_Write_Data(0x02);
// IO_Write_Data(0xd9);
delay(2);
}
void Disk_Init() //U盘初始化
{
uchar Status;
IO_Write_Cmd(CMD_GET_STATUS);
Status=IO_Read_Data(); //?
if(Status==USB_INT_CONNECT)
{
led=0;
UART_Send_Str("OK \n");
delay(5);
}
else
{
led=1;
UART_Send_Str("BAD \n"); //while(Status=Wait_Int())
delay(5);
//{if(Status==USB_INT_CONNECT)break;}
}
IO_Write_Cmd(CMD_DISK_INIT);
Status=Wait_Int();
if(Status==USB_INT_SUCCESS)
{
UART_Send_Str("OK \n");
delay(5);
}
else
{
led=1;
UART_Send_Str("BAD \n"); //while(Status=Wait_Int())
//{if(Status==USB_INT_SUCCESS)break;}
}
}
uchar Read_Sector(unsigned long Sector_Start,uchar Sector_Count) //Start为起始扇区地址,Count为扇区数
{
uchar Status=0,i=0,len,j;
uchar *buf;
IO_Write_Cmd(CMD_DISK_READ);
Status=Wait_Int();
IO_Write_Data((uchar)Sector_Start);
IO_Write_Data((uchar)Sector_Start>>8); //32位的地址
IO_Write_Data((uchar)Sector_Start>>16);
IO_Write_Data((uchar)Sector_Start>>24);
IO_Write_Data(Sector_Count); //所读扇区数
for(i=0;i<Sector_Count*BLK_PER_SEC;i++) //共读取8次,512字节
{
if(Status==USB_INT_DISK_READ)
{
IO_Write_Cmd(CMD_RD_USB_DATA);
delay2us(); //读缓存
len=IO_Read_Data(); //第一个为数据长度
for(j=0;j<len;j++)
{
*(buf)=IO_Read_Data();
buf++;
UART_Send_Str("SUCCESS");
}
delay2us();
IO_Write_Cmd(CMD_DISK_RD_GO);
Status=Wait_Int();
}
else
{
break;
}
}
if(Status==USB_INT_SUCCESS)
{
led=0;
UART_Send_Str("USB_INT_SUCCESS \n");
return 0;
}
else
{
led=1;
UART_Send_Str("USB_INT_ERR \n");
return Status;
}
}
uchar Write_Sector(unsigned long Sector_Start,uchar Sector_Count) //Start为起始扇区地址,Count为扇区数
{
uchar Status=0,i=0,j;
uchar *buf;
IO_Write_Cmd(CMD_DISK_READ);
Status=Wait_Int();
IO_Write_Data((uchar)Sector_Start);
IO_Write_Data((uchar)Sector_Start>>8); //32位的地址
IO_Write_Data((uchar)Sector_Start>>16);
IO_Write_Data((uchar)Sector_Start>>24);
IO_Write_Data(Sector_Count); //所读扇区数
for(i=0;i<8;i++) //共读取8次,512字节
{ //Status=Wait_Int(); //Status=Wait_Int();
if(Status==USB_INT_DISK_WRITE)
{
IO_Write_Cmd(CMD_WR_USB_DATA7);
delay2us(); //读缓存
IO_Write_Data(64); //第一个为数据长度
for(j=0;j<64;j++)
{
IO_Write_Data(*buf);
buf++;
UART_Send_Str("good");
delay2us();
}
IO_Write_Cmd(CMD_DISK_WR_GO);
Status=Wait_Int();
}
else
{
led=1;
UART_Send_Str("USB_ERR \n");
return Status;
}
}
if(Status==USB_INT_SUCCESS)
{
led=0;
UART_Send_Str("USB_INT_SUCCESS");
return 0;
}
else
{
led=1;
return Status;
}
}
unsigned char IO_Read_Data()
{
return CH_DATA;
}
void IO_Write_Data(uchar Data)
{
delay2us();
CH_DATA=Data;
delay2us();
}
void IO_Write_Cmd(uchar Cmd)
{
delay2us();
CH_CMD=Cmd;
delay2us();
}
void Read_Size()
{
uchar Status,Size=0;
uchar len,i=0;
IO_Write_Cmd(CMD_DISK_SIZE);
Status=IO_Read_Data();
if(Status==USB_INT_SUCCESS)
{
IO_Write_Cmd(CMD_RD_USB_DATA);
len=IO_Read_Data();
for(i=0;i<len;i++)
{
Size=IO_Read_Data();
UART_Send_Str("Size");
}
}
else
{
UART_Send_Str("bad");
}
}
这是我照着别人写的程序,初始化可以,关键就是读写扇区不行,哪位大侠做过的,指导指导 244816711@qq.com