| #define CLR_WE()    {GPIO_ResetBits(GPIOE,GPIO_Pin_14);} #define SET_WE()    {GPIO_SetBits(GPIOE,GPIO_Pin_14);}
 #define CLR_RE()    {GPIO_ResetBits(GPIOD,GPIO_Pin_10);}
 #define SET_RE()    {GPIO_SetBits(GPIOD,GPIO_Pin_10);}
 #define CLR_CE()    {GPIO_ResetBits(GPIOB,GPIO_Pin_11);}
 #define SET_CE()    {GPIO_SetBits(GPIOB,GPIO_Pin_11);}
 #define CLR_ALE()   {GPIO_ResetBits(GPIOE,GPIO_Pin_15);}
 #define SET_ALE()   {GPIO_SetBits(GPIOE,GPIO_Pin_15);}
 #define CLR_CLE()   {GPIO_ResetBits(GPIOB,GPIO_Pin_10);}
 #define SET_CLE()   {GPIO_SetBits(GPIOE,GPIO_Pin_10);}
 
 u8 Maker_ID = 0;
 u8 Device_ID= 0;
 u8 Third_ID;
 u8 Fourth_ID;
 u8 Fifth_ID;
 
 
 #define PAGE_SIZE (2*1024+64)
 u8 verify_Buf[PAGE_SIZE];
 
 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);
 
 /*数据口低四位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);
 
 /*数据口高4位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);
 }
 
 
 void Write_Byte(u8 byte)
 {
 
 GPIOC->ODR  = GPIOC->ODR&0x0000FC3F|((byte&0xF0)<<2);
 GPIOD->ODR  = GPIOD->ODR&0x00000FFF|((byte&0x0f)<<12);
 delay_us();
 }
 
 /*读取输入数据前要写0xff */
 u8 Read_Byte(void)
 {
 u8 byte = 0;
 Write_Byte(0xff);
 
 
 byte  = (u8)(((GPIOC->IDR>>2)&0xf0)|((GPIOD->IDR>>12)&0x0f));
 delay_us();
 return byte;
 }
 
 u8  RB_State(void)
 {
 delay_us();
 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)
 {
 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);
 }
 ************************************************************
 我这个程序是不是有问题 ?
 我用了开漏输出,并在输入前输出0xff(write_byte(0xff))读取不到ID,读写数据也不行,都输入的数据都为0XFF
 另是不是必须用开漏输出,同时接上啦电阻 ??
 如果在读取数据总线的时候在设置为上拉输入,在写数据时在设为开漏输出这样行不行 ???
 |