|
|||||||||||
| 技術(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卡的?我的這個(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 于 2005/12/1 21:29:00 發(fā)布:
問題已解決,大家分析一下程序 和以前的區(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); } |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |