📄 sd.h
字号:
#ifndef _SD_H_
#define _SD_H_
#define SD_Write PORTB //SPI port register
#define SD_READ PINB //Data PIN
#define SD_Direction_REG DDRB //Direction register
#define SPI_DI 4 //-->SD_DO_PIN
#define SPI_DO 3 //-->SD_DI_PIN
#define SPI_Clock 5 //-->SD_CLK_PIN
#define SPI_SS 2 //-->SD_SS_PIN
#define SPIF 7
#define UDRE 5
#define SD_DO_PIN SD_Read.SPI_DI
#define SD_DI_PIN SD_Write.SPI_DO
#define SD_CLK_PIN SD_Write.SPI_Clock
#define SD_CS_PIN PORTD.5
#define LED PORTD.4
#define COLOR PORTD.5
#define nop() #asm("nop"); //asm nop defined in CVAVR
extern void SDinit(void);
/*-----------------------------------------------------------
读状态寄存器 操作码0xD7
结束标志:CS管脚置高 该寄存器在忙状态下也可读取,便于判断状态
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
RDY/BUSY COMP 1 0 1 1 PROTECT PAGE SIZE
-----------------------------------------------------------*/
extern unsigned char Status_Register_Read (void);
/*-----------------------------------------------------------
连续读模式1 最高66M 操作码0xE8
格式:操作码+3字节地址码(12页址+9页内地址(512byte))+4个空字节(延时启动内部读操作)
结束标志:CS管脚置高 注意该模式读期间页间转换无标志 无时差 完全连续直到读完这个存储器
由于不能建立太大的缓存,故该模式下,连续读的优势得到限制,可在主函数进行操作实现单字节传输
-----------------------------------------------------------*/
extern void Continuous_Array_Read_1 (unsigned char *p,unsigned int pageaddr,unsigned int byteaddr);
/*-----------------------------------------------------------
连续读模式2 最高66M 操作码0x0B
格式:操作码+3字节地址码(12页址+9页内地址(512byte))+1个空字节(延时启动内部读操作)
结束标志:CS管脚置高 注意该模式读期间页间转换无标志 无时差 完全连续
由于不能建立太大的缓存,故该模式下,连续读的优势得到限制,可在主函数进行操作实现单字节传输
-----------------------------------------------------------*/
extern void Continuous_Array_Read_2 (unsigned char *p,unsigned int pageaddr,unsigned int byteaddr) ;
/*-----------------------------------------------------------
连续读模式3 最高33M 操作码0x03
格式:操作码+3字节地址码(12页址+9页内地址(512byte))
结束标志:CS管脚置高 注意该模式读期间页间转换无标志 无时差 完全连续
由于不能建立太大的缓存,故该模式下,连续读的优势得到限制,可在主函数进行操作实现单字节传输
-----------------------------------------------------------*/
extern void Continuous_Array_Read_3 (unsigned char *p,unsigned int pageaddr,unsigned int byteaddr);
/*-----------------------------------------------------------
数据读函数 操作码0xD2
格式:操作码+3字节地址码(12页址+9页内地址(512byte))+4个空字节(延时启动内部读操作)
结束标志:CS管脚置高 注意该方式读完一页返回从同一页开始读
缓存大小设置为512字节即工作于每页512字节模式
-----------------------------------------------------------*/
extern void Main_Memory_Page_Read (unsigned char *p,unsigned int pageaddr,unsigned int byteaddr) ;
/*-----------------------------------------------------------
缓存数据读函数 操作码0xD6 0xD4 0xD3 0xD1
格式:操作码+3字节地址码(15无效位+9地址(512byte))
结束标志:CS管脚置高
-----------------------------------------------------------*/
extern void Buffer_Read (unsigned char *p,unsigned int byteaddr,unsigned char rate,unsigned char buffer);
/*-----------------------------------------------------------
缓存数据写函数 操作码0x84 0x87
格式:操作码+3字节地址码(15无效位+9地址(512byte))
结束标志:CS管脚置高
-----------------------------------------------------------*/
extern void Buffer_write (unsigned char *p,unsigned int byteaddr,unsigned char buffer);
/*-----------------------------------------------------------
擦除某页将缓存数据写进该页函数 操作码0x83 0x86
格式:操作码+3字节地址码(3无效位+12页地址+9无效位)
结束标志:CS管脚置高 注意该函数调用以后需要一定时间将数据写入芯片,要延时40ms,此时可向另一buffer写
但在8脚封装芯片上没有RDY/BUSY管脚(指示内部操作完成),但可以用软件方法检测状态
-----------------------------------------------------------*/
extern void Buffer_to_Main_erase (unsigned int pageaddr,unsigned char buffer) ;
/*-----------------------------------------------------------
将缓存数据写进该页函数 操作码0x88 0x89
格式:操作码+3字节地址码(3无效位+12页地址+9无效位)
结束标志:CS管脚置高 注意该函数调用之前需要对操作页面进行擦除操作以后需要一定
时间将数据写入芯片,要延时6ms 即本函数要配合擦除函数
-----------------------------------------------------------*/
extern void Buffer_to_Main (unsigned int pageaddr,unsigned char buffer);
/*-----------------------------------------------------------
页擦除函数 操作码0x81
格式:操作码+3字节地址码(3无效位+12页地址+9无效位)
结束标志:CS管脚置高 延时35ms
-----------------------------------------------------------*/
extern void Page_Erase (unsigned int pageaddr);
/*-----------------------------------------------------------
扇区擦除函数 每扇区 操作码0x7C
格式:操作码+3字节地址码(3无效位+9扇区地址+12无效位(适于0a、0b扇区1~15是4扇区地址+17无效位))
结束标志:CS管脚置高 延时5s
-----------------------------------------------------------*/
extern void Sector_Erase (unsigned int Sector,unsigned char Sector0);
/*-----------------------------------------------------------
块擦除函数 每块8页 操作码0x50
格式:操作码+3字节地址码(3无效位+9块地址+12无效位)
结束标志:CS管脚置高 延时100ms
-----------------------------------------------------------*/
extern void Block_Erase (unsigned int blockaddr);
/*-----------------------------------------------------------
全盘擦除函数 每扇区 操作码0xC7、94、80、9A
结束标志:CS管脚置高 延时ns
-----------------------------------------------------------*/
extern void Chip_Erase (void);
/*-----------------------------------------------------------
带缓存写页函数 操作码0x82 0x85
格式:操作码+3字节地址码(12页址+9页内地址(512byte))
结束标志:CS管脚置高 要延时40ms
-----------------------------------------------------------*/
extern void Page_Through_Buffer (unsigned char *p,unsigned int pageaddr,unsigned int byteaddr,unsigned char buffer);
/*-----------------------------------------------------------
页数据读入缓存函数 操作码0x53 0x55
格式:操作码+3字节地址码(12页址+9页内地址(512byte))
结束标志:CS管脚置高 要延时400us
-----------------------------------------------------------*/
extern void Page_to_Buffer (unsigned int pageaddr,unsigned char buffer);
/*-----------------------------------------------------------
软件写保护 操作码0x3D、2A、7F、A9
结束标志:CS管脚置高 延时18s
-----------------------------------------------------------*/
extern void Enable_Sector_Protection (void);
/*-----------------------------------------------------------
解除软件写保护 操作码0x3D、2A、7F、9A
结束标志:CS管脚置高 延时ns
-----------------------------------------------------------*/
extern void Disenable_Sector_Protection (void) ;
/*-----------------------------------------------------------
读取厂商和设备信息 操作码:0x9F
格式:操作码
返回:0x1F (ATMEL) ID信息(2字节) 0x00
-----------------------------------------------------------*/
extern void ManufacturerDevice_read (unsigned char *p);
#endif //_SD_H_
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -