用C8051F120单片机驱动FLASH芯片 AT45DB161D
更新时间:2023-10-13 09:52:01 阅读量: 综合文库 文档下载
用C8051F120单片机驱动FLASH芯片 AT45DB161D 2011-11-26 08:51 //
// AT45DB161D 驱动 //
// Pinout: //
// P0.2 - SPI SCK (digital output, push-pull) // P0.3 - SPI MISO (digital input, open-drain) // P0.4 - SPI MOSI (digital output, push-pull) // P0.5- NSSMD0
// P1.6 - LED (digital output, push-pull) //
// all other port pins unused. //
// #define SYSCLK 22118400 // Internal oscillator frequency in Hz // #define SPI_CLOCK 11059200 // Maximum SPI clock //----------------------------------------------------------------------------- // Includes
//----------------------------------------------------------------------------- #include
//----------------------------------------------------------------------------- // Global Constants
//-----------------------------------------------------------------------------
#define FLASH_CHREAD 0x0B #define FLASH_CLREAD 0x03
#define FLASH_PREAD 0xD2 //Main Memory Page Read #define FLASH_BUFWRITE1 0x84 #define FLASH_BUFWRITE2 0x87
#define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83 // 将第一缓冲区的数据写入主存储器(擦除模式)
#define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86 // 将第二缓冲区的数据写入主存储器(擦除模式)
#define FLASH_IDREAD 0x9F #define FLASH_STATUS 0xD7 #define PAGE_ERASE 0x81 #define PAGE_READ 0xD2
#define MM_PAGE_TO_B1_XFER 0x53 // 将主存储器的指定页数据加载到第一缓冲区 #define Dummy_Byte 0xA5
/* Select SPI FLASH: ChipSelect pin low */ #define Select_Flash() NSSMD0=0
/* Deselect SPI FLASH: ChipSelect pin high */
#define NotSelect_Flash() NSSMD0=1 U8 xdata Wr_buffer[528]; U8 xdata Rr_buffer[528]; U8 Pid[4];
void SPI_Flash_Init(void); //SPI初始化
U8 SPI_Flash_ReadByte(void); //flash操作基本函数,读一个字节
U8 SPI_Flash_SendByte(U8 byte); // FLASH操作基本函数,发送一个字节 void FlashPageEarse(U16 page); //擦除指定的页,页范围0-4095
void FlashPageRead(U16 page,U16 StartAddr,U16 ReadCount);写多个字节(页内) void FlashPageWrite(U16 page); //写一整页,页范围0-4095 void FlashWaitBusy(void); //Flash忙检测
void FlashReadID(void); //读取flashID四个字节 U8 xdata ReadAddr[3]; U8 xdata state_reg=0x00;
U8 SPI_Flash_SendByte(U8 byte); // FLASH操作基本函数,发送一个字节 void FlashPageRead(U16 page,U16 StartAddr,U16 ReadCount,U16 Soffset); void FlashWaitBusy(void); //Function
void FlashReadID(void)//读芯片ID {
U8 i;
U8 SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE
SFRPAGE = SPI0_PAGE; // Switch to the necessary SFRPAGE Select_Flash();
SPI_Flash_SendByte(0x9F); for(i = 0; i < 4; i++) {
Pid[i] = SPI_Flash_ReadByte(); }
NotSelect_Flash();
SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE } //
U8 SPI_Flash_ReadByte(void) {
return (SPI_Flash_SendByte(Dummy_Byte)); }
//--------------------------------------------------------------------------------------------- U8 SPI_Flash_SendByte(U8 dat) {
SPI0DAT = dat;
while (!SPIF); // Step1.3: Wait for end of transfer SPIF = 0; // Step1.4: Clear the SPI intr. flag
dat=SPI0DAT; return dat; }
//--------------------------------------------------------------------------------------------- void FlashPageEarse(U16 page) {
U8 SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE
SFRPAGE = SPI0_PAGE; // Switch to the necessary SFRPAGE FlashWaitBusy(); Select_Flash();
SPI_Flash_SendByte(PAGE_ERASE); SPI_Flash_SendByte((U8)(page >> 6)); SPI_Flash_SendByte((U8)(page << 2)); SPI_Flash_SendByte(Dummy_Byte); NotSelect_Flash();
SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE }
//--------------------------------------------------------------------------------------------- void FlashPageRead(U16 page,U16 StartAddr,U16 ReadCount) {
U16 i;
U8 saddr=0;
U8 SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE
SFRPAGE = SPI0_PAGE; // Switch to the necessary SFRPAGE ReadAddr[0]= (U8)(page >> 7) ; ReadAddr[2]=(U8)(StartAddr);
saddr=(((U8)(StartAddr >> 8)) & 0x01); saddr=(saddr | (U8)(page << 1)); FlashWaitBusy(); Select_Flash();
SPI_Flash_SendByte(PAGE_READ); SPI_Flash_SendByte((U8)(page >> 7) ); SPI_Flash_SendByte(saddr);
SPI_Flash_SendByte((U8)(StartAddr));//3个字节 SPI_Flash_SendByte(0x00); SPI_Flash_SendByte(0x00); SPI_Flash_SendByte(0x00); SPI_Flash_SendByte(0x00); for (i = 0;i Rr_buffer[i] = SPI_Flash_ReadByte(); } NotSelect_Flash(); SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE } void FlashPageWrite(U16 page) //写一整页,页范围0-4095 { U16 i; U8 SFRPAGE_save = SFRPAGE; // Save the current SFRPAGE SFRPAGE = SPI0_PAGE; // Switch to the necessary SFRPAGE Select_Flash(); SPI_Flash_SendByte(FLASH_BUFWRITE2); SPI_Flash_SendByte(0x00); SPI_Flash_SendByte(0x00); SPI_Flash_SendByte(0x00); for (i = 0;i < 528; i++) { SPI_Flash_SendByte(Wr_buffer[i]); } NotSelect_Flash(); FlashWaitBusy(); if ( page < 4096) { Select_Flash(); SPI_Flash_SendByte(B2_TO_MM_PAGE_PROG_WITH_ERASE); SPI_Flash_SendByte((U8)(page>>6)); SPI_Flash_SendByte((U8)(page<<2)); SPI_Flash_SendByte(0x00); NotSelect_Flash(); FlashWaitBusy(); } SFRPAGE = SFRPAGE_save; // Restore the SFRPAGE } void FlashWaitBusy(void) { state_reg=0x00; Select_Flash(); SPI_Flash_SendByte(FLASH_STATUS); while((state_reg&0x80) == 0) { state_reg = SPI_Flash_ReadByte(); } NotSelect_Flash(); } //-------------------------------------------------------------------------------------------------
正在阅读:
用C8051F120单片机驱动FLASH芯片 AT45DB161D10-13
第五章 机械式除尘器08-10
2009-2010(上)学年度锦屏中学 八 年级数学教学案08-10
001-津资K4-1 工程定位测量、放线、水准点引测记录08-10
防静电超洁净服装08-10
00911互联网数据库历年真题 超级完整版 9份试卷带全部答案 - 图文11-17
基础会计试卷A卷以及答案10-04
PsyKey心理教学系统实验使用手册11-30
海南建设工程投标企业使用手册04-14
东莞市南城区政府采购10-07
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 单片机
- AT45DB161D
- C8051F120
- 芯片
- 驱动
- FLASH
- 数字信号基带传输系统的仿真
- 软件项目管理复习提纲
- 简易信号发生器单片机课程设计报告 - 图文
- 合同法练习题及参考答案
- 妊娠纹读音 被纹困扰那么久你也没有读对它
- 原矿粗碎系统带负荷联动试车方案
- 人教版六年级小升初语文模拟试卷
- 2018年清洁汽车行动工作总结与2018年港口运行班职工述职报告范文合集
- 建设、设计、勘察、施工、监理单位人员名单
- 九年级物理全册:第十八章第3节测量小灯泡的电功率随堂练习18431.doc
- 自我形象十大检查表格
- 北极航道的概述
- 燃油供给系统
- 浅析医院的人性化设计
- 境外证件登记管理
- (完整版)PLC控制电机正反转(毕业论文)
- 浙江大学实验报告模板
- SAP-MM-UM-015 出入库管理用户操作手册
- 科学教科版四年级下册科学复1
- 人教版小学语文基础训练六年级上册参考答案