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

📄 fm25l256.c

📁 用MSP430F149仿真SPI接口读写FM25系列铁电的测试程序。包括单字节和多字节读写。已通过测试。请大家放心使用。
💻 C
字号:

#include <msp430x14x.h>
#define  uint unsigned int
#define  uchar unsigned char
//********************************************************************************
#define WREN_INST  0X06   
#define WRDI_INST  0X04   
#define WRSR_INST  0X01   
#define RDSR_INST  0X05   
#define WRITE_INST 0X02  
#define READ_INST  0X03   
#define STATUS_REG 0X00   
//********************************************************************************
#define DIN_1  (P2OUT|=BIT5)     //p2.5数据输出口   p2.4为数据输入口
#define DIN_0  (P2OUT&=~BIT5)
#define CLK_1  (P2OUT|=BIT6)     //p2.6时钟信号
#define CLK_0  (P2OUT&=~BIT6)
#define CSX_1  (P2OUT|=BIT3)     //p2.3片选信号
#define CSX_0  (P2OUT&=~BIT3)
//***********************************************************************************
uchar temp[16];
uchar tempw[16]={0x55,0x56,0x57,0x58,0x59,0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x70};
uchar tempr[16];
//**************************************************************************************
uchar tempa;
uint  number;
uchar numtime; 
uchar bbyte;
//*********************************************************************************
void outbyt( uchar outbyte)   //字节写
{
   uchar BitCnt;
   for(BitCnt=0;BitCnt<8;BitCnt++)
   {
       if((outbyte<<BitCnt)&0x80)
       { 
          DIN_1;
       } 
       else
       {
          DIN_0;
       } 
       CLK_0; 
       CLK_1; 
   }
}
//*********************************************************************************
unsigned char inputbyt(void)
{ 
   unsigned char count; 
   unsigned char dat=0; 
   for(count=0;count<8;count++)
   { 
     dat<<=1; 
     CLK_0; 
     CLK_1;    
     if(P2IN&BIT4)
     {
       dat++; 
     }
     else 
     {
       _NOP();
     }    
   } 
   return(dat);
}
//********************************************************************************
void wren_cmd(void)    //打开写使能
{
   CLK_0;CSX_0;        
   outbyt(WREN_INST);  
   CLK_0;CSX_1;
}

//********************************************************************************

void wrdi_cmd(void)    //关闭写操作
{
   CLK_0;CSX_0;
   outbyt(WRDI_INST);
   CLK_0;CSX_1;
}

//***********************************************************************************
uchar rdsr_cmd (void)   //读状态寄存器
{
   uchar aa;
   CLK_0;CSX_0;
   outbyt(RDSR_INST);
   aa=inputbyt();
   CLK_0;CSX_1;
   return aa;
}
//*******************************************************************************
void wrsr_cmd(uchar status)  //写状态寄存器
{
   wren_cmd();
   CLK_0; CSX_0;
   outbyt(WRSR_INST);
   outbyt(status);
   CLK_0; CSX_1;
}
//******************************************************************************
void byte_write(uint Address,uchar aa)    //写一字节数据 
{
   wren_cmd(); 
   CLK_0;CSX_0;      
   outbyt(WRITE_INST);
   outbyt((uchar)(Address>>8));
   outbyt((uchar)(Address));
   outbyt(aa);
   CLK_0;CSX_1;
}
//******************************************************************************
void write_seq(uint Address,uchar *ptr,uchar num) //写多字节数据
{
   uchar i;
   wren_cmd();
   CLK_0;CSX_0;          
   outbyt(WRITE_INST); 
   outbyt((Address>>8));
   outbyt(Address);
   for(i=0;i<num;i++)
   {
     outbyt(*(ptr+i));
   }
   CLK_0;CSX_1;
}
//*****************************************************************************
uchar byte_read(uint Address)                     //读单字节数据
{
   uchar temp;
   CLK_0;CSX_0;   
   outbyt(READ_INST);        
   outbyt(Address>>8);
   outbyt(Address);
   temp=inputbyt();
   CLK_0;CSX_1;
   return(temp);
}

//***********************************************************************************************
void read_seq(uint Address,uchar *ptr,uchar num)    //读多字节数据
{
   uchar i;
   uchar temp;
   temp=(uchar)Address;
   CLK_0;CSX_0;
   outbyt(READ_INST);          
   outbyt((uchar)(Address>>8));
   outbyt((uchar)Address);
   for(i=0;i<num;i++)
   {
      *(ptr+i)=inputbyt();
   }
   CLK_0;CSX_1;
}
//*************************************************************************************************
void main(void)
{ 
   uint i=0;
   uchar bb=0;
   uchar number[16]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff,0x28};
   uchar numtime[16];
   WDTCTL=WDTPW+WDTHOLD;
//*********************//下面主要是提供高于200KHZ的时钟频率降低杜绝读写错误***************************   
   BCSCTL1 &= ~XT2OFF;                    
   do 
   {
     IFG1 &= ~OFIFG;                      // Clear OSCFault flag
     for (i = 0xFF; i > 0; i--);          // Time for flag to set
   }
   while ((IFG1 & OFIFG) != 0);          // OSCFault flag still set?                
   BCSCTL2 |= SELM1+SELS;                // MCLK = SMCLK = XT2*/
//***************************************************************************************************   
   P2DIR|=BIT3+BIT5+BIT6; //设置P2.3 P2.5 P2.6为输出
   P2OUT|=BIT3+BIT5+BIT6;
   P2DIR&=~BIT4;          //设置为P2.4输入
   wrsr_cmd(0x00);        //取消写保护
   wren_cmd();            //设置为写
   bb=rdsr_cmd();
   for(i=0;i<16;i++)      //从地址10开始写16个数 测试单字节写
   {
      byte_write((10+i),number[i]);
      _NOP();
      _NOP();
   }
   _NOP();
   _NOP();
   for(i=0;i<16;i++)     //从地址10开始读16个数 测试单字节读
   {
      numtime[i]=byte_read(10+i);
   }	
   _NOP();
   write_seq(100,tempw,16);     //从地址100开始写16个数 测试多字节写
   _NOP();
   read_seq(100,tempr,16);     //从地址100开始读16个数 测试多字节读
   _NOP();
   _NOP(); 	
   while(1)
   {
      _NOP();
   }
}


		

⌨️ 快捷键说明

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