OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8883|回复: 8

stm32GPIO模拟时序读写nandflash(K9F1G08U0B)问题

[复制链接]

22

主题

57

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
291
金钱
291
注册时间
2013-11-6
在线时间
31 小时
发表于 2014-2-14 13:08:02 | 显示全部楼层 |阅读模式
我使用的STM32F103VBT6这款芯片,K9F1G08U0B和 STM32F103VBT6连接接口有如下对应关系:
ALE——PA1
WE——PA2  
WP——PA3
R\B——PC0
RE——PC1
CE——PC2 
CLE——PC3

8位IO口对应PE0——PE7
下面4个函数,对应的是读取设备的ID,我在main函数里调用函数Nand_Flash_ReadDeviceID();
则会从串口打印出DeviceID = ec f1 0 95 40,这个设备ID号是正确的。问题在下面。
/***************************
写指令函数
***************************/
void Nand_FlashCommandLatch(uint8_t CommandTypes)
{

Data_PortOutputMode();
Flash_CE_Low;
Flash_CLE_Low;
Flash_ALE_Low;
Flash_WE_High;
Flash_CLE_High;
Flash_WE_Low;
Data_Output(CommandTypes);
Flash_WE_High;
Flash_CLE_Low;
Flash_ALE_High;
Flash_CE_High;
}
/****************************
设置地址函数
****************************/
void Nand_Flash_Write_Address(uint32_t Address)
{
Data_PortOutputMode();

Flash_CE_Low;
Flash_CLE_Low;
Flash_WE_High;
Flash_ALE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address));
Flash_WE_High;
Flash_ALE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address >> 8) & 0x0f);
Flash_WE_High;
Flash_ALE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address >> 12) & 0xFF);
Flash_WE_High;
Flash_ALE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address >> 20) & 0xFF);
Flash_WE_High;
Flash_ALE_Low;
Flash_CE_High;
}
/*******************************
用来读设备的ID
*******************************/
void Nand_FlashReadData(uint8_t *pBuffer,uint32_t rd_Length)
{
uint32_t i = 0;
Data_PortInputMode();
Flash_CE_Low;
while(rd_Length--)
{
Flash_RE_Low;
*(pBuffer + i) = Data_Input;
Flash_RE_High;
i++;
}
Flash_RE_High;
Flash_CE_High;

}
/*读设备ID函数*/
void Nand_Flash_ReadDeviceID(void)
{

uint8_t array[5];
Nand_FlashCommandLatch(0x90);
Nand_Flash_Write_Address(0x00);
Nand_FlashReadData(array,5);
printf("DeviceID = %x %x %x %x %x\r\n",array[0],array[1],array[2],array[3],array[4]);
}

下面的两个函数分别是向一页中写数据的函数和从一页中读出数据,我是对照K9F1G08U0D数据手册中Page Program Operation的时序和Read Operation的时序写的, 虽然我用的是K9F1G08U0B,但我觉得这两个应该时序上差别,我在main函数里面执行红色标记的代码,从串口打印出的数据如下:
Nand_FlashPage_Program is Error
Page 0 data:0xff 0x1e 0xf0 0x0 0x7 0x0 0xe0 0x0 0x7 0x18

而我写入的数据为 uint8_t arr[]="0123456789";

哪位大侠遇到过这样的问题,帮小弟解决一下,到底我的写错在哪里还是我的操作顺序有问题呢?



/****************************
向某一页中写数据
****************************/

bool Nand_FlashPage_Program(uint32_t PageNumber,uint8_t *string)
{
uint8_t regvalue = 0;
uint32_t i=2048,j=0;
uint32_t Address = PageNumber*2048;
uint8_t *pBuffer=string;
Data_PortOutputMode();
Flash_CE_Low;
Flash_ALE_Low;
Flash_RE_High;
Flash_CLE_High;
Flash_WE_Low;
Data_Output(0x80);
Flash_WE_High;
Flash_CLE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output((Address));
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 8) & 0x0F);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 12) & 0xFF);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 20) & 0xFF);
Flash_WE_High;
Flash_ALE_Low;

while(i--)
{
Flash_WE_Low;
Data_Output(*(pBuffer + j));
Flash_WE_High;
j++;
}
Flash_WE_Low;
Flash_CLE_High;
Data_Output(0x10);
Flash_WE_High;
Flash_Wait();
Flash_WE_Low;
Data_Output(0x70);
Flash_WE_High;
Flash_CLE_Low;
Data_PortInputMode();
Flash_RE_Low;
regvalue = Data_Input;
Flash_RE_High;
if(!( (1 << 0) & regvalue))
{

return TRUE;
}
else
{
return FALSE;
}
}
/*********************
从一页中读出数据
*********************/

