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

📄 fm25l256.c

📁 用MSP430F149的普通输入输出口模拟SPI
💻 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;
          _NOP();
       } 
       else
       {
          DIN_0;
          _NOP();
       }  
       CLK_1;
       _NOP(); 
       CLK_0;
       _NOP(); 
   }
}
//*********************************************************************************
unsigned int inputbyt(void)
{ 
   unsigned char count; 
   unsigned char dat=0;
   P6DIR&=~BIT4;
   for(count=0;count<8;count++)
   { 
     dat<<=1; 
     if(P6IN&BIT4==1)
     {
       dat++; 
     }        
     CLK_1; 
     CLK_0; 
     _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((uchar)(Address>>8));
   outbyt((uchar)(Address));
   for(i=0;i<num;i++)
   {
     outbyt(*(ptr+i));
   }
   CLK_0;CSX_1;
}
//*****************************************************************************
uchar byte_read(uint Address)                     //读单字节数据
{
   uchar temp;
   uchar temph,templ;
   temph=(uchar)(Address>>8);
   templ=(uchar)(Address);
   CLK_0;CSX_0;
   outbyt(READ_INST);           
   outbyt((uchar)(Address>>8));
   outbyt((uchar)(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 number[16]={0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff,0x28};
   uchar numtime[16];
   WDTCTL=WDTPW+WDTHOLD;
   P2DIR|=BIT3+BIT5+BIT6; //设置P2.3 P2.5 P2.6为输出
   P2DIR&=~BIT4;          //设置为P2.4输入
   wrsr_cmd(0x00);        //取消写保护
   wren_cmd();            //设置为写
   for(i=0;i<16;i++)      //从地址0开始写16个数 测试单字节写
   {
      byte_write(i,number[i]);
   }
   _NOP();
   _NOP();
   for(i=0;i<16;i++)     //从地址0开始读16个数 测试单字节读
   {
      numtime[i]=byte_read(i);
   }	
   _NOP();
   _NOP();	
   
   write_seq(31000,tempw,16);     //从地址31000开始写16个数 测试多字节写
   _NOP();
   _NOP();
   read_seq(31000,tempr,16);     //从地址31000开始读16个数 测试多字节读
   _NOP();
   _NOP();
}


		

⌨️ 快捷键说明

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