⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 FS7805 使用ATA硬盘的demo
💻 C
字号:
/*
*********************************************************************************************************
* File:     Main.C
* Contents:
*
* $Date:    04/06/06    Kimi    v0.1
*           01/05/07    kevin   v0.2
*           01/08/07    kevin   v0.3
*           01/29/07    kevin   v0.4
* Copyright (c) 2007 Fameg, Inc. All rights reserved
*********************************************************************************************************
*/

#define ALLOCATE_EXTERN     
#include "fs7805.h"                           // Declare GLOBAL variables and functions
#include "fs7805regs.h" 

#include "Include.h" 
#include "aplif.h"
#include "string.h" 

xdata INT8U OutBuffer[512];
union FIFODataLen
{
    INT16U  Val;
    INT8U   Byte[2];
}; 
static  union FIFODataLen Length; 


void main(void)
{ 
    TdInit();
    WriteOutFIFO();                       //move data to OutFIFO  
    WriteOneSector(0x07);                     //write data to IDE device 
    ReadOneSector(0x07);                      //read the 7th sector data from IDE device  
    while(1);
}

/*
*********************************************************************************************************
*                                             WriteOneSector
*
* Description: Write one sector data(512 BYTE) to IDE device
*
* Arguments  : sector: sector address need to be write
*
* Returns    : none
*********************************************************************************************************
*/

void  WriteOneSector (INT8U sector)
{
    WritePIO8(ATA_DRIVESEL_REG, 0xE0);        
    WritePIO8(ATA_SECTOR_COUNT_REG,1);        //write sector counter value to IDE register 
    WritePIO8(ATA_LBA_LSB_REG, sector);       //write address to IDE register 
    WritePIO8(ATA_LBA_2SB_REG, 0);
    WritePIO8(ATA_LBA_MSB_REG, 0);
    
    init_udma_write();                        //initialize UDMA relegated register
    while ((ReadATAPI_STATUS_REG() != 0x50)); //wait for IDE device ready 
    WritePIO8 (ATA_COMMAND_REG, 0xCA);        //write WRITE command to IDE register 
    while ((ReadATAPI_STATUS_REG() & 0x88) != 0x08); //wait for IDE device ready 
    WriteUDMA(0x200);                         //FS7805 start write data with APLIF  
    while ((ReadATAPI_STATUS_REG() != 0x50));
}
 
/*
*********************************************************************************************************
*                                             ReadOneSector
*
* Description: Read one sector data(512 BYTE) from IDE device
*
* Arguments  : sector: sector address need to be read
*
* Returns    : none
*********************************************************************************************************
*/
 
void  ReadOneSector (INT8U sector)
{
    WritePIO8(ATA_DRIVESEL_REG, 0xE0); 
    WritePIO8(ATA_SECTOR_COUNT_REG,1);         //write sector counter value to IDE register
    WritePIO8(ATA_LBA_LSB_REG, sector);        //write address to IDE register 
    WritePIO8(ATA_LBA_2SB_REG, 0); 
    WritePIO8(ATA_LBA_MSB_REG, 0);
    
    init_udma_read();                          //initialize UDMA relegated register
    WritePIO8(ATA_COMMAND_REG, 0xC8);          //write READ command to IDE register 
    while ((ReadATAPI_STATUS_REG() & 0x88) != 0x08); //wait for IDE device ready 
    ReadUDMA(0x200);                           //FS7805 start read data with APLIF 
    while ((ReadATAPI_STATUS_REG() != 0x50));
    
} 

/*
*********************************************************************************************************
*                                             WriteOutFIFO
*
* Description: Load data in FIFO and pass data to SFI
*
* Arguments  : none
*
* Returns    : none
*********************************************************************************************************
*/

void  WriteOutFIFO ()
{
    union
    {
        INT8U   Val;
        struct
        {
            INT8U   Count0 : 3;
            INT8U          : 1;
            INT8U   Count1 : 3;
            INT8U          : 1;
        } Bit;
    } HighReg;
    INT16U   i;

     for (i = 0; i < BYTES_PER_SECTOR; i++)
        OutBuffer[i]        = i  ;

    Length.Val              = BYTES_PER_SECTOR;
    HighReg.Val             = EP1CNTH;
    ParseOut();
    EP1CNT0L                = Length.Byte[1];          // Write count low byte
    if (UsbDmaBuffer==DMA_FIFOA0)
    {
        HighReg.Bit.Count0  = Length.Byte[0] & 0x07;
        HighReg.Val         = HighReg.Val | bmCNT0HWEN;
    }
    else
    {
        HighReg.Bit.Count1  = Length.Byte[0] & 0x07;
        HighReg.Val         = HighReg.Val | bmCNT1HWEN;
    }
    EP1CNTH                 = HighReg.Val;             // Write count high byte 
 
    memcpy((INT8U xdata *)UsbDmaBuffer, OutBuffer, BYTES_PER_SECTOR);// Copy data 

    if (UsbDmaBuffer==DMA_FIFOA0)
    {                                                   
        EPAFIFOCS               = 0x44;                // Set FULL bit
        SFI_SKIP                = 0x01;
    }
    else
    {
        EPAFIFOCS               = 0x88;                // Set FULL bit
        SFI_SKIP                = 0x41;
    } 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -