AVR单片机SPI口读写AT45DB161D接口程序设计

上传人:woxinch****an2018 文档编号:38630819 上传时间:2018-05-05 格式:DOC 页数:12 大小:925.50KB
返回 下载 相关 举报
AVR单片机SPI口读写AT45DB161D接口程序设计_第1页
第1页 / 共12页
AVR单片机SPI口读写AT45DB161D接口程序设计_第2页
第2页 / 共12页
AVR单片机SPI口读写AT45DB161D接口程序设计_第3页
第3页 / 共12页
AVR单片机SPI口读写AT45DB161D接口程序设计_第4页
第4页 / 共12页
AVR单片机SPI口读写AT45DB161D接口程序设计_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《AVR单片机SPI口读写AT45DB161D接口程序设计》由会员分享,可在线阅读,更多相关《AVR单片机SPI口读写AT45DB161D接口程序设计(12页珍藏版)》请在金锄头文库上搜索。

1、AVR 单片机单片机 SPI 口读写口读写 AT45DB161D 接口程序设计接口程序设计 本程序为 AVR 单片机 SPI 口访问 AT45DB161D 提供一组接口函数,通过这一组接口函数可非常容易的完成对 AT45DB161D 的读写操作AT45DB161D 按页组织和操作(读写擦等等)内部的 FLASH 存储器,每页为 528 字节(特殊用途时可通过命令配置成 512 字节),其内部共集成 4096 页,即 4096*528=2162688 字节。本程序将为您提供读写这 2162688 字节存储区的线性操作方法。使用这些函数,用户可不必考虑 AT45DB161D 内部的存储器组织结构,

2、如同读写一个文件一样进行读写操作。 void df_init(void);这是 SPI 口初始化函数,它必须在所有这些接口函数调用之前得到调用void df_read_open(uint32_t addr);读操作初始化函数,addr 指定接下来的读函数的开始读取位置。程序内部维护一个当前读取计数器,用户每读一字节该计数器加一void df_write_open(uint32_t addr);写操作初始化函数,addr 指定接下来的写函数的开始写入位置。程序内部维护一个当前写入计数器,用户每写入一个字节该计数器加一uint8_t df_getc(void);此函数从当前读位置读取一字节后返回,

3、内部的读计数器加一void df_putc(uint8_t c);此函数向当前写位置写入一字节的数据,并使内部写计数器加一void df_read(uint8_t *buf,uint8_t size);此函数从当前读位置读取 size 个字节的数据到缓冲区 buf,并使内部读计数器加 sizevoid df_write(uint8_t *buf,uint8_t size);此函数从缓冲区 buf 向当前写位置写入 size 字节的数据,并使内部写计数器加 sizevoid df_read_seek(uint32_t addr);调整当前读计数器,调用此函数前必须已调用 df_read_open

4、void df_write_seek(uint32_t addr);调整当前写计数器,调用此函数前必须已调用 df_write_openvoid df_read_close(void);关闭读操作void df_write_close(void);关闭写操作,所有的写入操作完成后必须调用此函来结束写操作,以便数据能够完整的保存到AT45DB161D 主存储器当中源程序:源程序:/*AVR 单片机单片机 SPI 口读写口读写 at45db161d 接口程序接口程序文件名文件名:dataflash.c编译:编译:WinAVR-20070525芯艺设计室芯艺设计室 2004-2007 版权所有版权所

5、有 转载请保留本注释在内的全部内容转载请保留本注释在内的全部内容WEB: http:/Email: */i nclude i nclude “at45db161d.h“i nclude “dataflash.h“/*下面是全局变量定义下面是全局变量定义*/static uint16_t g_CurReadPage;/当前读的页地址当前读的页地址static uint16_t g_CurReadByte;/当前读的字节当前读的字节(页中地址页中地址)static uint16_t g_CurWritePage;/当前写的页地址当前写的页地址static uint16_t g_CurWriteBy

