微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > CH375无法读扇区 求指导

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top