打印

请问模拟总线方式连接nandflash,GPIOIO口用什么模式 ?

[复制链接]
5069|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
KUA_MAX|  楼主 | 2009-5-19 18:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我需要用STM32的IO口模拟总线方式驱动nandflash,对控制线和数据线该用什么方式连接啊?
我看到stm32上FSMC的控制线都是复用推免输出,而RB使用输入上拉,模拟总线也是用这种方式吗 ?
另地址和数据总线输出地址和数据用什么方式啊 ?输入数据的话又该用那种方式啊???
麻烦知道的告诉下。谢谢了
沙发
浪淘沙| | 2009-5-19 18:49 | 只看该作者

是的,控制线用推挽输出,RB使用输入上拉,数据总线可以用

RB最好再加一个外部上拉,提高抗干扰能力。

数据总线可以用OD输出同时外加上拉。写入输出寄存器可以输出数据;输入数据前,需要先输出0xFF,然后读取输入寄存器即可。

使用特权

评论回复
板凳
kua_max| | 2009-5-19 19:28 | 只看该作者

3Q

3Q

使用特权

评论回复
地板
kua_max| | 2009-5-21 09:44 | 只看该作者

选用了开漏不行啊

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

使用特权

评论回复
5
251158793| | 2013-4-2 09:03 | 只看该作者
一定需要读取ID嘛?

使用特权

评论回复
6
251158793| | 2013-4-2 09:07 | 只看该作者
最近我也在弄IO口模拟nand flash用的是STM32F4系列, 就是发现读数据时候有些问题,我是直接读取16位数据,然后取高8位,读出的数据不对,兄弟有研究过这不?

使用特权

评论回复
7
solawc| | 2019-5-21 10:46 | 只看该作者
兄弟,你搞定了么?能否给我看看参考代码我搞不完

使用特权

评论回复
8
gwsan| | 2019-5-24 09:34 | 只看该作者
是不是用普通的上拉就可以啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

113

帖子

3

粉丝