由于CPU與FPGA通信的需要,以及對(duì)8080總線的熟悉,首選采用了STM32的FSMC總線,作為片間通信接口。FSMC能達(dá)到16MHz的寫入速度,理論上能寫20fps的1024*768的圖片哈哈。(當(dāng)然實(shí)際上是不可能的,就算是DMA傳輸,數(shù)據(jù)源也跟不上,實(shí)際上刷模擬的圖片每秒10fps,刷的很high)當(dāng)然這不是本篇的要點(diǎn),這里主要研究STM32的FSMC接口,將速度提升到極限。 1. FSMC協(xié)議分析如下為ILI9325的8080接口的協(xié)議 CS(片選信號(hào)):低電平片選有效,高電平失能(默認(rèn)為高:失能) RS(數(shù)據(jù)寄存器):低電平寫寄存器,高電平寫數(shù)據(jù)(默認(rèn)為高:寫數(shù)據(jù))FSMC默認(rèn)為低。。。。 RD(讀信號(hào)) :低電平有效,上升沿寫入數(shù)據(jù),高電平失能(默認(rèn)為高,失能) WR(寫信號(hào)) :低電平有效,上升沿寫入數(shù)據(jù),高電平失能(默認(rèn)為高,失能) FSMC寫SRAM模式如下: (1)讀操作 (2)寫操作 HCLK為系統(tǒng)時(shí)鐘72MHz 綜上,分析出FSMC與8080接口協(xié)議異同點(diǎn) (1)同:CS,RS,RD有效電平都一樣,單個(gè)字節(jié)的寫入與讀取時(shí)序完全一樣 (2)異: A:8080 默認(rèn)RS為高,而FSMC默認(rèn)RS為低 B:8080接口協(xié)議能保持CS,RS等有效,連續(xù)寫數(shù)據(jù),而FSMC以此只能輸出一個(gè)數(shù)據(jù)。 C:8080協(xié)議沒有地址線,而FSMC還有地址線,這使得數(shù)據(jù)輸出不連續(xù)。 2. FSMC時(shí)序研究下圖為FSMC寫命令與數(shù)據(jù)的時(shí)序圖,從中根據(jù)上圖可以分析出FSMC可以實(shí)現(xiàn)16M的數(shù)據(jù)寫入。FSMC的信號(hào)線翻轉(zhuǎn)非常快,這使得IC或者FPGA時(shí)序設(shè)計(jì)上得非常嚴(yán)謹(jǐn)。FSMC最大實(shí)現(xiàn)了72MHz(66.7到100MHz之間,實(shí)際為72MHz,HCLK)的翻轉(zhuǎn)速度,這要求外部器件支持那么高的速率。 寄存器配置(寄存器+數(shù)據(jù)) 連續(xù)數(shù)據(jù)寫入(0xBB:寫數(shù)據(jù)開始),命令后,RS默認(rèn)拉低(FSMC和標(biāo)準(zhǔn)不一樣的地方) 數(shù)據(jù)建立很快 寫數(shù)據(jù),然后默認(rèn)RS拉低 整體的時(shí)序可模擬為: task task_writecmd; input [15:0] cmd; begin mcu_cs = 0; mcu_rs = 0; mcu_data = cmd; #20; mcu_we = 0; #20; mcu_we = 1; #15; mcu_rs = 1; mcu_cs = 1; #20; end endtask task task_writedata; input [15:0] data; begin mcu_cs = 0; mcu_rs = 1; mcu_data = data; #20; mcu_we = 0; #20; mcu_we = 1; #15; mcu_rs = 1; mcu_cs = 1; #20; end endtask 3. FSMC接口初始化根據(jù)手冊(cè),相關(guān)參數(shù)如下表所示。這里我發(fā)現(xiàn)所謂最小值還能設(shè)置為最小,但實(shí)際速度差不多。FSMC協(xié)議時(shí)間參數(shù)如下所示: 有人跟我說,手冊(cè)是保守的;有人跟我說,在小就是默認(rèn)值了。我不太理解。感覺速度每提升,應(yīng)該在小就是默認(rèn)了。不過,反正我追求速度的極限。 以下是FSMC-SRAM模式下的初始化代碼,分享的同時(shí),希望對(duì)你有用。 - /* Private typedef -----------------------------------------------------------*/
- typedef struct
- {
- vu16 LCD_REG;
- vu16 LCD_RAM;
- } LCD_TypeDef;
- #define LCD_WriteCmd(cmd) LCD->LCD_REG = cmd
- #define LCD_WriteData(data) LCD->LCD_RAM = data
- /* LCD is connected to the FSMC_Bank1_NOR/SRAM4 and NE4 is used as ship select signal */
- #define LCD_BASE ((u32)(0x60000000 | 0x0C000000))
- #define LCD ((LCD_TypeDef *) LCD_BASE)
- void LCD_FSMCConfig(void)
- {
- FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
- FSMC_NORSRAMTimingInitTypeDef p;
- /*-- FSMC Configuration ------------------------------------------------------*/
- /*----------------------- SRAM Bank 4 ----------------------------------------*/
- /* FSMC_Bank1_NORSRAM4 configuration */
- //標(biāo)準(zhǔn)
- // p.FSMC_AddressSetupTime = 1;
- // p.FSMC_AddressHoldTime = 2;
- // p.FSMC_DataSetupTime = 2;
- // p.FSMC_BusTurnAroundDuration = 1;
- // p.FSMC_CLKDivision = 1;
- // p.FSMC_DataLatency = 2;
-
- //超快
- p.FSMC_AddressSetupTime = 0;
- p.FSMC_AddressHoldTime = 0;
- p.FSMC_DataSetupTime = 1;
- p.FSMC_BusTurnAroundDuration = 0;
- p.FSMC_CLKDivision = 0;
- p.FSMC_DataLatency = 0;
-
- p.FSMC_AccessMode = FSMC_AccessMode_A;
- /* Color LCD configuration ------------------------------------
- LCD configured as follow:
- - Data/Address MUX = Disable
- - Memory Type = SRAM
- - Data Width = 16bit
- - Write Operation = Enable
- - Extended Mode = Enable
- - Asynchronous Wait = Disable */
- FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
- FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
- FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
- FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
- FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
- FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
- FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
- FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
- FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
- FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
- FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; //2.0
- FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
- FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
- FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
- FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
- /* BANK 4 (of NOR/SRAM Bank 1~4) is enabled */
- FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);
- }
復(fù)制代碼
|