📄 dataflash.c
字号:
/************************
AVR单片机SPI口读写AT26DF081A
文件名:dataflash.c
编译:WinAVR-20070525
*******************************/
#include "dataflash.h"
/*****下面是全局变量定义******/
//static uint16_t g_CurReadPage;//当前读的页地址
//static uint16_t g_CurReadByte;//当前读的字节(页中地址)
//static uint16_t g_CurWritePage;//当前写的页地址
//static uint16_t g_CurWriteByte;//当前写的字节地址(页中地址)
/*****下面是文件内部使用的函数******/
static uint8_t spi_write(uint8_t data)
{
SPDR = data;
while(!(SPSR & _BV(SPIF))); //trans over?
return SPDR;
}
void test_st(void) //sectors un-protect
{
uchar pppp;
SELECT_CHIP;
pppp = spi_write(0x05);
pppp = spi_write(0x12);
UNSELECT_CHIP;
}
void write_st(void) //sectors un-protect
{
uchar pppp;
SELECT_CHIP;
pppp = spi_write(0x01);
pppp = spi_write(0x00);
UNSELECT_CHIP;
}
void write_array_to_df(uint16_t page, uint8_t line,uint16_t counter)
{
uint16_t i,j;
PORTB |= _BV(FLASH_WP);
i= write_wel(WRITE_ENB); //06, 1byte
asm("nop");
write_st(); //Wire protect=00
asm("nop");
i= write_wel(WRITE_ENB); //06
_delay_us(200);
asm("nop");
SELECT_CHIP;
asm("nop");
asm("nop");
spi_write(PAGE_WRITE); //02,order
asm("nop");
spi_write((uint8_t)(page >> 8));
asm("nop");
spi_write((uint8_t)(page));
asm("nop");
spi_write(line);
asm("nop");
_delay_us(200);
for(i=0; i< counter; i++)
{
asm("nop");
j=DATA_WRITE_DF[i];
spi_write(DATA_WRITE_DF[i]);
asm("nop");
}
UNSELECT_CHIP;
_delay_us(200);
_delay_us(200);
}
void read_array_to_ram(uint16_t page, uint8_t line,uint16_t counter)
{
uint16_t i;
SELECT_CHIP;
_delay_us(200);
spi_write(BUFFER_1_READ); //0B|03 define address order
spi_write((uint8_t)(page >> 8)); //page * 0x100H=Address
spi_write((uint8_t)(page));
spi_write(line);
for(i=0; i< counter; i++) //counter as line include 0x10hB
{
DF_READ_BUFFER[i] = spi_write(0);
}
UNSELECT_CHIP;
}
void write_st_enb(void) //sectors un-protect
{
SELECT_CHIP;
spi_write(WRITE_ST_REG);
spi_write(0x00);
UNSELECT_CHIP;
}
uint8_t write_wel(uint8_t data) //WRITE_ENB --data
{
SELECT_CHIP;
spi_write(data);
// data = spi_write(0x12);
UNSELECT_CHIP;
return data; //1, Write disable
}
//page Write the RAM to dataflash
uchar chk_df()
{
for(lll=0; lll<256; lll++)
{
if(DATA_WRITE_DF[lll] ==DF_READ_BUFFER[lll])
{
asm("nop");
return(0);
}
else
{
asm("nop");
return(1);
}
}
}
void erase_block(uint16_t page, uint8_t erase_order)
{ //page =700, 70000-71000 erased,
//page =718, 71000-72000 erased,
uint16_t i,j;
i= write_wel(WRITE_ENB); //06, 1byte
asm("nop");
write_st(); //Wire protect=00
asm("nop");
i= write_wel(WRITE_ENB); //06
_delay_us(200);
asm("nop");
SELECT_CHIP;
asm("nop");
asm("nop");
spi_write(erase_order); //20:4Kb 0x1000B; 52:32KB; D8:64KB
asm("nop");
spi_write((uint8_t)(page >> 8));
asm("nop");
spi_write((uint8_t)(page));
asm("nop");
spi_write(0x00);
asm("nop");
_delay_us(200);
UNSELECT_CHIP;
}
void df_init(void)
{
PORTB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS)|_BV(FLASH_WP)|_BV(FLASH_HOLD);
DDRB |= _BV(FLASH_SCK)|_BV(FLASH_MOSI)|_BV(FLASH_CS)|_BV(FLASH_WP)|_BV(FLASH_HOLD);
DDRB &= _BV(FLASH_MISO); //input
SPCR = _BV(SPE)|_BV(MSTR)|_BV(CPHA)|_BV(CPOL);//|_BV(SPR1)|_BV(SPR0);
SPCR &= _BV(SPIE) & _BV(DORD) & _BV(SPR1) & _BV(SPR0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -