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

📄 flash.c

📁 cygnal上的数据采集的程序(带实时时钟)
💻 C
字号:
#include<intrins.h>
#include "C8051f.h"

unsigned char bdata SPI_DUMP;

sbit SPI_D7 = SPI_DUMP^7;
sbit SPI_D0 = SPI_DUMP^0;

void SPI_Init (void)
{
   SPI0CFG = 0x07;                     // data sampled on 1st SCK rising edge
                                       // 8-bit data words
   SPI0CFG |= 0xC0;	//CKPOL =1;

   SPI0CN = 0x03;                      // Master mode; SPI enabled; flags
                                       // cleared
   SPI0CKR = SYSCLK/2/8000000-1;       // SPI clock <= 8MHz (limited by 
                                       // EEPROM spec.)
}



void SPI_Write(unsigned char dat)
{
	unsigned char temp;
	SPI_DUMP = dat;
	for(temp = 0; temp<8; temp++)
	{
		SSI = SPI_D7;
		SSCK = 1;
		SPI_DUMP = SPI_DUMP << 1;
		SSCK = 0;
	}
}

unsigned char SPI_Read()
{	
	unsigned char temp;
	for(temp = 0; temp<8; temp++)
	{
			SSCK = 1;
			SPI_DUMP = SPI_DUMP << 1;
			SPI_D0 = SSO;
			SSCK = 0;
	}
	return(SPI_DUMP);
}

unsigned char SA_RDSR() //读状态寄存器
{	
	unsigned char temp;
	EA = 0;
	SCS = 0;
	SPI_Write(0x05);
	temp = SPI_Read();
	temp = SPI_Read();
	SCS = 1;
	EA = 1;
	return(temp);
}

void SA_WREN()//允许写
{
	do
	{
		if((SA_RDSR()&0x01) == 0) 
		break;
	}while(1);
	EA = 0;
	SCS = 0;
	SPI_Write(0x06);
	SCS = 1;
	EA = 1;
}

void SA_WRDI() //禁止写
{	
	do
	{
		if((SA_RDSR()&0x01) == 0) 
		break;
	}while(1);
	EA = 0;
	SCS = 0;
	SPI_Write(0x04);
	SCS = 1;
	EA = 1;

}
void SA_WRSR(unsigned char da)//写状态寄存器
{
	do
	{
		if((SA_RDSR()&0x01)==0) 
		break;
	}while(1);
	EA = 0;
	SCS = 0;
	SPI_Write(0x01);
	SPI_Write(da);
	SCS = 1;
	EA = 1;
}

void SA_Read(unsigned long addr,unsigned char *ptr,unsigned int size)//
{
	unsigned char addr_hh;
	unsigned char addr_h;
	unsigned char addr_l;
	unsigned int si;
	addr_l = addr&0x0000ff;
	addr_h = (addr&0x00ff00) >> 8;
	addr_hh = (addr&0xff0000) >> 16;
	do
	{
		if((SA_RDSR()&0x01) == 0)
	 	break;
	}while(1);
	EA = 0;
	SCS = 0;
	SPI_Write(0x03);
	SPI_Write(addr_hh);
	SPI_Write(addr_h);
	SPI_Write(addr_l);
	for(si = 0; si<size; si++)
	{
		ptr[si] = SPI_Read();
	}
	SCS = 1;
	EA = 1;
}


unsigned char SA_ReadB(unsigned long addr)  //读一个字节
{
	unsigned char addr_hh;
	unsigned char addr_h;
	unsigned char addr_l;
	unsigned char temp;
	addr_l = addr&0x0000ff;
	addr_h = (addr&0x00ff00) >> 8;
	addr_hh = (addr&0xff0000) >> 16;
	do
	{
		if((SA_RDSR()&0x01) == 0)
		break;
	}while(1);
	EA = 0;
	SCS = 0;
	SPI_Write(0x03);
	SPI_Write(addr_hh);
	SPI_Write(addr_h);
	SPI_Write(addr_l);
    temp = SPI_Read();
	SCS = 1;
	EA = 1;
    return(temp);
}

