音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng)
驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe

求救!51讀寫CF卡問題。

作者:freebenben 欄目:單片機(jī)
求救!51讀寫CF卡問題。
各位老大有沒有做過51讀寫CF卡的?我的這個(gè)基本的讀寫模塊不知道有什么問題,讀是可以讀出來,寫就只有偶爾的一次兩次能寫得進(jìn),我用的是WAVE的仿真器,單片機(jī)為W77E58,外接的RTC里還有RAM。已知硬件沒有問題,換用以前匯編寫的程序可以正常讀寫。程序如下,請各位老大幫忙看看。這樣寫出來的東西編譯后效率很低,看了看它編出的匯編有很多多余的東西。如何優(yōu)化呢?


void read_sector(ulong sector,uchar xdata *cfbuf_add)    /*CF卡基本讀模塊,參數(shù)為要求讀寫的開始扇區(qū)號(hào),數(shù)據(jù)存入緩沖區(qū)首地址(外部RAM)*/
{                    
/*讀出的數(shù)據(jù)存入以地址cfbuf_add開始的512字節(jié)緩沖區(qū)中*/       

void read_sector(ulong sector,uchar xdata *cfbuf_add)    /*CF卡基本讀模塊,參數(shù)為要求讀寫的開始扇區(qū)號(hào),從左至右為從低到高字節(jié)*/
{                    /*讀出的數(shù)據(jù)存入以地址cfbuf_add開始的512字節(jié)緩沖區(qū)中*/
        uchar    i=0;
    if((STATUS_REG&0x02)!=0x02)
    {
        while((STATUS_REG&0xf0)!=0x50);   //CF卡準(zhǔn)備就緒
    }
    SEC_COUNT_REG=0x01;        /*要求讀寫的扇區(qū)數(shù) 1*/
    SEC_NUM_REG=(sector&0xff);                /*要求讀寫的開始扇區(qū)號(hào) 低字節(jié)*/
    CYL_LOW_REG=((sector&0xffff)>>8);        /*要求讀寫的開始扇區(qū)號(hào) 中間字節(jié)*/
    CYL_HI_REG=(sector>>16);               /*要求讀定的開始扇區(qū)號(hào) 高字節(jié)*/
    DRV_HD_REG=0xe0;                /*選擇LBA模式 邏輯塊模式 */
    COMMAND_REG=0x20;               /*命令字 讀扇區(qū)*/
    if((STATUS_REG&0x02)!=0x02)
    {
        while((STATUS_REG&0xf8)!=0x58);   //CF卡請求發(fā)送或接收命令
    }
                               //讀取一個(gè)扇區(qū)512字節(jié)
    while(--i)
    {
        *cfbuf_add=DATA_REG;
                cfbuf_add++;
    }
        i=0;
    while(--i)
    {
        *cfbuf_add=DATA_REG;
                cfbuf_add++;
    }

}

void write_sector(ulong sector,uchar xdata *cfbuf_add)        /*CF卡基本寫模塊,參數(shù)為要求讀寫的開始扇區(qū)號(hào),緩沖區(qū)首地址*/
{                    /*將以地址cfbuf_add開始的512字節(jié)緩沖區(qū)中的數(shù)據(jù)存入CF卡指定扇區(qū)中*/
        uchar    i=0;
        uchar sta=0;
    if((STATUS_REG&0x02)!=0x02)
    {
            do
            {   sta=STATUS_REG;
                sta&=0xf0;
            }
        while(sta!=0x50);   //CF卡準(zhǔn)備就緒
    }
    SEC_COUNT_REG=0x01;        /*要求讀寫的扇區(qū)數(shù) 1*/
    SEC_NUM_REG=(sector&0xff);                /*要求讀寫的開始扇區(qū)號(hào) 低字節(jié)*/
    CYL_LOW_REG=((sector&0xffff)>>8);        /*要求讀寫的開始扇區(qū)號(hào) 中間字節(jié)*/
    CYL_HI_REG=(sector>>16);               /*要求讀定的開始扇區(qū)號(hào) 高字節(jié)*/
    DRV_HD_REG=0xe0;                /*選擇LBA模式 邏輯塊模式 */
    COMMAND_REG=0x30;               /*命令字 寫扇區(qū)*/
    if((STATUS_REG&0x02)!=0x02)
    {
            do
            {   sta=STATUS_REG;
                sta&=0xf8;
            }
        while(sta!=0x58);    //CF卡請求發(fā)送或接收命令
    }
                               //寫一個(gè)扇區(qū)512字節(jié)
    while(--i)
    {
        DATA_REG=*cfbuf_add;
                cfbuf_add++;
    }
    while(--i)
    {
        DATA_REG=*cfbuf_add;
                cfbuf_add++;
    }

}


2樓: >>參與討論
freebenben
問題已解決,大家分析一下程序

和以前的區(qū)別只是把while(--i){}改成了do{}while(--i)但是以前的就是寫不進(jìn),到底是怎么回事呢?
還可以再優(yōu)化嗎?我用的是W77E58,時(shí)鐘是11.0592
調(diào)用這個(gè)函數(shù)寫一個(gè)扇區(qū)耗時(shí)將近6ms.



void read_sector(ulong sector,uchar xdata *cfbuf_add)    /*CF卡基本讀模塊,參數(shù)為要求讀寫的開始扇區(qū)號(hào)*/
{                    /*讀出的數(shù)據(jù)存入以地址cfbuf_add開始的512字節(jié)緩沖區(qū)中*/
        uchar    i=0;
    if((STATUS_REG&0x02)!=0x02)
    {
        while((STATUS_REG&0xf0)!=0x50);   //CF卡準(zhǔn)備就緒
    }
    SEC_COUNT_REG=0x01;        /*要求讀寫的扇區(qū)數(shù) 1*/
    SEC_NUM_REG=(sector&0xff);                /*要求讀寫的開始扇區(qū)號(hào) 低字節(jié)*/
    CYL_LOW_REG=((sector&0xffff)>>8);        /*要求讀寫的開始扇區(qū)號(hào) 中間字節(jié)*/
    CYL_HI_REG=(sector>>16);               /*要求讀定的開始扇區(qū)號(hào) 高字節(jié)*/
    DRV_HD_REG=0xe0;                /*選擇LBA模式 邏輯塊模式 */
    COMMAND_REG=0x20;               /*命令字 讀扇區(qū)*/
    if((STATUS_REG&0x02)!=0x02)
    {
        while((STATUS_REG&0xf8)!=0x58);   //CF卡請求發(fā)送或接收命令
    }
                               //讀取一個(gè)扇區(qū)512字節(jié)
    while(--i)
    {
        *cfbuf_add=DATA_REG;
                cfbuf_add++;
    }
        i=0;
    while(--i)
    {
        *cfbuf_add=DATA_REG;
                cfbuf_add++;
    }

}

void write_sector(ulong sector,uchar xdata *cfbuf_add)        /*CF卡基本寫模塊,參數(shù)為要求讀寫的開始扇區(qū)號(hào)*/
{                    /*將以地址cfbuf_add開始的512字節(jié)緩沖區(qū)中的數(shù)據(jù)存入CF卡指定扇區(qū)中*/
        uchar    i=0;
        uchar sta=0;
       
    if((STATUS_REG&0x02)!=0x02)
    {
        while((STATUS_REG&0xf0)!=0x50);   //CF卡準(zhǔn)備就緒
    }
    SEC_COUNT_REG=0x01;        /*要求讀寫的扇區(qū)數(shù) 1*/
    SEC_NUM_REG=(sector&0xff);                /*要求讀寫的開始扇區(qū)號(hào) 低字節(jié)*/
    CYL_LOW_REG=((sector&0xffff)>>8);        /*要求讀寫的開始扇區(qū)號(hào) 中間字節(jié)*/
    CYL_HI_REG=(sector>>16);               /*要求讀定的開始扇區(qū)號(hào) 高字節(jié)*/
    DRV_HD_REG=0xe0;                /*選擇LBA模式 邏輯塊模式 */
    COMMAND_REG=0x30;               /*命令字 讀扇區(qū)*/
    if((STATUS_REG&0x02)!=0x02)
    {
            while((STATUS_REG&0xf8)!=0x58);    //CF卡請求發(fā)送或接收命令
    }
                               //讀取一個(gè)扇區(qū)512字節(jié)
    do
    {
        DATA_REG=*(cfbuf_add++);
    }while(--i);
    do
    {
        DATA_REG=*(cfbuf_add++);
    }while(--i);

}


參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
求救:我的I2C程序
弱弱地問一句:FLASH VERSION翻成中文是什么
除了繼電器,還有什么方法實(shí)現(xiàn)低電壓控制高電壓??
一個(gè)奇怪的問題,把一個(gè)C51文件拆分編譯后比原來大很多!
請教8051單片機(jī)問題
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào)