📄 temp.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 + -