#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 另是不是必须用开漏输出,同时接上啦电阻 ?? 如果在读取数据总线的时候在设置为上拉输入,在写数据时在设为开漏输出这样行不行 ???
|