6、te;/当前写的字节地址当前写的字节地址(页中地址页中地址)/*下面是内部调用的接口函数下面是内部调用的接口函数*/从从 SPI 口输出一字节数据口输出一字节数据static uint8_t spi_write(uint8_t data)SPDR = data;while(!(SPSR return SPDR;/检测并等待器件忙状态检测并等待器件忙状态,8 引脚封闭器件没有引脚封闭器件没有 RDY/BUSY 引脚引脚 为些通过读状态寄存器来检测忙状态为些通过读状态寄存器来检测忙状态static void df_wait_busy(void)SELECT_CHIP;spi_write(STATU

7、S_REGISTER);while(1)if(spi_write(0) UNSELECT_CHIP;/读主存储器指定页到读缓冲区读主存储器指定页到读缓冲区(BUFFER1)static void load_page_to_buffer(uint16_t page,uint8_t buffer)SELECT_CHIP;if(buffer = DF_READ_BUFFER) spi_write(MM_PAGE_TO_B1_XFER); elsespi_write(MM_PAGE_TO_B2_XFER);spi_write(uint8_t)(page 6);spi_write(uint8_t)(pa

8、ge 6);spi_write(uint8_t)(page8);spi_write(uint8_t)addr); for(i=0;i8);spi_write(uint8_t)addr); for(i=0;i DF_PAGE_SIZE) /如果当前页未读取数据不够如果当前页未读取数据不够 size 字节字节/读当前页剩余数据读当前页剩余数据temp=DF_PAGE_SIZE - g_CurReadByte;read_buffer(g_CurReadByte,buf,temp);/装入下一页装入下一页load_page_to_buffer(+g_CurReadPage,DF_READ_BUFFER

9、);/从下一页读剩余数据从下一页读剩余数据g_CurReadByte=size-temp;read_buffer(0,buf+temp,g_CurReadByte);else /如果当前页数据有如果当前页数据有 size 字节字节read_buffer(g_CurReadByte,buf,size);g_CurReadByte+=size;/如果当前页数据已全部读完如果当前页数据已全部读完if(g_CurReadByte=DF_PAGE_SIZE)load_page_to_buffer(+g_CurReadPage,DF_READ_BUFFER);g_CurReadByte=0; void d

10、f_write(uint8_t *buf,uint8_t size)uint8_t temp;if(g_CurWriteByte + size) DF_PAGE_SIZE) /如果当前页未写空间不够如果当前页未写空间不够 size 字节字节/写当前页剩余空间的数据写当前页剩余空间的数据temp=DF_PAGE_SIZE - g_CurWriteByte;write_buffer(g_CurWriteByte,buf,temp);/保存当前页保存当前页write_page_from_buffer(g_CurWritePage,DF_WRITE_BUFFER);g_CurWritePage+;lo

11、ad_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER);/写入到下一页对应缓冲区写入到下一页对应缓冲区g_CurWriteByte=size-temp;write_buffer(0,buf+temp,g_CurWriteByte);elsewrite_buffer(g_CurWriteByte,buf,size);g_CurWriteByte+=size;/缓冲已满缓冲已满,写入到主存储区写入到主存储区if(g_CurWriteByte=DF_PAGE_SIZE)g_CurWriteByte=0;write_page_from_buffer(g_Cu

12、rWritePage,DF_WRITE_BUFFER);g_CurWritePage+; load_page_to_buffer(g_CurWritePage,DF_WRITE_BUFFER); /调整写指针调整写指针void df_read_seek(uint32_t addr)df_read_close();df_read_open(addr);/调整读指针调整读指针void df_write_seek(uint32_t addr)df_write_close();df_write_open(addr); void df_read_close(void)/此处不做任何处理此处不做任何处理v

13、oid df_write_close(void)write_page_from_buffer(g_CurWritePage,DF_WRITE_BUFFER); /缓冲区内容写入到主存储器缓冲区内容写入到主存储器dataflash.h 文件:文件:#ifndef DATAFLASH_H#define DATAFLASH_H/硬件引脚定义硬件引脚定义#define FLASH_MOSI PB3#define FLASH_MISO PB4#define FLASH_SCK PB5#define FLASH_CS PB1#define UNSELECT_CHIP PORTB|=_BV(FLASH_CS)#define SELECT_CHIP PORTB&=_BV(FLASH_CS)/#define DF_PAGE_SIZE 528#define DF_READ_BUFFER 0#define DF_WRITE_BUFFER 1#endif测试电路图和实物照片:测试电路图和实物照片:

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 高中教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号