GPIO_InitTypeDef GPIO_InitStructure; void Flash_Init(void) { /*ALE PE15 WE PE14 推免输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOE, &GPIO_InitStructure); /*CLE PB10 CE PB11*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); /*RE PD10*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOD, &GPIO_InitStructure); /*R/B PD11*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOD, &GPIO_InitStructure); } void Write_Byte(u8 byte) { /*PD12 -- PD15 IO(L)开漏输出*/ GPIO_InitStructure.GPIO_Pin = 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_Out_OD; GPIO_Init(GPIOD, &GPIO_InitStructure); /*PC6 -- PC9 IO(H)开漏输出*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIOC->ODR = GPIOC->ODR&0x0000FC3F|((byte&0xF0)ODR&0x00000FFF|((byte&0x0f)>2)&0xf0)|((GPIOD->IDR>>12)&0x0f)); return byte; } u8 RB_State(void) { while(GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_11) == 0); return 1; } void Write_CMD(u8 cmd) { CLR_ALE(); CLR_CE(); SET_CLE(); CLR_WE(); Write_Byte(cmd); SET_WE(); CLR_CLE(); SET_ALE(); } void Write_Data(u8 data) { Write_Byte(0xFF); SET_WE(); CLR_CLE(); CLR_CE(); CLR_ALE(); CLR_WE(); while(RB_State() != 1); Write_Byte(data); while(RB_State() != 1); SET_WE(); } u8 Read_Data(void) { u8 data; Write_Byte(0xFF); SET_WE(); CLR_CLE(); CLR_ALE(); CLR_CE(); CLR_RE(); while(RB_State() != 1); data = Read_Byte(); while(RB_State() != 1); CLR_RE(); return data; } void Write_ADDR(u8 addr) { SET_WE(); CLR_CE(); CLR_CLE(); SET_ALE(); CLR_WE(); Write_Byte(addr); SET_WE(); while(RB_State() != 1); CLR_ALE(); } /********************************************/ u8 Read_ID(void) { Maker_ID = 0; Write_CMD(0x90); Write_ADDR(0x00); Maker_ID = Read_Data(); Device_ID = Read_Data(); Third_ID = Read_Data(); Fourth_ID = Read_Data(); Fifth_ID = Read_Data(); return Device_ID; } void Flash_Reset(void) { Write_CMD(0XFF); while(RB_State() != 1); } **************************************************************************************************** 上面是我的程序,我用的GPIO模拟总线方式连接三星的nandflash,但程序无法读取到ID,读写page也不行,帮我分析下问题出那个地方了啊,谢谢了 另我的数据线和stm32连接没上拉,我直接用上拉输入,不知道问题是不是这里,输出配置的是推免; 另我的板子上没上拉,所以我无法用开漏输出实现普通的IO功能。 附件中的是的程序 |
FLASH_V4.rar
下载266 KB, 下载次数: 14, 下载积分: ST金币 -1
回复:高手们,帮我看下我这个nandflash驱动程序为什么无法读取到ID
RE:高手们,帮我看下我这个nandflash驱动程序为什么无法读取到ID
RE:高手们,帮我看下我这个nandflash驱动程序为什么无法读取到ID