用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
国际财务管理(带答案)03-18
中国卫矛科植物地理分布04-22
建筑工程施工现场消防安全技术规范试卷10-24
2010江西省计算机等级考试试题 二级C试题试题及答案05-03
马说,陋室铭,曹刿对比阅读及答案06-06
软件测试实验报告(例)..07-21
法律法规:公司法合伙企业法区别是什么12-20
- 小学生造句大全
- 增压泵投资项目可行性研究报告(模板)
- 高中语文人教版粤教版必修1-5全部文言文知识点归纳
- 两学一做专题民主生活会组织生活会批评与自我批评环节个人发言提
- 管理处环境保洁工作操作标准作业指导书
- 2012六一儿童节活动议程 - 图文
- 移树申请报告
- 《贵州省市政工程计价定额》2016定额说明及计算规则
- 计算机长期没有向WSUS报告状态
- 汉语拼音教学策略研究
- 发展西部领先的航空货运枢纽
- 司法所上半年工作总结4篇
- 如何提高银行服务水平
- 发电厂各级人员岗位职责
- 丰田汽车的外部环境分析
- 2017—2018年最新冀教版四年级数学下册《混合运算》教案精品优质
- 中建八局样板策划 - 图文
- 戚安邦《项目管理学》电子书
- 2015年高级项目经理笔记
- 弯桥的设计要点
- 单片机
- AT45DB161D
- C8051F120
- 芯片
- 驱动
- FLASH
- 数字信号基带传输系统的仿真
- 软件项目管理复习提纲
- 简易信号发生器单片机课程设计报告 - 图文
- 合同法练习题及参考答案
- 妊娠纹读音 被纹困扰那么久你也没有读对它
- 原矿粗碎系统带负荷联动试车方案
- 人教版六年级小升初语文模拟试卷
- 2018年清洁汽车行动工作总结与2018年港口运行班职工述职报告范文合集
- 建设、设计、勘察、施工、监理单位人员名单
- 九年级物理全册:第十八章第3节测量小灯泡的电功率随堂练习18431.doc
- 自我形象十大检查表格
- 北极航道的概述
- 燃油供给系统
- 浅析医院的人性化设计
- 境外证件登记管理
- (完整版)PLC控制电机正反转(毕业论文)
- 浙江大学实验报告模板
- SAP-MM-UM-015 出入库管理用户操作手册
- 科学教科版四年级下册科学复1
- 人教版小学语文基础训练六年级上册参考答案