资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
AVR 单片机单片机 SPI 口读写口读写 AT45DB161D 接口程序设计接口程序设计 本程序为 AVR 单片机 SPI 口访问 AT45DB161D 提供一组接口函数,通过这一组接口函数可非常容易的完成对 AT45DB161D 的读写操作AT45DB161D 按页组织和操作(读写擦等等)内部的 FLASH 存储器,每页为 528 字节(特殊用途时可通过命令配置成 512 字节),其内部共集成 4096 页,即 4096*528=2162688 字节。本程序将为您提供读写这 2162688 字节存储区的线性操作方法。使用这些函数,用户可不必考虑 AT45DB161D 内部的存储器组织结构,如同读写一个文件一样进行读写操作。 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);此函数从当前读位置读取一字节后返回,内部的读计数器加一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_openvoid 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 版权所有版权所有 转载请保留本注释在内的全部内容转载请保留本注释在内的全部内容WEB: http:/www.chipart.cnEmail: changfutongsina.com*/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_CurWriteByte;/当前写的字节地址当前写的字节地址(页中地址页中地址)/*下面是内部调用的接口函数下面是内部调用的接口函数*/从从 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(STATUS_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)(page 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);/从下一页读剩余数据从下一页读剩余数据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 df_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+;load_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_CurWritePage,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)/此处不做任何处理此处不做任何处理void 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测试电路图和实物照片:测试电路图和实物照片:
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号