我使用的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;

}

linux 模拟时序,stm32GPIO模拟时序读写nandflash(K9F1G08U0B)问题相关推荐

  1. linux下IO口模拟I2C的一些总结

    2019独角兽企业重金招聘Python工程师标准>>> 以前一直在用I2C接口,因为总是有线程的例子就一直没有去深入的了解,今天分析了一下在linux下通用GPIO模拟I2C的程序. ...

  2. 2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试

    本节提示:本节所需环境:ubuntu 16 / 18工具:VScode.Cmake.openwrt 交叉编译器 2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试 通过前面两章节的操 ...

  3. linux下使用TC模拟弱网络环境

    linux下使用TC模拟弱网络环境 模拟延迟传输简介 netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块.该功能模块可以用来在性能良好的局域网中,模拟 ...

  4. python 模拟键盘 linux,在Linux中使用Python模拟键盘按键,linuxpython

    在Linux中使用Python模拟键盘按键,linuxpython 之前在做自动化测试中需要用Python在linux中模拟Ctrl+V 进行路径粘贴,试了很多种方法,起初用了xerox和pyperc ...

  5. DS1302实时时钟及实验【时序定义、数据读写】

    RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片. 1.引脚定义和应用电路 2.内部结构 寄存器定义和命令字 寄存器:其中,第一行的CH表示时钟暂停控制位,置1表示 ...

  6. 嵌入式linux文件系统格式,嵌入式Linux的文件系统分区及数据读写方法与流程

    本发明涉及Linux系统的数据存储管理领域,特别是涉及一种基于NANDFlash存储器和UBIFS文件系统的嵌入式Linux的文件系统分区及数据读写方法. 背景技术: ::目前Linux操作系统由于源 ...

  7. 关于读懂时序图写时序

    我们知道,时序图分为理想时序图和实际工作时序图.理想时序忽略了实际高低电平转换时间,而我们实际写程序过程中更希望看到的是实际工作时序图,更清晰明确. 图1 理想时序与实际时序 物理时序图只要保持操作顺 ...

  8. 什么是模拟光端机?模拟光端机优缺点介绍!

    模拟光端机是光端机的一种,主要是采用模拟调频.调幅.调相的方式将基带的视频.音频.数据等信号调制在某一载频上,通过发射光端机进行传输.传输的光信号:模拟光端机发射的光信号是模拟光调制信号,它随输入的模 ...

  9. FPGA学习(第8节)-Verilog设计电路的时序要点及时序仿真

    一个电路能跑到多少M的时钟呢? 这和电路的设计有密切联系(组合逻辑的延时),我们知道电路器件都是由一定延迟的,所以信号的仿真很重要.如果延迟时间大于时钟,就会导致时序违例,出现逻辑错误. 项目要求30 ...

最新文章

  1. 【BZOJ】4873: [Shoi2017]寿司餐厅
  2. 谈谈我开发过的几套语音通信解决方案
  3. 如何把照片正面变成反面_没有锁边机如何做衣服(五种方法)
  4. uva 1394poj 3517
  5. vue swiper循环播放无效解决
  6. oracle层级关系按列存储_几张图看懂列式存储
  7. Android开源库
  8. Java 并发 —— volatile 关键字
  9. 基于ubuntu20.4安装谷歌拼音中文输入法
  10. 专业商标制作,免费logo在线设计
  11. Katalon Studio:一款静候你使用的免费自动化测试工具
  12. 作为泛娱乐圈专属域名,.fans岂能错过这匹年末综艺“黑马”?
  13. node.js入门之child_process子进程
  14. 一个比较完整的登陆和注册后台
  15. 说说Mac上的Shell指令
  16. 俞敏洪励志演讲稿【三】
  17. xcode调试 c语言 变量不可见,xcode - 如何在Objective-C中检测未使用的方法和#import...
  18. spring在项目启动时就执行特定方法
  19. 百度地图中点击实现标注放大
  20. c语言程序整数划分源代码,C语言实现整数划分问题

热门文章

  1. ubuntu vnc 远程连接桌面
  2. 核心API最佳实践——JDK日志分级
  3. 桌面记事本软件测试工资,记事本的一个BUG
  4. 电脑缺失MSVCP110.dll文件
  5. 产品经理应该掌握的3种金融思维
  6. linux 权限提示信息,命令行快速提示:权限进阶 | Linux 中国
  7. linux cmake 安装mysql5.5.11_以及更高版本_linux cmake 安装mysql5.5.11,以及更高版本
  8. 两个向量之间的夹角公式_关于平面向量夹角求参数取值范围的两种基本解法介绍...
  9. 用计算机演奏打上花火,米津玄师打上花火歌词中文谐音(最好要简单全面)
  10. java定义一个course类,求指教定义一个学生类 ,大学生小学生,定义一个选课接口...