⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 temp.c

📁 FLASH的一些资料
💻 C
字号:
#include <avr/io.h>
#include <stdlib.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>    
#include <pgmspace.h>
#include <avr/io.h>
#include <stdlib.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>    
#include <pgmspace.h>   
#define		N				 10
#define	 	FREQ      		 14.7456
#define	 	uchar      		 uint8_t

//硬件引脚定义
//READ
#define READ_STATE_REGISTER   0xd7
#define MAIN_MEMORY_PAGE_READ 0xd2
#define BUFFER_1_READ 0xd4
#define BUFFER_2_READ 0xd6
//ERASE
#define SECTOR_ERASE     0x7c
#define PAGE_ERASE       0x81
#define BLOCK_ERASE      0x50
//WRITE
#define BUFFER_1_WRITE 0x84
#define BUFFER_2_WRITE 0x87
#define B1_TO_MM_PAGE_PROG_WITH_ERASE 0x83
#define B2_TO_MM_PAGE_PROG_WITH_ERASE 0x86
#define MM_PAGE_PROG_THROUGH_B1       0x82
#define MM_PAGE_PROG_THROUGH_B2       0x85
//OTHER
#define MM_PAGE_TO_B1_XFER 0x53
#define MM_PAGE_TO_B2_XFER 0x55

#define FLASH_PAGE_COUNT 8192
#define FLASH_PAGE_SIZE 1056

#define MOSI_L cbi(PORTB,2)
#define MOSI_H sbi(PORTB,2)

#define SCK_L cbi(PORTB,1)
#define SCK_H sbi(PORTB,1)

#define FLASH_RES_L cbi(PORTE,4)
#define FLASH_RES_H sbi(PORTE,4)
#define WP_L cbi(PORTE,3)
#define WP_H sbi(PORTE,3)

#define FLASH_CS_L cbi(PORTE,2)
#define FLASH_CS_H sbi(PORTE,2)
#define SS_H sbi(PORTB,0)
#define SS_L cbi(PORTB,0)

#define DF_SELECT_1   FLASH_CS_L
#define DF_DESELECT_1 FLASH_CS_H

void spi_initial(void)
{
	uint8_t temp; 
	DDRB |= 0x07; //MISO=input and MOSI,SCK,SS = output 
	PORTB |= 0x0f; //MISO上拉电阻有效 
	SPCR = 0x5c; //SPI允许,主机模式,MSB 
	SPSR = 0x00; 
	temp = SPSR; 
	temp = SPDR; //清空SPI,和中断标志,使SPI空闲 

}
uint8_t write_SPI(uint8_t c)
{
	uint8_t data;
	SPDR=c;
	while((SPSR&0x80)==0);
	data=SPDR;
	return data;
}
void Host_write_SPI(uint8_t c)
{
	SPDR=c;
	while((SPSR&0x80)==0);
}
void df_init(void)
{
cbi(DDRE,1);
sbi(PORTE,1);
cbi(DDRE,0);
sbi(PORTE,0);

spi_initial();
cbi(DDRE,5);//RDY
sbi(PORTE,5);
sbi(DDRE,2);//CS
FLASH_CS_H;
sbi(DDRE,4);//RES
FLASH_RES_H;
sbi(DDRE,3);//WP
WP_H;
}
uint8_t DF_read_reg(void)
{
	uint8_t temp;
	temp=0;
	FLASH_CS_L;
	
	temp=write_SPI(0xd7);
	temp=write_SPI(0x00);

	FLASH_CS_H;
	return temp;
}
//检查状态寄存器最高位是否为忙,并等待空闲
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)
	{
		state_reg = write_SPI(0x00);
	}
	DF_DESELECT_1;
}
//格式化主存储器(以扇区<0A,0B,1……31>为单位删除所有页数据)
uint8_t 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_wait_busy();
	DF_SELECT_1;
	write_SPI(SECTOR_ERASE);
	write_SPI(0x00);
	write_SPI(0x40);
	write_SPI(0x00);
	DF_DESELECT_1;

	for (i=1;i<32;i++)
	{
		DF_wait_busy();
		DF_SELECT_1;
		write_SPI(SECTOR_ERASE);
		write_SPI(i << 3);
		write_SPI(0x00);
		write_SPI(0x00);
		DF_DESELECT_1;
	}
	return 1;
}
//以直接读取方式读取指定的主存储器数据(页范围0-8191,地址范围0-1055,长度范围1-1056)
uint8_t DF_MM_read(unsigned int page,uint16_t start_address,uint8_t DF_buffer[],unsigned int length)
{
	unsigned int i;
	if ((1056-start_address)>=length)
	{
		DF_wait_busy();
		DF_SELECT_1;
		write_SPI(MAIN_MEMORY_PAGE_READ);
		write_SPI((unsigned char)(page >> 5));
		write_SPI((unsigned char)((page << 3)|(start_address>>8)));
		write_SPI((unsigned char)start_address);
		write_SPI(0x00);
		write_SPI(0x00);
		write_SPI(0x00);
		write_SPI(0x00);
		for (i=0;i<length;i++)
			{
				DF_buffer[i] = write_SPI(0xFF);
			}
			DF_DESELECT_1;
			return 1;
	}
	else
		return 0;
}
//将DF_buffer[]数组中指定长度的数据写入指定缓冲区
unsigned char DF_write_buf(unsigned char buffer,unsigned int start_address,uint8_t DF_buffer[],unsigned int length)
{
	unsigned int i;
	if  ((1056-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<8192)
	{
		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>>5));
		write_SPI((unsigned char)(page<<3));
		write_SPI(0x00);
		DF_DESELECT_1;
	}
}
//将temp1,temp2数据写入指定缓冲区1
void DF_write_buf_1(unsigned int start_address,uint8_t temp1,uint8_t temp2)
{

	//DF_wait_busy();
	DF_SELECT_1;
	Host_write_SPI(BUFFER_1_WRITE);
	Host_write_SPI(0x00);
	Host_write_SPI((unsigned char)(start_address >> 8));   
	Host_write_SPI((unsigned char)start_address);
	Host_write_SPI(temp1);
	Host_write_SPI(temp2);
	DF_DESELECT_1;
}
//将temp1,temp2数据写入指定缓冲区2
void DF_write_buf_2(unsigned int start_address,uint8_t temp1,uint8_t temp2)
{

	//DF_wait_busy();
	DF_SELECT_1;
	Host_write_SPI(BUFFER_2_WRITE);
	Host_write_SPI(0x00);
	Host_write_SPI((unsigned char)(start_address >> 8));   
	Host_write_SPI((unsigned char)start_address);
	Host_write_SPI(temp1);
	Host_write_SPI(temp2);
	DF_DESELECT_1;
}
int main()
{	
	uint8_t DF_buffer[1024],temp=0;
	df_init();
	//DF_write_buf_1(0,1,1);
	DF_wait_busy();
	temp=DF_read_reg();
	//DF_buf_to_mm(1,1000);
	DF_wait_busy();
	DF_MM_read(1081,0,DF_buffer,1000);
	while(1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -