fm25c160.c

来自「C语言写的铁电存储器[FM25C160]的驱动程序」· C语言 代码 · 共 165 行

C
165
字号
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define	WREN	0X06
#define	WRDI	0X04
#define	WRSR	0X01
#define	RDSR 	0X05
#define	READ 	0X03
#define	WRITE 	0X02

sbit fm25c160_cs = P0^4;
sbit fm25c160_sck = P0^7;
sbit fm25c160_so = P0^6;
sbit fm25c160_si = P0^5;
//sbit fm25c160_wp = P2^3;
//SPIsend 上升沿锁存
void sendbyte(uchar val)
{
	uchar i;
	for(i=8;i>0;i--)
	{
		if(val&0x80)
			fm25c160_si=1;
		else
			fm25c160_si=0;
		fm25c160_sck=0;
		fm25c160_sck=1;
		val<<=1;
	}
}
//SPIreceive  下降沿
uchar receivebyte(void)
{
	uchar i,temp=0;
	for(i=8;i>0;i--)
	{
		temp<<=1;
		fm25c160_sck=1;		//或可改写为:	fm25c160_sck=0;
		_nop_();_nop_();	//				fm25c160_sck=1;	
		fm25c160_sck=0;		//与接收相同,不过是放在前面
		if(fm25c160_so==1)
			temp|=0x01;
	}
	return(temp);
}
//write enable
void wren(void)
{
	fm25c160_cs=0;	
	sendbyte(WREN);
	fm25c160_cs=1;
}
//close write enable
void wrdi(void)
{
	fm25c160_cs=0;
	sendbyte(WRDI);
	fm25c160_cs=1;
}
//page write
//input: address of target-addr1, address of source-addr2, length of bytes   
void wrbytes(uint addr1,uchar *addr2,uint length)
{
	uint i;
	wren();
	fm25c160_sck=0;
	fm25c160_cs=0;
	sendbyte(WRITE);
	sendbyte(addr1>>8);
	sendbyte(addr1);
	for(i=0;i<length;i++)
	{
		sendbyte(*(addr2+i));
	}
	fm25c160_sck=0;
	fm25c160_cs=1;
	wrdi();	
}
//page read
//input: address of target-addr1, address of deposit-addr2, length of bytes
void rdbytes(uint addr1,uchar *addr2,uint length)
{
	uint i;
	wren();
	fm25c160_sck=0;
	fm25c160_cs=0;
	sendbyte(READ);
	sendbyte(addr1>>8);
	sendbyte(addr1);
	for(i=0;i<length;i++)
	{
		*(addr2+i)=receivebyte();
	}
	fm25c160_sck=0;
	fm25c160_cs=1;
}

/*
//read one byte
//input: address of the byte 
//return: the data of readed
uchar rdbyte(uint addr)
{
	uchar temp=0;
	fm25c160_sck=0;
	fm25c160_cs=0;
	sendbyte(READ);
	sendbyte(addr>>8);
	sendbyte(addr);
	temp=recievebyte();
	fm25c160_cs=1;
	return(temp);
}

//write one byte
//input: address-addr,and the value-val of the data that will be writen
void wrbyte(uint addr,uchar val)
{
	uchar temp=0;
	wren();
	fm25c160_wp=1;
	fm25c160_sck=0;
	fm25c160_cs=0;
	sendbyte(WRITE);
	sendbyte(addr>>8);
	sendbyte(addr);
	sendbyte(val);
	fm25c160_sck=0;
	fm25c160_cs=1;
	wrdi();
}

//read status register
uchar rdsr(void)
{
	uchar temp;
	fm25c160_sck=0;
	fm25c160_cs=0;
	sendbyte(RDSR);
	temp=recievebyte();
	fm25c160_cs=1;
	return(temp);
}

//waiting for writing complete
void waitwrite(void)
{
	uchar i=0;
	while(rdsr()&0x01)
	{
		if(i++>50)
			break;
	}
}
*/

void main (void)
{
	uchar temp1[0x20]={0},code temp2[0x20]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
	rdbytes(0,&temp1,0x20);
	wrbytes(0,&temp2,0x800);
	rdbytes(0,&temp1,0x20);
	_nop_();
}

⌨️ 快捷键说明

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