void SA_PP(unsigned long addr,unsigned char *ptr,unsigned int len)//页写
{
	unsigned char addr_hh;
	unsigned char addr_h;
	unsigned char addr_l;
	unsigned int si;

	addr_l = addr&0x0000ff;
	addr_h = (addr&0x00ff00) >> 8;
	addr_hh = (addr&0xff0000) >> 16;

	do
	{
		if((SA_RDSR()&0x01) == 0)
		{
			break;
		}
	}while(1);
	SA_WREN();
	EA = 0;
	SCS = 0;
	SPI_Write(0x02);
	SPI_Write(addr_hh);
	SPI_Write(addr_h);
	SPI_Write(addr_l);
	for(si = 0; si < len; si++)
	{
		SPI_Write(ptr[si]);
	}
	SCS = 1;
	_nop_();
	_nop_();
	EA = 1;
	do
	{
		if((SA_RDSR()&0x01) == 0x01)
		{
			_nop_();
			_nop_();
		}
		else
		{ 
			break;
		}
	}while(1);
}




void SA_PE(unsigned long addr)   //页擦除
{
	unsigned char addr_hh;
	unsigned char addr_h;
	unsigned char addr_l;

	addr_l = addr&0x0000ff;
	addr_h = (addr&0x00ff00) >> 8;
	addr_hh = (addr&0xff0000) >> 16;
	do
	{
		if((SA_RDSR()&0x01) == 0)
	 	{
			break;
		}
	}while(1);
	SA_WREN();
	EA = 0;
	SCS = 0;
	SPI_Write(0x81);
	SPI_Write(addr_hh);
	SPI_Write(addr_h);
	SPI_Write(addr_l);
	SCS = 1;
	EA = 1;
}

SA_Write(unsigned long addr,unsigned char dat)//写一个字节
{
    unsigned char addr_l;
	unsigned long  num; 
	unsigned char ptr[256];
	addr_l = addr&0x0000ff;
	num = addr >> 8;
//	num=(addr/256)*256;//>>8;
//	addr_l=(unsigned char)(addr-num);
	SA_Read(num,&ptr[0],256);	
    ptr[addr_l] = dat;
	SA_PE(num);    
    SA_PP(num,&ptr[0],256);//页写
}



void SA_SE(unsigned long addr)  //扇区擦除
{
	unsigned char addr_hh;
	unsigned char addr_h;
	unsigned char addr_l;
	addr_l = addr&0x0000ff;
	addr_h = (addr&0x00ff00) >> 8;
	addr_hh = (addr&0xff0000) >> 16;
	do
	{
		if((SA_RDSR()&0x01) == 0)
	 	break;
	}while(1);
	SA_WREN();
	EA = 0;
	SCS = 0;
	SPI_Write(0xd8);
	SPI_Write(addr_hh);
	SPI_Write(addr_h);
	SPI_Write(addr_l);
	SCS = 1;
	EA = 1;
}
// bulk erase
void SA_BE()
{
	do
	{
		if((SA_RDSR()&0x01) == 0) break;
	}while(1);
	SA_WREN();
	EA = 0;
	SCS = 0;
	SPI_Write(0xc7);
	SCS = 1;
	EA = 1;
}

//software protection

void SA_SP()
{
	do
	{
		if((SA_RDSR()&0x01) == 0)
	 	break;
	}while(1);
	EA = 0;
	SCS = 0;
	SPI_Write(0xb9);
	SCS = 1;
	EA = 1;
}
// release from software protect and read ID

unsigned char SA_RSP()
{	
	unsigned char temp;
	do
	{
		if((SA_RDSR()&0x01) == 0)
	 	break;
	}while(1);
	EA = 0;
	SCS = 0;
	SPI_Write(0xab);
	SPI_Write(0x00);
	SPI_Write(0x00);
	SPI_Write(0x00);
	temp = SPI_Read();
	SCS = 1;
	EA = 1;
	return(temp);
}



void SA_Init()
{	
	unsigned char temp;
	SSCK = 0;
	SSI = 1;
	SSO = 1;
	SCS = 1;
	
	SA_WRSR(0x03);//0x03
	SA_WREN();
	temp = SA_RSP();
	temp = SA_RDSR();
	temp = SA_RDSR();
}

⌨️ 快捷键说明

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