📄 at45db041b.c
字号:
//这是主机C8051F005有硬件SPI的AT45DB041B的读写驱动
// SPI Configuration
//SPI0CN = 0x02; // SPI Control Register
//MSTEN = 1; // SPI 以主方式工作
//SPI0CFG = 0xC7; // SPI Configuration Register 第二边沿采样、SCK空闲高
//SPI0CKR = 0x00; // SPI Clock Rate Register SPIclk=24.5M/2
//SPIEN = 1; // SPI0CN |= 0x01;
sbit FLASH_CS = P3^6;
union long_union{ //长整形联合
unsigned long dat;
unsigned int word[2];
unsigned char byte[4];
}opcode;
//缓冲区1单字节写 cmd=0x84
void buff1_wr(unsigned int bfaddr,unsigned char dat){
unsigned char i;
opcode.byte[0]=0x84;
opcode.word[1]=bfaddr;
FLASH_CS=0;
SPI0CN&=0x03;
for(i=0;i<4;i++){SPI0DAT=opcode.byte[i]; while(!SPIF); SPIF=0;} //连续发送4个opcode
SPI0DAT=dat; while(!SPIF); SPIF=0; //发送第5个字节(数据)
FLASH_CS=1;
}
//缓冲区1单字节读 cmd=0xd4
unsigned char buff1_rd(unsigned int bfaddr){
unsigned char i;
opcode.byte[0]=0xd4;
opcode.word[1]=bfaddr;
FLASH_CS=0;
SPI0CN&=0x03;
for(i=0;i<4;i++){SPI0DAT=opcode.byte[i]; while(!SPIF); SPIF=0;} //连续发送4个opcode
SPI0DAT=0; while(!SPIF); SPIF=0; //发送第5个任意数据字节
i=SPI0DAT; //清空读缓冲器
SPI0DAT=0; while(!SPIF); SPIF=0; //启动一个字节传输
i=SPI0DAT; //读缓冲器
FLASH_CS=1;
return(i);
}
//Main Menory Page Program through Buffer 1 or 2
//Completes writing into selected buffer. Start self-timed erase/program operation
void page_wr(unsigned char buff_num, unsigned int bfaddr, unsigned int paddr, unsigned char *datptr, unsigned
int len){
unsigned char i;
opcode.dat=paddr; opcode.dat<<=9; opcode.dat+=(bfaddr&0x1ff); //组合opcode
opcode.byte[0]=0x82+(buff_num-1)*3; //0x82 or 0x85
FLASH_CS=0;
SPI0CN&=0x03;
for(i=0;i<4;i++){SPI0DAT=opcode.byte[i]; while(!SPIF); SPIF=0;} //连续发送4个opcode
for(;len>0;len--){SPI0DAT=*datptr++; while(!SPIF); SPIF=0;} //连续发送len个指定数据
FLASH_CS=1; //Completes writing into selected buffer. Start self-timed erase/program operation
}
//Continuous Array Read (opcode: 0xe8)
//可从主存储区任意地址跨页连续读取
void array_rd(unsigned long addr, unsigned int len, unsigned char *datptr){
unsigned char i;
unsigned int paddr, baddr;
paddr=addr / 264; baddr=addr % 264;
opcode.dat=paddr; opcode.dat<<=9; opcode.dat+=baddr; //组合opcode
opcode.byte[0]=0xe8;
FLASH_CS=0;
SPI0CN&=0x03;
for(i=0;i<4;i++){SPI0DAT=opcode.byte[i]; while(!SPIF); SPIF=0;} //连续发送4个opcode
for(i=0;i<4;i++){SPI0DAT=0; while(!SPIF); SPIF=0;} //连续发送4个不关心字节
i=SPI0DAT; //清空读缓冲器
for(;len>0;len--){
SPI0DAT=0; while(!SPIF); SPIF=0; //启动一个字节传输
*datptr=SPI0DAT; //读缓冲器
datptr++;
}
FLASH_CS=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -