新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > S3C2410處理器的擴展設計

        S3C2410處理器的擴展設計

        作者: 時間:2016-11-21 來源:網絡 收藏
        1. S3C2410處理器擴展內存32MB的SDRAM
        1.需求分析
        S3C2410是32位處理器(指令一次能夠操作32位數據(運算器一次可以處理32位數據);通用寄存器多是32位寄存器;處理器內部數據通道也是32位的;處理器外部數據總線寬度通常是32位的,地址總線寬度只是代表CPU尋址范圍大小,與CPU是多少位的無關,也即32位CPU的地址總線不一定是32根的,例如對于s3c2410,每一個Bank對應27根地址線,尋址能力為128MB,全部8個Bank總的尋址能力為1GB),所以為了最大限度的發揮其性能,內存最好也是32位(指數據寬度)的,(當然,在s3c2410的8個bank中,除了Bank0只能選擇16/32數據位寬外,其余的7個Bank均可以單獨選擇8/16/32位寬的存儲系統)然而市面上很少有32位寬度的單片SDRAM,所以一般都采取兩片16位的SDRAM進行位擴展得到32位的SDRAM
        2.設計電路圖
        2410與K4S561632D相連

        本系統擴展后的內存系統為16M×32Bit的(此處32Bit是指數據位寬度,而非地址位,可以理解SDRAM數據位寬度與地址線的條數無關,明白數據線和地址線的區別,對于下面地址線的連接方式的理解非常重要
        3.初始化程序代碼
        子函數說明:初始化內存控制器
        memsetup:
        mov r1,#MEM_CTL_BASE
        adrl r2,mem_cfg_val
        add r3,r1,#52
        1:
        ldr r4,[r2],#4 @將地址為R2的內存單元數據讀取到R4中,然后r2=r2 +4
        str r4,[r1],#4 @將r4的數據寫入到r1的內存單元,然后r1=r1+4
        cmp r1,r3 @比較R1,R3是否設置完所有的13個寄存器。
        bne 1b @如果沒有復制完,就繼續
        mov pc,lr @復制完后返回,b指令則不行。區別bl。


        @*****************************************************************


        子函數說明:復制代碼到SDRAM,將SRAM中的4K數據全部復制到SDRAM,
        @ SRAM起始地址為0x00000000,SDRAM的起始地址為0x30000000
        @*****************************************************************

        copy_steppingstone_to_sdram:
        mov r1,#0 @設置R1為SRAM的起始地址為0x00000000
        ldr r2,=SDRAM_BASE @設置R2為SDRAM的起始地址為0設置R1為0X300 00000
        mov r3 ,#4*1024 @設置R3為4K
        1:
        ldr r4,[r1],#4 @從SRAM中讀取4字節的數據到R4中,然后r1=r 1+4
        str r4,[r2],#4 @將r4中的4字節數據復制到SDRAM中,然后r2= r2+4
        cmp r1,r3 @判斷是否完成:SRAM的地址是否等于末地址>
        bne 1b @若沒有完成,繼續復制
        mov pc,lr @返回

        .align 4
        @******************************************************
        @存儲控制器13個寄存器的設置值
        @******************************************************
        mem_cfg_val:
        .long 0x22011110 @BWSCON :
        .long 0x00000700 @BANKCON0
        .long 0x00000700 @BANKCON1
        .long 0x00000700 @BANKCON2
        .long 0x00000700 @BANKCON3
        .long 0x00000700 @BANKCON4
        .long 0x00000700 @BANKCON5
        .long 0x00018005 @BANKCON6
        .long 0x00018005 @BANKCON7
        .long 0x008e07a3 @REFRESH
        .long 0x000000b1 @BANKSIZE
        .long 0x00000030 @MRSRB6
        .long 0x00000030 @MRSRB7
        2.擴展為64MB的NAND Flash用作啟動ROM和大容量存儲
        1.需求分析
        NandFlash接口信號較少
        * 數據寬度只有8Bit,沒有地址總線。地址和數據總線復用,串行讀取

        NandFlash地址結構
        * NandFlash設備的存儲容量是以頁(Page)和塊(Block)為單位的。
        * Page=528Byte (512Byte用于存放數據,其余16Byte用于存放其他信息,如塊好壞的標記、塊的邏輯地址、頁內數據的ECC校驗和等)。
        * Block=32Page
        * 容量為64MB的NandFlash存儲結構為:512Byte×32Page×4096Block
        * NandFlash以頁為單位進行讀和編程(寫)操作,一頁為512Byte;以塊為單位進行擦除操作,一塊為512Byte*32page=16KB
        * 對于64MB的NAND設備,需要26根地址線,由于NAND設備數據總線寬度是8位的,因此必須經過4個時鐘周期才能把全部地址信息接收下來
        * 可以這么說,第一個時鐘周期給出的是目標地址在一個page內的偏移量,而后三個時鐘周期給出的是頁地址。
        * 由于一個頁內有512Byte,需要9bit的地址尋址,而第一個時鐘周期只給出了低8bit,最高位A8由不同的讀命令(Read Mode2)來區分的。
        NandFlash的命令

        2.電路圖設計
        擴展芯片:HY57561620


        3.NAND FLASH配置寄存器初始化

        MemCfgInit(); //設置NAND FLASH的配置寄存器
        該函數原型:

        void MemCfgInit(void)
        {
        //rCLKCON |= 0xffff0;

        //enable nand flash control, initilize ecc, chip disable,
        rNFCONF = (1<<15)|(1<<12)|(1<<11)|(7<<8)|(7<<4)|(7);
        }
        使能nand flash控制,初始化,芯片禁能
        1<<15,NFCONF寄存器是NAND FLASH的配置寄存器
        第15位置1,是使能nand flash控制寄存器
        此位在芯片開始工作,自動導入的時候將被自動清零,
        如果想訪問nand flash存儲,該位必須置一。
        14,13位為保留位
        1<<12,第12位置1,初始化ECC,S3C2410僅僅支持512個字節的ECC校驗,
        所以每512個字節,需要設置一次ECC初始化。
        ECC是Error Checking and Correcting,錯誤檢查與校驗
        1<<11,第11位置1,NAND flash nFCE 設置為不活動,即nand flash存儲芯片禁能
        7<<8,即10,9,8位設置為111,
        這3位是CLE ALE信號的持續時間值設置,持續時間=HCLK*(TACLS + 1)
        TACLS即111(b)=7;
        7位為保留位
        7<<4,即6,5,4位設置為111,為TWRPH0 周期設置值,duration=HCLK*
        (TWRPH0+1)
        3位為保留位
        7 位第2,1,0,設置為111,為TWRPH1周期設置值,duration=HCLK*(TWRPH0+1)



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 东海县| 屏山县| 河池市| 阳高县| 江阴市| 中超| 新竹市| 克山县| 宁强县| 桃源县| 稷山县| 岱山县| 永仁县| 正安县| 托里县| 固镇县| 太谷县| 南陵县| 长乐市| 大港区| 嵊州市| 高陵县| 易门县| 宁国市| 新民市| 荃湾区| 涪陵区| 嘉祥县| 明光市| 久治县| 华坪县| 南京市| 大石桥市| 钟山县| 连云港市| 大英县| 察隅县| 于都县| 灵宝市| 克拉玛依市| 周宁县|