📄 fm25l256.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 + -