【转载】AT45D081/AT45DB021/AT45DB0xx驱动程序(C语言)用于大型存储的串行Flash
来源:互联网 发布:淘宝微信链接转换 编辑:程序博客网 时间:2024/04/30 21:31
/*---------------------------------------------------------
版 本: V2.2
作 者:梁衍龙
创作时间:2002年9月
==========================================================*/
#i nclude "reg51.h"
#i nclude "intrins.h"
#define NOP() { _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); }
sbit SPI45D081_CS =P1^5;//片选接口
sbit SPI45D081_SK =P1^6;//时钟接口
sbit SPI45D081_DI =P1^7;//数据输入接口
sbit SPI45D081_DO =P1^4;//数据输出接口
delay(unsigned int t)
{
while(t--);
}
// SPI_SK上升沿数据有效 _/-
SPI45D081_WriteBits(unsigned char byte,unsigned char num_of_bits)
{
unsigned char count;
byte=byte<<(8-num_of_bits);
for(count=0;count<num_of_bits;count++)
{ SPI45D081_SK=0;
byte<<=1;
NOP();
SPI45D081_DI=CY;
NOP();
SPI45D081_SK=1;
NOP();
}
}
// SPI_SK下降沿数据有效 -\_
unsigned char SPI45D081_ReadByte()
{
unsigned char count,byte;
for(count=0;count<8;count++)
{ SPI45D081_SK=1;
NOP();
byte<<=1;
SPI45D081_SK=0;
NOP();
if(SPI45D081_DO) byte++;
NOP();
}
return(byte);
}
//Main Memory Page to Buffer 1 Transfer
void PageToBuffer1(unsigned int page)
{
SPI45D081_SK=1; //?? start
NOP();
SPI45D081_CS=0; //start
NOP();
//send 8 bit opcode, Main Memory Page to Buffer 1 Transfer: 0x53
SPI45D081_WriteBits(0x53,8);// fill 3 sk,don't care.
SPI45D081_WriteBits(0x00,3);//send 12 bit address to 45D081
SPI45D081_WriteBits( (unsigned char)(page>>8) , 4 );
SPI45D081_WriteBits( (unsigned char)(page) , 8 );
// fill 9 sk,don't care.
SPI45D081_WriteBits( 0x00 , 4 );
SPI45D081_WriteBits( 0x00 , 5 );//total 32 bit
SPI45D081_CS=1; // end
delay(200);}//
unsigned char ReadDataFromBuffer1(unsigned int address)
{
unsigned char dat;
SPI45D081_SK=1; //?? start
NOP();
SPI45D081_CS=0; //start
NOP();
//send 8 bit opcode:0x54
SPI45D081_WriteBits(0x54,8);// fill 15 sk,don't care.
SPI45D081_WriteBits(0x00,8);
SPI45D081_WriteBits(0x00,7);//send 9 bit address to 45D081 buffer1
SPI45D081_WriteBits( (unsigned char)(address>>8) , 1 );
SPI45D081_WriteBits( (unsigned char)(address) , 8 );//fill 8 bits blank
SPI45D081_WriteBits( 0x00 , 8 );// receive data
dat=SPI45D081_ReadByte() ;
SPI45D081_CS=1; // end
return(dat);
}
//注:该程序适用程度可靠,注意使用的方法和硬件连接方式
- 【转载】AT45D081/AT45DB021/AT45DB0xx驱动程序(C语言)用于大型存储的串行Flash
- c语言变量的存储种类和存储器类型 (转载)
- 《C++Primer》3.21 用于大型程序的工具
- C++primer阅读笔记------------用于大型程序的工具
- FLASH 存储学习-串行SPI nor
- Nand Flash的驱动程序
- NOR FLASH 的驱动程序
- 【转载】MSP430系列Flash存储器C语言环境下的参数保存和擦写技巧
- C语言大型软件设计的面向对象
- 用于大型程序的工具
- 51 单片机 C 语言串行双机通信的问题
- 串行flash
- LCD1602 C语言驱动程序
- C语言调用驱动程序
- C语言串口驱动程序
- 用于显示ORACLE_BLOB存储的图片、flash文件的JSP文件,用于直接下载文件的JSP
- C 语言的歧义( 转载 )
- 串行FLASH数据缓冲区的管理
- 博客搬家通知
- DockPanel 右键增加关闭,除此之外全部关闭的功能
- 基于单片机的密码锁汇编程序
- 你的问题和法师的回答
- STC单片机PWM的实现方法与原理参考实例
- 【转载】AT45D081/AT45DB021/AT45DB0xx驱动程序(C语言)用于大型存储的串行Flash
- 【转载】MSP430系列Flash存储器C语言环境下的参数保存和擦写技巧
- 三极管和MOS管做开关用时的区别
- 为了“千古之美”留正定
- 我的生活像做梦
- 搞笑文章-越女剑
- 两款MongoDB的可视化管理工具
- 苹果研发可弯曲电池技术 未来iOS设备会更薄更美观
- C++跨平台系列:解决STL的max()与numeric_limits::max()和VC6 min/max 宏冲突问题