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

📄 dataflash.c

📁 PWM输出控制三路步进电机
💻 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 + -