linux 模拟时序,stm32GPIO模拟时序读写nandflash(K9F1G08U0B)问题
我使用的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)问题相关推荐
- linux下IO口模拟I2C的一些总结
2019独角兽企业重金招聘Python工程师标准>>> 以前一直在用I2C接口,因为总是有线程的例子就一直没有去深入的了解,今天分析了一下在linux下通用GPIO模拟I2C的程序. ...
- 2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试
本节提示:本节所需环境:ubuntu 16 / 18工具:VScode.Cmake.openwrt 交叉编译器 2.3 Openwrt 模拟 spi 及其sx1301寄存器读写测试 通过前面两章节的操 ...
- linux下使用TC模拟弱网络环境
linux下使用TC模拟弱网络环境 模拟延迟传输简介 netem 与 tc: netem 是 Linux 2.6 及以上内核版本提供的一个网络模拟功能模块.该功能模块可以用来在性能良好的局域网中,模拟 ...
- python 模拟键盘 linux,在Linux中使用Python模拟键盘按键,linuxpython
在Linux中使用Python模拟键盘按键,linuxpython 之前在做自动化测试中需要用Python在linux中模拟Ctrl+V 进行路径粘贴,试了很多种方法,起初用了xerox和pyperc ...
- DS1302实时时钟及实验【时序定义、数据读写】
RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片. 1.引脚定义和应用电路 2.内部结构 寄存器定义和命令字 寄存器:其中,第一行的CH表示时钟暂停控制位,置1表示 ...
- 嵌入式linux文件系统格式,嵌入式Linux的文件系统分区及数据读写方法与流程
本发明涉及Linux系统的数据存储管理领域,特别是涉及一种基于NANDFlash存储器和UBIFS文件系统的嵌入式Linux的文件系统分区及数据读写方法. 背景技术: ::目前Linux操作系统由于源 ...
- 关于读懂时序图写时序
我们知道,时序图分为理想时序图和实际工作时序图.理想时序忽略了实际高低电平转换时间,而我们实际写程序过程中更希望看到的是实际工作时序图,更清晰明确. 图1 理想时序与实际时序 物理时序图只要保持操作顺 ...
- 什么是模拟光端机?模拟光端机优缺点介绍!
模拟光端机是光端机的一种,主要是采用模拟调频.调幅.调相的方式将基带的视频.音频.数据等信号调制在某一载频上,通过发射光端机进行传输.传输的光信号:模拟光端机发射的光信号是模拟光调制信号,它随输入的模 ...
- FPGA学习(第8节)-Verilog设计电路的时序要点及时序仿真
一个电路能跑到多少M的时钟呢? 这和电路的设计有密切联系(组合逻辑的延时),我们知道电路器件都是由一定延迟的,所以信号的仿真很重要.如果延迟时间大于时钟,就会导致时序违例,出现逻辑错误. 项目要求30 ...
最新文章
- 【BZOJ】4873: [Shoi2017]寿司餐厅
- 谈谈我开发过的几套语音通信解决方案
- 如何把照片正面变成反面_没有锁边机如何做衣服(五种方法)
- uva 1394poj 3517
- vue swiper循环播放无效解决
- oracle层级关系按列存储_几张图看懂列式存储
- Android开源库
- Java 并发 —— volatile 关键字
- 基于ubuntu20.4安装谷歌拼音中文输入法
- 专业商标制作,免费logo在线设计
- Katalon Studio:一款静候你使用的免费自动化测试工具
- 作为泛娱乐圈专属域名,.fans岂能错过这匹年末综艺“黑马”?
- node.js入门之child_process子进程
- 一个比较完整的登陆和注册后台
- 说说Mac上的Shell指令
- 俞敏洪励志演讲稿【三】
- xcode调试 c语言 变量不可见,xcode - 如何在Objective-C中检测未使用的方法和#import...
- spring在项目启动时就执行特定方法
- 百度地图中点击实现标注放大
- c语言程序整数划分源代码,C语言实现整数划分问题
热门文章
- ubuntu vnc 远程连接桌面
- 核心API最佳实践——JDK日志分级
- 桌面记事本软件测试工资,记事本的一个BUG
- 电脑缺失MSVCP110.dll文件
- 产品经理应该掌握的3种金融思维
- linux 权限提示信息,命令行快速提示:权限进阶 | Linux 中国
- linux cmake 安装mysql5.5.11_以及更高版本_linux cmake 安装mysql5.5.11,以及更高版本
- 两个向量之间的夹角公式_关于平面向量夹角求参数取值范围的两种基本解法介绍...
- 用计算机演奏打上花火,米津玄师打上花火歌词中文谐音(最好要简单全面)
- java定义一个course类,求指教定义一个学生类 ,大学生小学生,定义一个选课接口...