📄 c8051f021spitofm24cl04.c
字号:
//使用铁电存储器FM25CL04,C8051F020为主模式,12MHz外部晶振
#include <c8051F020.h> /* define 8051 registers */
#include <stdio.h>
#define uchar unsigned char
#define WREN 0x06
#define WRDI 0x04
#define RDSR 0x05
#define WRSR 0x01
#define READ 0x03
#define WRITE 0x02
xdata unsigned char temp;
xdata unsigned char SPI_byte;
xdata uchar T1_data[4]={255,255,236,129};
xdata uchar T2_data[4]={0,0,0,0};
sbit SCK=P0^2; //SCK推挽输出
sbit MISO=P0^3; //开漏输出
sbit MOSI=P0^4; //推挽输出
sbit NSS=P0^5; //FM25CL04片选端口
sbit HOLD=P1^1;
xdata uchar spi_temp;
void delay(unsigned int m)
{
unsigned int j;
for(j=0;j<m;j++){;};
}
void Port_IO_Init()
{
P0MDOUT = 0x35;
P1MDOUT = 0xFF;
P2MDOUT = 0xFF;
XBR2 = 0x40;
}
void Oscillator_Init()
{
int i = 0;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
OSCICN = 0x0C;
}
void SendSPIByte(unsigned char ch)
{
unsigned char SPI_count; //SPI办理计数器
temp=ch;
for(SPI_count=8;SPI_count>0;SPI_count--) //单个字节SPI循环
{
SCK=0x00;
MOSI=temp&0x80; //放当前输出位到MOSI
temp=temp<<1; //移下一位MSB
SCK=0x01; //设置SCK为高,MOSI有效到SCK上升
//SCK=0;
};
}
unsigned char GetSPIByte(void)
{
unsigned char SPI_count; //SPI办理计数器
SPI_byte=0;
for(SPI_count=0;SPI_count<8;SPI_count++) //单个字节SPI循环
{
SCK=0x00;
SPI_byte=SPI_byte<<1; //移下一位MSB
SCK=0x01; //设置SCK为高
//delay(10);
SPI_byte|=MISO; //MISO上捕捉当前位
}
return SPI_byte;
}
void Write_FRAM(unsigned char *Send_data,unsigned char DataLen)
{
unsigned char i;
HOLD=1;
NSS=0;
delay(5);
SendSPIByte(WREN); //写使能
NSS=1;
delay(5);
NSS=0;
delay(5);
SendSPIByte(WRITE); //写操作
SendSPIByte(0x00); //数据块首地址
for(i=0;i<DataLen;i++)
{
SendSPIByte(*Send_data++);
}
NSS=1;
delay(5);
NSS=0;
SendSPIByte(WRDI); //写禁止
delay(5);
NSS=1;
}
void Read_FRAM(unsigned char *Get_data,unsigned char DataLen)
{
unsigned char j;
NSS=0;
delay(5);
SendSPIByte(READ); //读操作
SendSPIByte(0x00); //数据块首地址
for(j=0;j<DataLen;j++)
{
*Get_data++=GetSPIByte();
};
NSS=1;
delay(5);
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
WDTCN=0xde; //禁止看门狗定时器
WDTCN=0xad;
Port_IO_Init();
Oscillator_Init();
}
void main()
{
//uchar i;
Init_Device();
EA=0;
while(1)
{
Write_FRAM(T1_data,4);
Read_FRAM(T2_data,4);
temp=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -