以前用單片機做的,正常工作很長時間,現在想轉到stm32,采用fsmc,外接32K鐵電FM28V020,一直不正常,現象是只能讀出0x100-0x1FF的內容(正確),0x0-0xff也是0x100-0x1ff的內容,然后所有的地址內容不停循環0x100-0x1ff,NADV已經反向給74HC573,初始化程序在后面,
最后,直接用一個F103VET6實驗板,什么都不接,只是下載這個程序,用示波器觀察,發現如下問題
161816fmsm42fquv31vsn4.jpg (1.84 MB, 下載次數: 23)
下載附件
2019-1-24 19:09 上傳
1. PE11(DA8),信號幅值明顯與其他DA0-DA15的幅值低很多 (這個是2V檔)
161819e0htatrmmt55nkn0.jpg (1.71 MB, 下載次數: 26)
下載附件
2019-1-24 19:09 上傳
2.PE13的信號(1V檔)
161821xu08jj883jj5zppi.jpg (1.66 MB, 下載次數: 22)
下載附件
2019-1-24 19:09 上傳
FMSC初始化后,所有DA0-DA15,理論上引腳信號幅值應該是一樣的,為什么PF11就不一樣?,最后只有在PE11上上拉一個2K電阻,信號幅值就上去了,如果對PE11采用IO模式,Out_PP輸出,信號幅值很正常
PCB原理圖
162933uovz33o1f3xfxiio.jpg (174.52 KB, 下載次數: 19)
下載附件
2019-1-24 19:09 上傳
ALE已經反向輸出到573的
現在是用的什么都不掛接的實驗板,信號還是一樣,說明是F103VE自身的問題,這個怎么解釋,如果FSMC初始化不正確,為什么0x100-0x1FF的內容寫入和讀出都是正確的?只是所有地址數據都是在0X100-0X1FF循環
FMSC程序
//初始化外部SRAM
void FSMC_SRAM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO, ENABLE);
/* Enable FSMC, GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.07(NE1) PD.08(D13), PD.09(D14),
PD.10(D15), PD.14(D0), PD.15(D1) as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 | GPIO_Pin_11 |
GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15 ;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
PE.14(D11), PE.15(D12) as alternate function push pull */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure);
p.FSMC_AddressSetupTime = 5;
p.FSMC_AddressHoldTime = 5;
p.FSMC_DataSetupTime = 15;
p.FSMC_BusTurnAroundDuration = 5;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_B;(改過D,一樣現象)
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Enable;
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR; (改過PSRAM,一樣現象)
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_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_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC Bank4_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
是庫函數初始化有問題嗎?
|