void Nand_Flash_ReadOnePage(uint32_t sc_address,uint8_t *string)
{
uint32_t Address = 2048*sc_address;
uint32_t i=2048,j=0;
uint8_t dat;
Data_PortOutputMode();
//Flash_CLE_Low;
//Flash_CE_High;
//Flash_WE_High;
Flash_CE_Low;
Flash_ALE_Low;
Flash_RE_High;
Flash_CLE_High;
Flash_WE_Low;
Data_Output(0x00);
Flash_WE_Low;
Flash_WE_High;
Flash_CLE_Low;
Flash_ALE_High;
Flash_WE_Low;
Data_Output(Address);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 8) & 0x0F);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 12) & 0xFF);
Flash_WE_High;
Flash_WE_Low;
Data_Output((Address >> 20) & 0xFF);
Flash_WE_High;
Flash_ALE_Low;
Flash_CLE_High;
Flash_WE_Low;
Data_Output(0x30);
Flash_WE_High;
Flash_CLE_Low;
Flash_Wait();
Data_PortInputMode();
while(i--)
{
Flash_RE_Low;
*(string+j) = Data_Input;
Flash_Delay(c_FlashDelayCnt);
Flash_RE_High;
Flash_Delay(c_FlashDelayCnt);
}
}


int main(void)
 {
uint8_t array[2112],i;
bool Is_ok;
        Init_RCC();
delay_init(64);     //延时函数初始化  
NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200);
Nandflash_Init();

Is_ok = Nand_FlashPage_Program(0x00,arr);
if(Is_ok==TRUE)
printf("Nand_FlashPage_Program is Successful\r\n");
else 
printf("Nand_FlashPage_Program is Error\r\n");

while(1)
{
Nand_Flash_ReadOnePage(0x00,array);
printf("Page 0 data:");
for(i=0;i<10;i++)
{
printf("0x%x ",array);
}
printf("\r\n");
delay_ms(1000);  
}
 }

这是我的nandflash初始化函数
void Nandflash_Init()
{
GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);  
  GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;   
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOC, &GPIO_InitStructure);  
  GPIO_SetBits(GPIOC,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;  
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIOE->CRL = 0x33333333;
Flash_WP_High;
}




K9F1G08U0D_0.0.pdf

642.47 KB, 下载次数: 844

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165516
金钱
165516
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-2-14 14:48:51 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
24
金钱
24
注册时间
2014-5-14
在线时间
0 小时
发表于 2014-9-26 17:05:37 | 显示全部楼层
关注中,我想用这个Nandflash
回复 支持 反对

使用道具 举报

6

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2014-6-6
在线时间
14 小时
发表于 2015-6-12 10:04:05 | 显示全部楼层
你要是ID能读出来,基本时序问题不是太大。
不过写数据之前是要擦除的,我看你程序写完就读了 
回复 支持 反对

使用道具 举报

22

主题

92

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
446
金钱
446
注册时间
2014-4-7
在线时间
53 小时
发表于 2016-9-9 08:51:09 | 显示全部楼层
LZ   有没有搞出来呀    能不能 发给我一份   让我学习学习,QQ:916208723@qq。com  谢谢!!!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
30
金钱
30
注册时间
2018-6-6
在线时间
6 小时
发表于 2018-6-6 09:24:57 | 显示全部楼层
您好  能不能发份资料现在正在调试驱动,15165073007@163.com  非常感谢!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-2-18
在线时间
6 小时
发表于 2019-3-5 09:56:57 | 显示全部楼层
你好!我现在很需要这份资料,请问能发我一下吗?1225093964@qq.com,谢谢啊
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2019-2-18
在线时间
6 小时
发表于 2019-3-5 09:57:20 | 显示全部楼层
Eaten 发表于 2018-6-6 09:24
您好  能不能发份资料现在正在调试驱动,  非常感谢!

请问你收到了吗?能不能也发我一下?
回复 支持 反对

使用道具 举报

7

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2019-1-30
在线时间
74 小时
发表于 2020-2-8 13:43:08 | 显示全部楼层
keykay 发表于 2015-6-12 10:04
你要是ID能读出来,基本时序问题不是太大。
不过写数据之前是要擦除的,我看你程序写完就读了&nbsp;

ID只需要发命令,但读写Page要发送地址,FMC问题就是要配置时序……
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-20 08:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表