AT45DB161D测试
0赞
发表于 8/6/2010 11:14:23 AM
阅读(1926)
/*来源于WWW.OURAVR.COM彩虹 已经修改过 IC为ATMEGA128,编译平台为ICC*/
/*测试时使用的是5V供电,没有烧掉芯片。在SO引脚上面加上拉电阻。其他的和DATASHEET上面一样*/
/****************************测试可以通过串口调试助手收数据 512个字节的0X05********************/
/************************memory.h**************************/
/*DATA_FLASH端口及指令定义*/
#define DF_CON_PORT PORTB
#define DF_STA_PORT PINB
#define DF_CS_1 0x80
#define DF_SELECT_1 DF_CON_PORT&=~DF_CS_1
#define DF_DESELECT_1 DF_CON_PORT|=DF_CS_1
#define DF_STA_PORT PINB
#define DF_CS_1 0x80
#define DF_SELECT_1 DF_CON_PORT&=~DF_CS_1
#define DF_DESELECT_1 DF_CON_PORT|=DF_CS_1
#define BUFFER_1_WRITE 0x84 // 写入第一缓冲区
#define BUFFER_2_WRITE 0x87 // 写入第二缓冲区
#define BUFFER_1_READ 0xD4 // 读取第一缓冲区
#define BUFFER_2_READ 0xD6 // 读取第二缓冲区
#define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83 // 将第一缓冲区的数据写入主存储器(擦除模式)
#define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86 // 将第二缓冲区的数据写入主存储器(擦除模式)
#define MM_PAGE_TO_B1_XFER 0x53 // 将主存储器的指定页数据加载到第一缓冲区
#define MM_PAGE_TO_B2_XFER 0x55 // 将主存储器的指定页数据加载到第二缓冲区
#define PAGE_ERASE 0x81 // 页删除(每页512/528字节)
#define SECTOR_ERASE 0x7C // 扇区擦除(每扇区128K字节)
#define READ_STATE_REGISTER 0xD7 // 读取状态寄存器
unsigned char DF_buffer[528];
//往SPI口写一个字节的数据
void write_SPI(unsigned char data)
{
SPDR = data;
while (!(SPSR & 0x80));
}
//检查状态寄存器最高位是否为忙,并等待空闲
void DF_wait_busy(void)
{
unsigned char state_reg=0x00;
DF_SELECT_1;
write_SPI(READ_STATE_REGISTER);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
while((state_reg&0x80) == 0)
{
write_SPI(0x00);
state_reg = SPDR ;
}
DF_DESELECT_1;
}
//格式化主存储器(以扇区<0A,0B,1……15>为单位删除所有页数据)
void DF_format(void)
{
unsigned char i;
void DF_format(void)
{
unsigned char i;
DF_wait_busy();
DF_SELECT_1;
write_SPI(SECTOR_ERASE);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
DF_DESELECT_1;
DF_SELECT_1;
write_SPI(SECTOR_ERASE);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
DF_DESELECT_1;
DF_wait_busy();
DF_SELECT_1;
write_SPI(SECTOR_ERASE);
write_SPI(0x00);
write_SPI(0x20);
write_SPI(0x00);
DF_DESELECT_1;
DF_SELECT_1;
write_SPI(SECTOR_ERASE);
write_SPI(0x00);
write_SPI(0x20);
write_SPI(0x00);
DF_DESELECT_1;
for (i=1;i<16;i++)
{
DF_wait_busy();
DF_SELECT_1;
write_SPI(SECTOR_ERASE);
write_SPI(i << 2);
write_SPI(0x00);
write_SPI(0x00);
DF_DESELECT_1;
}
}
{
DF_wait_busy();
DF_SELECT_1;
write_SPI(SECTOR_ERASE);
write_SPI(i << 2);
write_SPI(0x00);
write_SPI(0x00);
DF_DESELECT_1;
}
}
//擦除指定的主存储器页(地址范围0-4095)
void DF_page_earse(unsigned int page)
{
DF_wait_busy();
DF_SELECT_1;
write_SPI(PAGE_ERASE);
write_SPI((unsigned char)(page >> 6));
write_SPI((unsigned char)(page << 2));
write_SPI(0x00);
DF_DESELECT_1;
}
write_SPI(PAGE_ERASE);
write_SPI((unsigned char)(page >> 6));
write_SPI((unsigned char)(page << 2));
write_SPI(0x00);
DF_DESELECT_1;
}
//将保存在数组DF_buffer[]中的一页数据写入第二缓冲区后送入主存储区
//(先擦除后写入模式,页地址范围0-4095)
void DF_write_page(unsigned int page)
{
unsigned int i;
DF_wait_busy();
DF_SELECT_1;
write_SPI(BUFFER_2_WRITE);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
for (i=0;i<528;i++)
write_SPI(DF_buffer[i]);
DF_DESELECT_1;
if (page<4096)
{
DF_SELECT_1;
write_SPI(B2_TO_MM_PAGE_PROG_WITH_ERASE);
write_SPI((unsigned char)(page>>6));
write_SPI((unsigned char)(page<<2));
write_SPI(0x00);
DF_DESELECT_1;
DF_wait_busy();
}
}
{
DF_SELECT_1;
write_SPI(B2_TO_MM_PAGE_PROG_WITH_ERASE);
write_SPI((unsigned char)(page>>6));
write_SPI((unsigned char)(page<<2));
write_SPI(0x00);
DF_DESELECT_1;
DF_wait_busy();
}
}
//将指定主存储器页的数据转入第一缓冲区后读出,保存在DF_buffer[]数组中
//(页地址范围0-4095)
void DF_read_page(unsigned int page)
{
unsigned int i;
//(页地址范围0-4095)
void DF_read_page(unsigned int page)
{
unsigned int i;
DF_wait_busy();
DF_SELECT_1;
write_SPI(MM_PAGE_TO_B1_XFER);
write_SPI((unsigned char)(page >> 6));
write_SPI((unsigned char)(page << 2));
write_SPI(0x00);
DF_DESELECT_1;
DF_SELECT_1;
write_SPI(MM_PAGE_TO_B1_XFER);
write_SPI((unsigned char)(page >> 6));
write_SPI((unsigned char)(page << 2));
write_SPI(0x00);
DF_DESELECT_1;
DF_wait_busy();
DF_SELECT_1;
write_SPI(BUFFER_1_READ);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
for (i=0;i<528;i++)
{
write_SPI(0xFF);
DF_buffer[i] = SPDR;
}
DF_DESELECT_1;
DF_SELECT_1;
write_SPI(BUFFER_1_READ);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
for (i=0;i<528;i++)
{
write_SPI(0xFF);
DF_buffer[i] = SPDR;
}
DF_DESELECT_1;
}
//读取状态寄存器
// bit7 bit6 bit6 bit6 bit6 bit6 bit6 bit6
//RDY/BUSY COMP 1 0 1 1 PROTECT PAGE SIZE
unsigned char DF_read_reg(void)
{
unsigned char temp;
DF_SELECT_1;
write_SPI(READ_STATE_REGISTER);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
temp=SPDR;
DF_DESELECT_1;
return temp;
}
// bit7 bit6 bit6 bit6 bit6 bit6 bit6 bit6
//RDY/BUSY COMP 1 0 1 1 PROTECT PAGE SIZE
unsigned char DF_read_reg(void)
{
unsigned char temp;
DF_SELECT_1;
write_SPI(READ_STATE_REGISTER);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
write_SPI(0x00);
temp=SPDR;
DF_DESELECT_1;
return temp;
}
//将指定主存储器页的数据转入指定缓冲区
void DF_mm_to_buf(unsigned char buffer,unsigned int page)
{
DF_wait_busy();
DF_SELECT_1;
if (buffer==1)
write_SPI(MM_PAGE_TO_B1_XFER);
else
write_SPI(MM_PAGE_TO_B2_XFER);
write_SPI((unsigned char)(page >> 6));
write_SPI((unsigned char)(page << 2));
write_SPI(0x00);
DF_DESELECT_1;
}
void DF_mm_to_buf(unsigned char buffer,unsigned int page)
{
DF_wait_busy();
DF_SELECT_1;
if (buffer==1)
write_SPI(MM_PAGE_TO_B1_XFER);
else
write_SPI(MM_PAGE_TO_B2_XFER);
write_SPI((unsigned char)(page >> 6));
write_SPI((unsigned char)(page << 2));
write_SPI(0x00);
DF_DESELECT_1;
}
//读取指定缓冲区指定单元的数据,保存在DF_buffer[]数组中
unsigned char DF_read_buf(unsigned char buffer,unsigned int start_address,unsigned int length)
{
unsigned int i;
if ((527-start_address)>=length)
{
DF_wait_busy();
DF_SELECT_1;
if (buffer==1)
write_SPI(BUFFER_1_READ);
else
write_SPI(BUFFER_2_READ);
write_SPI(0x00);
write_SPI((unsigned char)(start_address >> 8));
write_SPI((unsigned char)start_address);
write_SPI(0x00);
for (i=0;i<length;i++)
{
write_SPI(0xFF);
DF_buffer[i] = SPDR;
}
DF_DESELECT_1;
return 1;
}
else
return 0;
}
//将DF_buffer[]数组中指定长度的数据写入指定缓冲区
unsigned char DF_write_buf(unsigned char buffer,unsigned int start_address,unsigned int length)
{
unsigned int i;
if ((527-start_address)>=length)
{
DF_wait_busy();
DF_SELECT_1;
if (buffer==1)
write_SPI(BUFFER_1_WRITE);
else
write_SPI(BUFFER_2_WRITE);
write_SPI(0x00);
write_SPI((unsigned char)(start_address >> 8));
write_SPI((unsigned char)start_address);
for (i=0;i<length;i++)
write_SPI(DF_buffer[i]);
DF_DESELECT_1;
return 1;
}
else
return 0;
}
//将指定缓冲区中的数据写入主存储区的指定页
void DF_buf_to_mm(unsigned char buffer,unsigned int page)
{
DF_wait_busy();
if (page<4096)
{
DF_SELECT_1;
if (buffer==1)
write_SPI(B1_TO_MM_PAGE_PROG_WITH_ERASE);
else
write_SPI(B2_TO_MM_PAGE_PROG_WITH_ERASE);
write_SPI((unsigned char)(page>>6));
write_SPI((unsigned char)(page<<2));
write_SPI(0x00);
DF_DESELECT_1;
}
}
/******************main.c*******************************/
#include <iom128v.h>
#include <macros.h>
#include"memory.h"
void IO_init(void)
{
#include <macros.h>
#include"memory.h"
void IO_init(void)
{
DDRA = 0x00;
PORTA = 0xFF;
DDRB = 0xF7;
PORTB = 0xff;
DDRC = 0x00;
PORTC = 0xFF;
DDRD = 0x00;
PORTD = 0xFF;
DDRE = 0x00;
PORTE = 0xFF;
DDRF = 0x00;
PORTF = 0xFF;
DDRG = 0x00;
PORTG = 0xFF;
}
void SPI_init(void)
{
SPCR|=((1<<SPE)|(1<<MSTR)|(1<<SPR0));
}
PORTA = 0xFF;
DDRB = 0xF7;
PORTB = 0xff;
DDRC = 0x00;
PORTC = 0xFF;
DDRD = 0x00;
PORTD = 0xFF;
DDRE = 0x00;
PORTE = 0xFF;
DDRF = 0x00;
PORTF = 0xFF;
DDRG = 0x00;
PORTG = 0xFF;
}
void SPI_init(void)
{
SPCR|=((1<<SPE)|(1<<MSTR)|(1<<SPR0));
}
void uart_init0(void) {
UCSR0A = (1 << U2X0); /*倍速*/
UCSR0B = (1 << TXEN0) | (1 << RXEN0); /*允许接收和发送*/
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); /*8位数据、1 位停止、异步、无校验*/
UBRR0H = 0x00;
UBRR0L = 12; /*波特率9600*/
}
void uart_transmit0(unsigned char i)
{
while (!(UCSR0A & (1<<UDRE0))); /* 等待发送缓冲器为空*/
UDR0 = i; /* 发送数据*/
}
UDR0 = i; /* 发送数据*/
}
unsigned char uart_receive0(void)
{
{
while (!(UCSR0A & (1<<RXC0))); /* 等待接收数据*/
return UDR0; /* 获取并返回数据*/
}
return UDR0; /* 获取并返回数据*/
}
void main(void)
{
unsigned int i;
for(i=0;i<528;i++)
{DF_buffer[i]=0x05;}
IO_init();
SPI_init();
uart_init0();
DF_write_page(0);
DF_read_page(0);
for(i=0;i<512;i++)
uart_transmit0(DF_buffer[i]);
while(1);
}
{
unsigned int i;
for(i=0;i<528;i++)
{DF_buffer[i]=0x05;}
IO_init();
SPI_init();
uart_init0();
DF_write_page(0);
DF_read_page(0);
for(i=0;i<512;i++)
uart_transmit0(DF_buffer[i]);
while(1);
}
