1. 程式人生 > >STM32 USB NAND Flash模擬U盤無法格式化問題的解決

STM32 USB NAND Flash模擬U盤無法格式化問題的解決

uint32 FlashWriteOneSector(uint32 Addr, uint8 * pBuf, uint32 Remain) { uint32 i; uint32 SwapPageAddr; // printf("Addr = 0x%x\r\n",Addr); // printf("Remain = 0x%x\r\n",Remain); if(Addr>FLASH_MAX_SECTOR_ADDR)return1;//如果地址超出範圍,則返回失敗程式碼1,越界 Addr=FlashAddrRemap(Addr);//重新影射地址 if((Addr&(~(FLASH_PAGE_SIZE

-1)))!=(FlashCurrentWriteSectorAddr&(~(FLASH_PAGE_SIZE-1))))//如果跨page { // printf("跨頁\r\n"); if(FlashNeedWriteBack)//如果前面寫了資料,則需要將當前讀出的page寫回 { if(FlashWritePage()&0x01)//寫入失敗 { Addr=FlashDealBadBlock(Addr-FLASH_PAGE_SIZE,3)+FLASH_PAGE_SIZE;//壞塊處理 } } if((Addr&(~(FLASH_BLOCK_SIZE-1)))!=(FlashCurrentWriteSectorAddr
&(~(FLASH_BLOCK_SIZE-1))))//如果跨block,則需要擦除新的塊, { //在擦除之前,要先將原來的塊複製到交換區,並且將該塊前面部分資料寫回 //該函式除了將整塊資料複製到交換區以外,並且還將擦除掉原來的塊,然後將前面部分複製回原來的塊 // printf("跨塊\r\n"); Addr=FlashCopyBlockToSwap(Addr); } //從交換區中讀出對應的一頁 FlashWriteCommand(0x00); FlashWriteAddr4Byte(FlashGetCurrentSwapBlock()+(Addr&(FLASH_BLOCK_SIZE-1)));
FlashWriteCommand(0x35); FlashWait(); //隨機寫 FlashWriteCommand(0x85); FlashWriteAddr4Byte(Addr);//寫4位元組地址 for(i=0;i<FLASH_SECTOR_SIZE;i++) { FlashWriteDataByte(pBuf[i]); } FlashNeedWriteBack=1;//需要寫回 } else//沒有超過一頁地址,則直接寫資料 { //隨機寫 // printf("直接寫\r\n"); FlashWriteCommand(0x85); FlashWriteAddr2Byte(Addr); for(i=0;i<FLASH_SECTOR_SIZE;i++) { FlashWriteDataByte(pBuf[i]); } FlashNeedWriteBack=1;//需要寫回 } FlashCurrentWriteSectorAddr=Addr;//儲存本次地址 if(Remain==0)//剩餘扇區數為0,不會再寫了,需要寫回 { if(FlashNeedWriteBack)//如果前面寫了資料,則需要將當前讀出的page寫回 { if(FlashWritePage()&0x01)//寫入失敗 { Addr=FlashDealBadBlock(Addr,3);//壞塊處理 } } //計算剩餘頁數 Remain=(((Addr+FLASH_BLOCK_SIZE)&(~(FLASH_BLOCK_SIZE-1)))-(Addr&(~(FLASH_PAGE_SIZE-1))))/FLASH_PAGE_SIZE-1; //計算在交換塊中的起始頁地址 SwapPageAddr=FlashGetCurrentSwapBlock()+(Addr&(FLASH_BLOCK_SIZE-1)); for(i=0;i<Remain;i++)//將該塊內儲存在交換塊中剩餘部分頁的資料複製回該塊 { Addr+=FLASH_PAGE_SIZE;//從下一頁開始寫 SwapPageAddr+=FLASH_PAGE_SIZE; if(0x01==(FlashCopyPage(SwapPageAddr,Addr)&0x01))//如果複製失敗 { Addr=FlashDealBadBlock(Addr,2);//處理壞塊 } } FlashNeedWriteBack=0;//清除需要寫回標誌 FlashCurrentWriteSectorAddr=~0; } return0; }

MAL_Write(lun ,W_Offset - Mass_Block_Size[lun],Data_Buffer,Mass_Block_Size[lun]);將Mass_Block_Size[lun]作為第三個引數傳遞給FlashWriteOneSector(),這個函式第三個引數是Remain,在這個程式碼中Remain只有在程式最後if(Remain==0)出現過,而我們呼叫是傳遞Mass_Block_Size[lun]這是個常數,永遠不會滿足if(Remain==0)這個條件,也就是說程式會一直寫不會停止。

相關推薦

STM32 USB NAND Flash模擬U無法格式化問題的解決

uint32 FlashWriteOneSector(uint32 Addr, uint8 * pBuf, uint32 Remain) { uint32 i; uint32 SwapPageAddr; // printf("Addr = 0x%x\r\n",Addr); // printf("Rema

STM32 USB 使用晶片內部flash模擬U

#include"mass_mal.h"#define FLASH_START_ADDR 0x08016000// Flash start address #define FLASH_SIZE 0x64000// 400K 的U盤 #define

linux 開發板(Linux USB Gadget) 模擬u

前幾天,搞了 hid裝置,通過usb hid裝置和windows進行通訊。現在開始搞這個 mass storge 首先說明 環境:linux版本:3.15        使用開發板:SAMa5d3        編譯

U無法格式化的恢復

data- ubunt 百度 ubun rac 芯片 會有 ubuntu 昨天 昨天裝Ubuntu的系統可能把U盤搞崩潰了。然後今早起來U盤無法識別,格式化也不行,用Windows的磁盤管理工具格式化說是:Windows無法格

簡單實現stm32f103晶片usb模擬U進行IAP更新使用者程式

轉自:https://blog.csdn.net/lrmlrm/article/details/51507340 更新微控制器內的使用者程式,方式一般都是模擬器,串列埠,網路口,usb DFU,另類一點CAN也行,但是這些方式都有一個共同點,必須要有相應的上位機配合操作,還要教會別人使用

U無法識別修復介紹 U數據丟失恢復圖文教程

u盤數據丟失怎麽辦 u盤數據恢復 很多人都會用U盤來拷貝數據,有時候我們從其它地方辛苦拷貝了數據之後想要將拷貝的數據復制到我們的電腦裏,可是將U盤插入電腦後卻出現了沒有反應的情況,電腦沒有顯示插入的U盤我們也無法查看,這個時候該怎麽辦呢?很多人遇到這種情況可能不清楚該怎麽辦,下面小編來和大家說一下U盤

如何利用U恢復驅動器解決無法進入Win10系統的問題

enter term 安裝 出現 選擇 無法 ios 打開 color 我們都知道Win10系統有系統備份和還原的功能,可以在系統或者應用程序出現小故障的時候進行系統的還原,來達到之前系統備份時正常運行的狀態。但要是電腦連系統都無法進入了,我們又該怎麽去恢復系統呢?今天就來

怎麽處理U無法拷貝超過4G大文件的情況?

文件 無法 原因 process color proc size ofo 文件拷貝 制作好雨後清風U盤啟動盤後,有朋友在將雨後清風系統鏡像文件拷貝傳輸至U盤時,會發現U盤提示文件過大,無法進行傳輸,但是U盤的剩余存儲空間明顯還足夠,這是怎麽回事呢?其實這是U盤文件系統格式的

gparted燒錄到U,使其成為live usb,從而實現U啟動,並啟動gparted

  1.把zip包中的檔案解壓縮到U盤中,並且保持原目錄結構不變!也就是說,解壓縮到U盤根目錄中!自己不要增加目錄! 2.執行你U盤中utils/linux/目錄中的makeboot.bat檔案!(特別注意,此檔案一定要在U盤中執行,絕不允許在你的硬碟上執行!) 以上操作完畢後,即可用

LINUX系統識別外設(基於C的自動讀寫)(LINUX模擬U)【二】

前言 最近在開發基於量子隨機數的離線金鑰充值系統,主要功能是對外設進行充值隨機數金鑰。軟體部署在centos7系統上,因此需要軟體自動識別系統是否有外設通過USB口接入裝置。 在上一章中我簡單介紹瞭如何去對linux系統中的外來儲存裝置進行讀寫操作,在本章中我將繼續講解,

UCD_Fedora 解決移動裝置U無法識別

1. 昨天由於使用虛擬機器裡面的Fedora10 配置一個開發程式,在使用系統自帶的拍照軟體cheese webCam Booth時,軟體 報出一個錯誤,說camera無法找到,從說明文件裡面找原因,說有很多原因導致camera無法識別    解決方法: 首先檢查攝像機,換

U提示格式化,8G的U變成了8M,並無法格式化打不開U解決方法

過年回來,準備用一個8G優盤拷貝東西,結果插上電腦後,顯示連線正常。開啟後,要求格式化,格式化介面顯示只有8M,格式化也不能進行下去!百度了好多資料最終解決了 錯誤如下圖: U盤不能格式化的幾種“途徑:主要有中毒(包括中毒後的亂搞)、U盤讀寫時插拔或者不小心踢著了(特別

《Linux那些事兒之我是USB》我是U(22)彼岸花的傳說(一)

彼岸花,花語是悲傷的回憶。 很久很久以前,城市的邊緣開滿了大片大片的曼珠沙華,它的花香有一種魔力,可以讓人想起自己前世的事情。守護曼珠沙華的是兩個妖精,一個是花妖叫曼珠,一個是葉妖叫沙華。他們守候了幾千年,可是從來沒有見過面,因為開花時,就沒有葉子,有葉子時沒有花。他們瘋狂

Linux下VirtualBox安裝XP,UU無法識別解決辦法

Linux為主機,Virtualbox安裝了XP系統,插入U盤、U盾,Linux可以識別,但是虛擬機器中不能識別U盤、U盾。 第一步,需要安裝Oracle VM VirtualBox Extension Pack,去官網下載後,在Virtualbox“管理”-“全域性設定”

《Linux那些事兒之我是USB》我是U(29)彼岸花的傳說(八)

對於use_sg為0的情況,我們接下來再看168行,offset是函式呼叫傳遞進來的引數,註釋裡說得很清楚,就是用來標誌偏移量的,每次複製幾個位元組它就增加幾個位元組,最大它也不能超過request_bufflen,這是顯然的。usb_stor_access_xfer_bu

android OTG (USB讀寫,U讀寫)最全使用相關總結

androidOTG (USB讀寫,U盤讀寫) 最全使用相關總結 簡介 第一種讀取方法:android推薦使用的通過endpoint的形式進行通訊 第二種讀取方法:像讀你sdcard的形式來讀你的U盤裝置 注意注意注意 簡介   首先關於現

《Linux那些事兒之我是USB》我是U(21)傳說中的URB

有人問,怎麼寫一個驅動寫這麼久啊? 的確,一路走來,大家都不容易,但既然已經走到今天,我們能做的也只有是堅持下去。 usb_stor_acquire_resources(),從名字上來看是獲取資源。什麼是資源?之前不是申請了一大堆記憶體了嗎?寫個USB裝置驅動程式怎麼這麼麻

win7點選usb圖示來退出U無反應的解決辦法

開你的電腦 服務管理 面板,把關於藍芽的所有服務改成自動,尤其是這個破藍芽服務 Bluetooth Support Service 一定要改成自動,然後啟動沒有啟動的藍芽服務。再點選usb圖示就好了,初步猜測是藍芽的服務響應機制和usb的通知響應機制衝突的緣故吧

移動硬無法訪問解決大全

硬盤 信息 錯亂 win 回車 需要 軟件 分區 最新版 移動硬盤本來好好的,想查看裏面的資料時突然顯示移動硬盤無法訪問了?這該怎麽辦?直接換新的,之前的重要數據只有丟失了,不換新的怎麽修復移動硬盤呢? 出現這種錯誤提示,是由於各種原因導致的磁盤文件目錄(FAT,

去除ubuntu u只讀的解決辦法

解決方法:1. 在Ubuntu終端執行如下命令tail -f /var/log/syslog      2. 插入有隻讀檔案系統故障的U盤3. 觀察命令列輸出輸出區域性如下:Jul  8 16:44:50 cslouis-pc kernel: [15595.155904]