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

📄 c8051f021spitofm24cl04.c

📁 C8051F021软件模拟SPI实现对FM25CL04的读写操作
💻 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 + -