SmartOS/Drivers/AT45DB.h

68 lines
3.8 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef __AT45DB_H__
#define __AT45DB_H__
#include "Kernel\Sys.h"
#include "Device\Spi.h"
// AT45DB存储Flash
class AT45DB
{
private:
Spi* _spi; // 内部Spi对象
// 设置操作地址
void SetAddr(uint addr);
// 等待操作完成
bool WaitForEnd();
// 读取编号
uint ReadID();
public:
uint ID; // 芯片ID
ushort PageSize; // 页大小
ushort Retry; // 等待重试次数
AT45DB(Spi* spi);
~AT45DB();
// 擦除扇区
bool Erase(uint sector);
// 擦除页
bool ErasePage(uint pageAddr);
// 写入一页
bool WritePage(uint addr, byte* buf, uint count);
// 读取一页
bool ReadPage(uint addr, byte* buf, uint count);
// 写入数据
bool Write(uint addr, byte* buf, uint count);
// 读取数据
bool Read(uint addr, byte* buf, uint count);
};
/*
AT45DB041中的数据按页存放,主存共2048页,每页 264字节,所以总容量为528K字节约4M比特。存放在主存中的数据掉电不丢失。
除了主存以外,AT45DB041还有两个容量为264字节的数据缓存。缓存可以用作主存与外部进行数据交换时的缓冲区域,也可以暂存一些临时数据。
缓存读写方便迅速,但掉电数据会丢失。AT45DB041数据读写采用串行方式,读写速度快,从页到缓存的传输时间为80 s左右,并且兼容CMOS和TTL输入和输出。
数据读取
读缓存通过不同的操作码可选择读取两个缓存中的其中一个操作码54H用作读缓存1,而操作码56H用作读缓存2
为了实现读缓存的操作,在8位操作码后必须跟有15位任意码,9位地址码和8位任意码。其中9位地址码BFA8-BFA0被用作指定要读取的首字节。
在轮换时钟SCK的控制下,从SI载入操作码、地址码、任意码。当载入结束后,在SCK轮换时钟的控制下,缓存中的数据就可以从SO读出。
当读到缓存的末尾时,设备将继续从缓存的开端重读。在这整个过程中/CS必须保持低电平。读缓存结束后,/CS上一个从低到高的电平跳变将终止读操作。
主存页到缓存的传送一页数据可以从主存传至缓存1或2。
8位操作码53H用于缓存1,55H用于缓存2后跟有4位保留位,11位用于指定目的页的地址位PA10-PA0,和9位任意码,在轮换时钟SCK的控制下从SI载入。
在这一过程中/CS管脚必须保持低电位。当载入结束后,在/CS上检测到一个由低到高的电平跳变后,主存页中的数据开始传送至缓存。
在数据传送的过程中,状态寄存器将指示状态忙。
数据写入
写缓存在SCK的控制下,8位的操作码84H用于缓存1,87H用于缓存2后面跟着15位任意码和9位地址码BFA8-BFA0由SI载入,
其中9位地址码指定了缓存中被写的首字节,数据紧随着地址码输入。/CS上一个由低到高的跳变,将结束写缓存操作。
带有内置擦除的缓存至主存页的传送8位的操作码83H用于缓存 1,86H用于缓存2后跟有4位保留位,11位指定要写入的主存页的地址码PA10-PA0,
和9位任意码,在轮换时钟SCK的控制下从SI载入。当/CS上检测到一个由低到高的跳变时,器件将首先擦除被选中的主存页,然后将储存在缓存中的数据写入该页。
擦除和写入的过程都是自动进行的,这一进程不超过20ms。在这个时间里,状态寄存器将指示状态忙。状态寄存器值读取:读状态寄存器的值可以用来确定设备的忙闲状态。
忙闲状态通过寄存器的第7位指示。如果第7位为1,则设备位于空闲状态并可接收下一条指令。如果为0,则设备忙。在载入8位操作码57H后,从SO上可以读出1字节的状态寄存器的值。
*/
#endif