新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > Flash與S3C44B0X連接時地址線為什么要偏移一位

        Flash與S3C44B0X連接時地址線為什么要偏移一位

        作者: 時間:2016-11-11 來源:網絡 收藏
        FlashS3C44B0X的接口電路圖如圖2所示。處理器ADDR20~1對應著Flash ROM的A19~0,偏移了1位,這是由于S3C44B0X是按照字節編址的,而Flash ROM是以16位為一個存儲單元。


        圖2 程序存儲器Nor Flash的擴展

        本文引用地址:http://www.104case.com/article/201611/316815.htm

        代碼一:
        #define Writeflash(addr,dat) *((volatile INT16U *)(addr<<1))=(INT16U)dat
        #define Readflash(addr) (*((volatile INT16U *)(addr<<1)))
        /*addr為讀寫操作的半字地址,data則為要寫入的半字數據。因為ARM處理器是以字節為單位
        進行數據處理的,而SST39VF160是16位數據寬度,所以,addr地址必須左移1位。*/

        代碼二:
        //擦除是否為空
        int SST39VF160_CheckBlank(INT32U addr,INT32U WordSize)
        {
        INT32U i,temp;
        for (i=addr;i<(addr+WordSize);i++)
        {
        temp=*((volatile INT16U *)(i<<1)); //地址左移一位,也就得到16位的數據了。
        if(temp!=0xffff) //因為扇區被擦除后,扇區的各位都是1.所以判斷temp是否等于0xffff //0xffff
        return 0; //如果扇區的各個地址都不為0xffff;則返回0
        }
        return 1;
        }

        在網上看到這么一段話,我琢磨不透。“S3C44B0X是按照字節編址的,而Flash ROM是以16位為一個存儲單元”是怎樣推出要“偏移一位”呢?代碼一的注釋和上一段一樣,也沒有給出是如何推導出來的。而且代碼二中的下面這行代碼的注釋更是讓我不解。前面的i被定義成INT32U 型,怎么通過左移一位就可以得到16的數據呢?懇請各位大俠給出較為詳細的解釋.
        temp=*((volatile INT16U *)(i<<1)); //地址左移一位,也就得到16位的數據了。

        解答:

        關于那個錯位,我不知道能不能跟你說清楚。首先,SST39VF16 FLASH是16位的,也就是以兩個字節(半字)為最小操作單位的。也就是說你在FLASH地址上給0x00000,則它給出的數據是第一個16位的半字;在FLASH地址上給0x00001,它給出的是第二個16位的半字;在FLASH地址上給0x00002,它給出的是第三個16位的半字。。。但ARM的地址是以字節編址的,它可以以字節單位來讀取或者寫外設。
        假設我們要讀取FLASH的第一個字節,LDRB R0,[R1];將R1內容寫0x00000,這個時候ARM執行的是這樣的操作:
        1、送出地址0x00000
        2、在D0-D15上讀取數據
        3、將讀到的16位數據的低8位給R0低8位(高24位為0)

        假設我們要讀取FLASH的第二個字節,LDRB R0,[R1];將R1內容寫0x00001,
        這個時候ARM執行的是這樣的操作:
        1、送出地址ox00001
        2、在D0-D15上讀取數據
        3、將讀到的16位數據的高8位給R0的低8位(高24位為0)

        從上面的操作可以看到,如果我們一一對應的將ARM和FLASH得地址連接,那么我們想讀FLASH的第2個字節的話,就沒有辦法讀到了。因為你地址給0x00001,FLASH就在數據線上給的是第3個字節和第4個字節的數據,并將高8位(FLASH的第4個字節)給R0;如果你給的地址是0x00000的話,ARM的理解就是將數據線D0-D15的低8位給R0,顯然這個16位的數據是FLASH的第1個字節和第2個字節的數據,低8位指的就是第一個自己的數據。顯然怎么也讀不到FLASH的第2個數據。
        我們既要遵循ARM的規則,又要讓FLASH給我們正確的數據。你自己想應該怎么辦?很簡單,把ARM給的地址最低位剪掉,把剩下的給FLASH。要讀第2個字節,還是送0x00001,但是最后的1被剪掉了,FLASH得到的地址是ox00000,顯然給出的數據是第1個和第二個字節。而ARM覺得送出的地址是0x00001啊,應該把高地址給R0啊,即把第2個字節給了R0。就是一個“欺上瞞下”的過程。



        關鍵詞: FlashS3C44B0X地址

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 民乐县| 民和| 莆田市| 宁都县| 大连市| 波密县| 明溪县| 嘉禾县| 麻栗坡县| 太湖县| 三台县| 东乡族自治县| 雷波县| 玛曲县| 礼泉县| 会理县| 襄樊市| 靖西县| 临沂市| 肥西县| 莆田市| 保定市| 迁西县| 镇远县| 浏阳市| 长岭县| 静宁县| 莱阳市| 鄂温| 周口市| 黔西| 沾益县| 建德市| 白玉县| 阿拉善盟| 东平县| 鹤峰县| 黎平县| 错那县| 莫力| 西城区|