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 + -
显示快捷键?