?? 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 + -