📄 at45db161d.h
字号:
/****************************************Copyright (c)**************************************************
**
**
**--------------File Info-------------------------------------------------------------------------------
*/
//#define SPI_CLOCK 5529600 /* 正常通信时,SPI时钟频率 frequency (Hz) */
//#define SPI_CLOCK 7372800
/* DataFlash信息结构体定义 */
/* the information structure variable of DataFlash*/
#define AT45DB161Size 2000000 //2162688
typedef struct DataFlash_STRUCT
{
INT8U DataFlash_type;
INT32U block_num; /* 卡中块的数量 */
INT32U block_len; /* 卡的块长度(单位:字节) */
INT32U erase_unit; /* 一次可擦除的块个数 */
INT32U timeout_read; /* 读块超时时间(单位: 8 SPI clock) */
INT32U timeout_write; /* 写块超时时间(单位: 8 SPI clock) */
INT32U timeout_erase; /* 擦块超时时间(单位: 8 SPI clock) */
}dataflash_struct;
// defines for all opcodes
// buffer 1 write
#define BUFFER_1_WRITE 0x84
// buffer 2 write
#define BUFFER_2_WRITE 0x87
// buffer 1 read
#define BUFFER_1_READ 0x54
// buffer 2 read
#define BUFFER_2_READ 0x56
// buffer 1 to main memory page program with built-in erase
#define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83
// buffer 2 to main memory page program with built-in erase
#define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86
// buffer 1 to main memory page program without built-in erase
#define B1_TO_MM_PAGE_PROG_WITHOUT_ERASE 0x88
// buffer 2 to main memory page program without built-in erase
#define B2_TO_MM_PAGE_PROG_WITHOUT_ERASE 0x89
// main memory page program through buffer 1
#define MM_PAGE_PROG_THROUGH_B1 0x82
// main memory page program through buffer 2
#define MM_PAGE_PROG_THROUGH_B2 0x85
// auto page rewrite through buffer 1
#define AUTO_PAGE_REWRITE_THROUGH_B1 0x58
// auto page rewrite through buffer 2
#define AUTO_PAGE_REWRITE_THROUGH_B2 0x59
// main memory page compare to buffer 1
#define MM_PAGE_TO_B1_COMP 0x60
// main memory page compare to buffer 2
#define MM_PAGE_TO_B2_COMP 0x61
// main memory page to buffer 1 transfer
#define MM_PAGE_TO_B1_XFER 0x53
// main memory page to buffer 2 transfer
#define MM_PAGE_TO_B2_XFER 0x55
// DataFlash status register for reading density, compare status,
// and ready/busy status
#define STATUS_REGISTER 0x57
// main memory page read
#define MAIN_MEMORY_PAGE_READ 0x52
// erase a 528 byte page
#define PAGE_ERASE 0x81
// erase 512 pages
#define BLOCK_ERASE 0x50
/* 100ms 相当的SPI时钟数(单位 unit: 8 clocks) */
/* 100ms correspond to SPI clock(unit: 8 clocks)*/
#define READ_TIMEOUT_100MS 100 * SPI_CLOCK / 1000 / 8
/* 250ms 相当的SPI时钟数(单位 unit: 8 clocks) */
/* 250ms correspond to SPI clock(unit: 8 clocks)*/
#define WRITE_TIMEOUT_250MS 250 * SPI_CLOCK / 1000 / 8
extern void SPI_Delay(INT8U value); // 发生SPI时钟 send SPI clock
/* 设置SPI的时钟小于400kHZ set the clock of SPI less than 400kHZ */
extern void SPI_Clk400k(void);
/* 设置SPI的clock到最大值 set the clock of SPI to maximum */
extern void SPI_ClkToMax(void);
/* 通过SPI接口发送一个字节 send a byte by SPI interface */
extern void SPI_SendByte(INT8U byte);
/* 从SPI接口接收一个字节 receive a byte from SPI interface */
extern INT8U SPI_RecByte(void);
/* 片选SPI从机 select the SPI slave */
extern void SPI_CS_Assert(void);
/* 不片选SPI从机 not select the SPI slave */
extern void SPI_CS_Deassert(void);
/* 初始化访问SD卡的硬件初始化 initialize the hardware that access sd card */
extern void DataFlash_HardWareInit(void);
extern unsigned char DataFlash_ReadStatus(void);
extern unsigned char DataFlash_isBusy(void);
extern void Block_Erase(unsigned long Dst);
extern void Block_Program(unsigned char * dat,unsigned int num,unsigned int startpage,unsigned int startaddr);
extern void Block_Read(unsigned char *dat,unsigned int num,unsigned int startpage,unsigned int startaddr);
/* CS 引脚 */ //P1.25
#define SPI_CS (0x01 << 25)
#define SPI_CS_GPIO() PINSEL2 = 0xFFFFFFF0; /* 设置 CS 口为GPIO口 */
#define SPI_CS_OUT() IO1DIR |= SPI_CS; /* 设置 CS 口为输出口 */
#define SPI_CS_SET() IO1SET |= SPI_CS; /* 置 CS 为高电平 */
#define SPI_CS_CLR() IO1CLR |= SPI_CS; /* 置 CS 为低电平 */
/* 写保护检测引脚 */ //P1.26
#define SPI_WP (0x01 << 15)
#define SPI_WP_GPIO() PINSEL2 = 0xFFFFFFF0; /* 设置 WP 口为GPIO口 */
#define SPI_WP_OUT() IO1DIR |= SPI_WP ; /* 设置 WP 口为输出口 */
//#define SPI_WP_OUT() IODIR &= ~SPI_WP /* 设置 WP 口为输出口 */
#define SPI_WP_SET() IO1SET |= SPI_WP; /* 置 WP 为高电平 */
#define SPI_WP_CLR() IO1CLR |= SPI_WP; /* 置 WP 为低电平 */
/* RESET引脚 */ //P1.31
#define SPI_RESET 0x80000000//(0x01 << 31)
#define SPI_RESET_GPIO() PINSEL2 = 0xFFFFFFF0; /* 设置 RESET 口为GPIO口 */
#define SPI_RESET_OUT() IO1DIR |= SPI_RESET ; /* 设置 RESET 口为输出口 */
#define SPI_RESET_SET() IO1SET |= SPI_RESET; /* 置 RESET 为高电平 */
#define SPI_RESET_CLR() IO1CLR |= SPI_RESET; /* 置 RESET 为低电平 */
/* 初始化 IO 口为SPI接口 */
#define SPI_INIT() PINSEL0 &= ~((0x03 << 8) + (0x03 << 10) + (0x03 << 12)); \
PINSEL0 |= (0x01 << 8) + (0x01 << 10) + (0x01 << 12);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -