三星K9F1G08U0E(128MB,NAND FLASH) STM32平台驱动程序(模拟时序)
STM32平台下模拟时序驱动K9F1G08U0E,主要目的为了解、学习NAND FLASH的功能特性,没有使用STM32的FSMC(火龙开发板硬件为模拟时序驱动),纯粹自娱自乐,如对你有帮助,不胜荣幸,呵呵。
C文件内容:
1 #include "NAND512W3A2C.h" 2 /* 3 作者:毕小乐 4 日期:2019.01.24 5 版本:V1.00 6 7 驱动代码针对K9F1G08U0E时序而写,K9F1G08U0E与NAND512W3A2C,Pin to Pin兼容。 8 驱动运行平台STM32F103。 9 驱动实现功能: 10 1)Page Read 11 2) Page Program 12 3) Block Erase 13 4) Read Status 14 5) Read ID 15 PE0~PE7 -> DB00~DB07 16 PD6 -> CL 17 PD5 -> AL 18 PD14 -> W 19 PD15 -> R 20 PD7 -> CS 21 PB5 -> R/B 22 */ 23 static void NAND512_Delay_uS(int tick) 24 { 25 int i; 26 while(tick>0) 27 { 28 tick--; 29 for(i=0;i<10;i++) 30 __nop(); 31 } 32 } 33 void NAND512_DB_OutPut(void) 34 { 35 GPIO_InitTypeDef GPIO_InitStructure; 36 37 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 38 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; 39 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 40 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 41 GPIO_Init(GPIOE, &GPIO_InitStructure); 42 } 43 void NAND512_DB_InPut(void) 44 { 45 GPIO_InitTypeDef GPIO_InitStructure; 46 47 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 48 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; 49 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 50 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; 51 GPIO_Init(GPIOE, &GPIO_InitStructure); 52 } 53 char NAND512_DB_Read(void) 54 { 55 char dat; 56 NAND512_DB_InPut(); 57 __nop(); 58 dat = GPIO_ReadInputData(GPIOE) & 0x00FF; 59 return dat; 60 } 61 void NAND512_DB_Write(char Data) 62 { 63 u16 temp; 64 NAND512_DB_OutPut(); 65 // __nop(); 66 temp = GPIO_ReadOutputData(GPIOE) & 0xFF00; 67 temp = temp | Data; 68 GPIO_Write(GPIOE,temp); 69 return; 70 } 71 void NAND512_IO_Init(void) 72 { 73 GPIO_InitTypeDef GPIO_InitStructure; 74 75 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD 76 | RCC_APB2Periph_GPIOE, ENABLE); 77 78 /*CL*/ 79 GPIO_InitStructure.GPIO_Pin = NAND512_CL_PIN; 80 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 81 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 82 GPIO_Init(NAND512_CL_PORT, &GPIO_InitStructure); 83 84 /*AL*/ 85 GPIO_InitStructure.GPIO_Pin = NAND512_AL_PIN; 86 GPIO_Init(NAND512_AL_PORT, &GPIO_InitStructure); 87 88 /*W*/ 89 GPIO_InitStructure.GPIO_Pin = NAND512_W_PIN; 90 GPIO_Init(NAND512_W_PORT, &GPIO_InitStructure); 91 92 /*R*/ 93 GPIO_InitStructure.GPIO_Pin = NAND512_R_PIN; 94 GPIO_Init(NAND512_R_PORT, &GPIO_InitStructure); 95 96 /*CE*/ 97 GPIO_InitStructure.GPIO_Pin = NAND512_CE_PIN; 98 GPIO_Init(NAND512_CE_PORT, &GPIO_InitStructure); 99 100 /*R/B*/ 101 GPIO_InitStructure.GPIO_Pin = NAND512_RB_PIN; 102 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 103 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 104 GPIO_Init(NAND512_RB_PORT, &GPIO_InitStructure); 105 106 NAND512_CL_LOW; 107 NAND512_AL_LOW; 108 NAND512_R_HIGH; 109 NAND512_W_HIGH; 110 NAND512_CE_HIGH; 111 } 112 113 //读状态寄存器信息 114 char NAND512_Read_Status(void) 115 { 116 char dat; 117 118 NAND512_CL_LOW; 119 NAND512_W_HIGH; 120 NAND512_R_HIGH; 121 NAND512_CE_HIGH; 122 NOP; 123 124 NAND512_Delay_uS(5); 125 NAND512_CL_HIGH; 126 NOP; 127 NOP; 128 NAND512_CE_LOW; 129 NOP; 130 NOP; 131 NOP; 132 NAND512_W_LOW; 133 NAND512_DB_Write(0x70); 134 NOP; 135 NAND512_W_HIGH; 136 137 NAND512_Delay_uS(5); 138 NAND512_CL_LOW; 139 NOP; 140 NOP; 141 //CE状态保持不变 142 143 NAND512_Delay_uS(10); 144 NAND512_R_LOW; 145 NOP; 146 dat = NAND512_DB_Read(); 147 NAND512_Delay_uS(5); 148 NAND512_R_LOW; 149 NAND512_Delay_uS(5); 150 NAND512_CE_HIGH; 151 NAND512_Delay_uS(20); 152 153 return dat; 154 } 155 156 void NAND512_Read_ID(char* Buf) 157 { 158 char i = 0; 159 160 NAND512_CL_LOW; 161 NAND512_AL_LOW; 162 NAND512_R_HIGH; 163 NAND512_W_HIGH; 164 NAND512_CE_HIGH; 165 NAND512_Delay_uS(5); 166 167 NAND512_CL_HIGH; 168 NAND512_W_LOW; 169 NAND512_Delay_uS(5); 170 NAND512_CE_LOW; 171 NAND512_DB_Write(0x90); 172 NAND512_Delay_uS(5); 173 NAND512_W_HIGH; 174 NAND512_Delay_uS(5); 175 176 NAND512_CL_LOW; 177 NAND512_Delay_uS(20); 178 NAND512_AL_HIGH; 179 NAND512_Delay_uS(20); 180 NAND512_W_LOW; 181 NAND512_DB_Write(0x00); //写地址0 182 NAND512_Delay_uS(5); 183 NAND512_W_HIGH; 184 NAND512_Delay_uS(10); 185 NAND512_AL_LOW; 186 NAND512_Delay_uS(20); 187 188 for(i=0;i<5;i++) 189 { 190 NAND512_R_LOW; 191 NAND512_Delay_uS(10); 192 Buf[i] = NAND512_DB_Read(); 193 NAND512_R_HIGH; 194 NAND512_Delay_uS(10); 195 } 196 197 return ; 198 } 199 200 void NAND512_Page_Read(char* Buf,int Len,int Add) 201 { 202 int Bank_Index,Page_Index,Page_Start_Add; 203 int Add_New,j; 204 char i; 205 206 Bank_Index = Add / BANK_SIZE; 207 Page_Index = (Add % BANK_SIZE) / PAGE_SIZE; 208 Page_Start_Add = Add % PAGE_SIZE; 209 Add_New = (((Bank_Index<<6) | Page_Index)<<16) | Page_Start_Add; 210 211 NAND512_CL_LOW; 212 NAND512_AL_LOW; 213 NAND512_W_HIGH; 214 NAND512_R_HIGH; 215 NAND512_CE_HIGH; 216 NAND512_Delay_uS(10); 217 218 NAND512_CE_LOW; 219 NAND512_Delay_uS(5); 220 NAND512_CL_HIGH; 221 NAND512_W_LOW; 222 NAND512_DB_Write(0x00); 223 NAND512_Delay_uS(5); 224 NAND512_W_HIGH; 225 NAND512_Delay_uS(5); 226 NAND512_CL_LOW; 227 NAND512_Delay_uS(5); 228 NAND512_AL_HIGH; 229 NAND512_Delay_uS(5); 230 231 //发送地址 232 for(i=0;i<4;i++) 233 { 234 NAND512_W_LOW; 235 NAND512_Delay_uS(5); 236 NAND512_DB_Write(Add_New>>8*i); 237 NAND512_Delay_uS(10); 238 NAND512_W_HIGH; 239 NAND512_Delay_uS(10); 240 } 241 NAND512_AL_LOW; 242 NAND512_Delay_uS(5); 243 NAND512_CL_HIGH; 244 NAND512_Delay_uS(5); 245 NAND512_W_LOW; 246 NAND512_Delay_uS(5); 247 NAND512_DB_Write(0x30); 248 NAND512_Delay_uS(5); 249 NAND512_W_HIGH; 250 NAND512_Delay_uS(5); 251 NAND512_CL_LOW; 252 NAND512_Delay_uS(5); 253 254 while(NAND512_RB_STATUS == 0); 255 NAND512_Delay_uS(5); 256 257 for(j=0;j<Len;j++) 258 { 259 NAND512_R_LOW; 260 NAND512_Delay_uS(5); 261 Buf[j] = NAND512_DB_Read(); 262 NAND512_Delay_uS(5); 263 NAND512_R_HIGH; 264 NAND512_Delay_uS(10); 265 } 266 267 return; 268 } 269 270 char NAND512_Page_Write(char* Buf,int Len,int Add) 271 { 272 int Bank_Index,Page_Index,Page_Start_Add; 273 int Add_New,j; 274 char i,Status; 275 276 Bank_Index = Add / BANK_SIZE; 277 Page_Index = (Add % BANK_SIZE) / PAGE_SIZE; 278 Page_Start_Add = Add % PAGE_SIZE; 279 Add_New = (((Bank_Index<<6) | Page_Index)<<16) | Page_Start_Add; 280 281 NAND512_CL_LOW; 282 NAND512_AL_LOW; 283 NAND512_W_HIGH; 284 NAND512_R_HIGH; 285 NAND512_CE_HIGH; 286 NAND512_Delay_uS(10); 287 288 NAND512_CE_LOW; 289 NAND512_Delay_uS(5); 290 NAND512_CL_HIGH; 291 NAND512_W_LOW; 292 NAND512_DB_Write(0x80); 293 NAND512_Delay_uS(5); 294 NAND512_W_HIGH; 295 NAND512_Delay_uS(5); 296 NAND512_CL_LOW; 297 NAND512_Delay_uS(5); 298 NAND512_AL_HIGH; 299 NAND512_Delay_uS(5); 300 301 //发送地址 302 for(i=0;i<4;i++) 303 { 304 NAND512_W_LOW; 305 NAND512_Delay_uS(5); 306 NAND512_DB_Write(Add_New>>8*i); 307 NAND512_Delay_uS(10); 308 NAND512_W_HIGH; 309 NAND512_Delay_uS(10); 310 } 311 NAND512_AL_LOW; 312 NAND512_Delay_uS(5); 313 314 for(j=0;j<Len;j++) 315 { 316 NAND512_W_LOW; 317 NAND512_Delay_uS(5); 318 NAND512_DB_Write(Buf[j]); 319 NAND512_Delay_uS(5); 320 NAND512_W_HIGH; 321 NAND512_Delay_uS(10); 322 } 323 324 NAND512_CL_HIGH; 325 NAND512_Delay_uS(5); 326 NAND512_W_LOW; 327 NAND512_Delay_uS(5); 328 NAND512_DB_Write(0x10); 329 NAND512_Delay_uS(5); 330 NAND512_W_HIGH; 331 NAND512_Delay_uS(5); 332 333 while(NAND512_RB_STATUS == 0); 334 NAND512_Delay_uS(5); 335 336 Status = NAND512_Read_Status(); 337 338 if((Status & 0x01) == 0) 339 return 1; 340 else 341 return 0; 342 } 343 344 char NAND512_Block_Erase(int Add) 345 { 346 int Bank_Index,Page_Index; 347 int Add_New; 348 char i,Status; 349 350 Bank_Index = Add / BANK_SIZE; 351 Page_Index = (Add % BANK_SIZE) / PAGE_SIZE; 352 Add_New = (Bank_Index<<6) | Page_Index; 353 354 NAND512_CL_LOW; 355 NAND512_AL_LOW; 356 NAND512_W_HIGH; 357 NAND512_R_HIGH; 358 NAND512_CE_HIGH; 359 NAND512_Delay_uS(10); 360 361 NAND512_CE_LOW; 362 NAND512_Delay_uS(5); 363 NAND512_CL_HIGH; 364 NAND512_W_LOW; 365 NAND512_DB_Write(0x60); 366 NAND512_Delay_uS(5); 367 NAND512_W_HIGH; 368 NAND512_Delay_uS(5); 369 NAND512_CL_LOW; 370 NAND512_Delay_uS(5); 371 NAND512_AL_HIGH; 372 NAND512_Delay_uS(5); 373 374 //发送地址 375 for(i=0;i<2;i++) 376 { 377 NAND512_W_LOW; 378 NAND512_Delay_uS(5); 379 NAND512_DB_Write(Add_New>>8*i); 380 NAND512_Delay_uS(10); 381 NAND512_W_HIGH; 382 NAND512_Delay_uS(10); 383 } 384 NAND512_AL_LOW; 385 NAND512_Delay_uS(5); 386 387 NAND512_CL_HIGH; 388 NAND512_Delay_uS(5); 389 NAND512_W_LOW; 390 NAND512_Delay_uS(5); 391 NAND512_DB_Write(0xD0); 392 NAND512_Delay_uS(5); 393 NAND512_W_HIGH; 394 NAND512_Delay_uS(5); 395 NAND512_CL_LOW; 396 NAND512_Delay_uS(5); 397 398 while(NAND512_RB_STATUS == 0); 399 NAND512_Delay_uS(5); 400 401 Status = NAND512_Read_Status(); 402 403 if((Status & 0x01) == 0) 404 return 1; 405 else 406 return 0; 407 }
H文件内容:
1 #ifndef NAND512W3A2C__H 2 #define NAND512W3A2C__H 3 4 #include "stm32f10x.h" 5 6 #define NAND512_CL_PORT GPIOD 7 #define NAND512_AL_PORT GPIOD 8 #define NAND512_W_PORT GPIOD 9 #define NAND512_R_PORT GPIOD 10 #define NAND512_CE_PORT GPIOD 11 #define NAND512_RB_PORT GPIOB 12 #define NAND512_WP_PORT /*GPIOD*/ 13 14 #define NAND512_CL_PIN GPIO_Pin_6 15 #define NAND512_AL_PIN GPIO_Pin_5 16 #define NAND512_W_PIN GPIO_Pin_14 17 #define NAND512_R_PIN GPIO_Pin_15 18 #define NAND512_CE_PIN GPIO_Pin_7 19 #define NAND512_RB_PIN GPIO_Pin_5 20 #define NAND512_WP_PIN /*GPIO_Pin_5*/ 21 22 #define NAND512_CL_CLK RCC_APB2Periph_GPIOD 23 #define NAND512_AL_CLK RCC_APB2Periph_GPIOD 24 #define NAND512_W_CLK RCC_APB2Periph_GPIOD 25 #define NAND512_R_CLK RCC_APB2Periph_GPIOD 26 #define NAND512_CE_CLK RCC_APB2Periph_GPIOD 27 #define NAND512_RB_CLK RCC_APB2Periph_GPIOB 28 #define NAND512_WP_CLK /*RCC_APB2Periph_GPIOD*/ 29 30 #define NAND512_CE_LOW GPIO_ResetBits(NAND512_CE_PORT,NAND512_CE_PIN) 31 #define NAND512_CE_HIGH GPIO_SetBits(NAND512_CE_PORT,NAND512_CE_PIN) 32 #define NAND512_CL_LOW GPIO_ResetBits(NAND512_CL_PORT,NAND512_CL_PIN) 33 #define NAND512_CL_HIGH GPIO_SetBits(NAND512_CL_PORT,NAND512_CL_PIN) 34 #define NAND512_AL_LOW GPIO_ResetBits(NAND512_AL_PORT,NAND512_AL_PIN) 35 #define NAND512_AL_HIGH GPIO_SetBits(NAND512_AL_PORT,NAND512_AL_PIN) 36 #define NAND512_W_LOW GPIO_ResetBits(NAND512_W_PORT,NAND512_W_PIN) 37 #define NAND512_W_HIGH GPIO_SetBits(NAND512_W_PORT,NAND512_W_PIN) 38 #define NAND512_R_LOW GPIO_ResetBits(NAND512_R_PORT,NAND512_R_PIN) 39 #define NAND512_R_HIGH GPIO_SetBits(NAND512_R_PORT,NAND512_R_PIN) 40 41 #define NAND512_RB_STATUS GPIO_ReadInputDataBit(NAND512_RB_PORT,NAND512_RB_PIN) 42 43 #define NOP __nop() 44 #define BANK_SIZE 131072 45 #define PAGE_SIZE 2048 46 47 extern void NAND512_IO_Init(void); 48 extern char NAND512_Read_Status(void); 49 extern void NAND512_Read_ID(char* Buf); 50 extern void NAND512_Page_Read(char* Buf,int Len,int Add); 51 extern char NAND512_Page_Write(char* Buf,int Len,int Add); 52 extern char NAND512_Block_Erase(int Add); 53 #endif
转载于:https://www.cnblogs.com/csjl2010/p/10314268.html
三星K9F1G08U0E(128MB,NAND FLASH) STM32平台驱动程序(模拟时序)相关推荐
- nand flash 个人觉得写得比较好的文章
[详解]如何编写Linux下Nand Flash驱动 版本:v2.2.1 Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flas ...
- nand flash 经典 全面 ------如何编写Linux下Nand Flash驱动
Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开 ...
- 基于VXWORKS的NAND FLASH驱动程序设计
基于VXWORKS的NAND FLASH驱动程序设计 3162412793@qq.com 技术交流QQ群: 691976956 目前,随着电子技术的不断发展,计算机技术也得到飞速的发展,产生了很多新技 ...
- kernel(三)NAND FLASH
三星提供的 NAND FLASH 驱动为 drivers/mtd/nand/s3c2410.c,只支持 S3C2410/S3C2440/S3C2412.我们需要修改它,以支持 s5pv210.在这个驱 ...
- Nand Flash数据存储单元的整体架构
http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 简单说就是, ...
- linux nand 驱动,Linux NAND FLASH驱动分析(一)
最近一直在忙着工作上的事情,好久都没有更新博客了,发现最近思想是比较混乱的.学任何东西都坚持不下去,既然选择驱动开发这条路就要坚持下去. 之前分析了Linux块设备驱动,是以内存块来模拟的虚拟块设备. ...
- NAND flash 基础知识
NAND Flash的驱动程序设计http://hong60104.spaces.eepw.com.cn/articles/article/item/89205 1. 硬件特性: [Flash的 ...
- NAND flash和NOR flash 基础知识
NAND Flash的驱动程序设计http://hong60104.spaces.eepw.com.cn/articles/article/item/89205 1. 硬件特性: [Flash的 ...
- Nand Flash原理分析与编程
NAND Flash 在嵌入式系统中的地位与PC机上的硬盘是类似的.用于保存系统运行所必需的操作系统,应用程序,用户数据,运行过程中产生的各类数据,系统掉电后数据不会护丢失.现在的Flash主要有两咱 ...
最新文章
- Python 学习笔记 -- 序列的基本使用
- MatConvnet中集成的损失函数(孪生网络的思考)
- Nancy简单实战之NancyMusicStore(四):实现购物车
- jmeter 加密解密_犯罪大师入门篇密文答案 谜之解密入门篇密文解题详解_游戏资讯...
- NOIP 2016 游记
- 学习:配置hibernate
- [转]EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)
- 重磅:达摩院医疗AI团队CVPR'20论文解读 | 凌云时刻
- php商家商城,PHP红色小京东多商家入驻商城带移动端运营版
- 知识图谱构建技术综述与实践
- SIP信令交互过程示例
- 联想android手机驱动,Lenovo联想手机驱动
- vnc远程连接,5个步骤教你如何轻松实现vnc远程连接
- k8s 集群部署springcloud 多应用
- c语言里的pow函数(好理解,易懂)
- Java 运算符(Operators)
- 什么是内存中的堆和栈?与数据结构中的堆和栈有什么区别?
- 【Shiro】shiro的Session管理
- 细粒度分析综述(Fine-grain image analysis)
- Demo:超市管理系统(python)