|
各位坛友帮忙看哈 谢谢了
程序如下
#include"M25P32.H"
#include"uart12.h"
unsigned char FlashData,FlashData1;
//***********延时函数********************////
void delay_spi( )//1us 11.0592
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
///***********延时函数3ms*************
void Delay3ms()
{
unsigned char i, j;
_nop_();
_nop_();
i = 33;
j = 66;
do
{
while (--j);
} while (--i);
}
//************************************
//**/****** 延时函数300ms*************
void Delay300ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
_nop_();
i = 13;
j = 156;
k = 83;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/////******初始化spi
void int_spi()
{
CS=1;
CLK=1;
}
////*******************发送一个字节**********************/
void send_spi(unsigned char dat)
{
unsigned char s=0,i;
unsigned char temp=0;
temp=dat;
CS=0;
for(i=0;i<8;i++)
{
CLK=0;
delay_spi();
s=temp&0x80;
if(s==0x80)
DI=1;
else
DI=0;
delay_spi();
delay_spi();
CLK=1;
delay_spi();
delay_spi();
delay_spi();
temp=temp<<1;
}
CS=1;
}
void waitwiriteEND(unsigned char state,unsigned int number)
{
unsigned int i;
unsigned char addr;
if(state==0)//等待模式
{
for(i=0;i<number;i++)
{
CLK=0;
delay_spi();
delay_spi();
CLK=1;
delay_spi();
delay_spi();
delay_spi();
}
}
if(state==1)
{
do
{
addr=read_sr(0x01); ///写状态寄存器
}
while(addr&0x80);
}
// do
//
// {
// addr=read_sr(0x05); ///读状态寄存器
//
// }
// while(addr&0x01);
// }
}
//*****发送允许指令*************
void write_sr()
{
CS=0;
CLK=0;
send_spi(WREN); /////写使能06
CLK=1;
CS=1;
}
///**********读取一个字节**********************
unsigned char read_spi()
{
unsigned char i;
unsigned tdata;
for (i=0;i<8;i++)
{
CLK=1;
tdata = (tdata<<1); //xxxxxxx0
CLK=0;
if(DO==1)
{
tdata |=0x01; //xxxxxxx0|00000001
}
else
{
tdata &=~0x01; //xxxxxxx0&11111110
}
}
return tdata;
// unsigned char i,data_read=0;
//
// for(i=0;i<8;i++)
// {
//
//
// data_read<<=1;
// CLK=1;
// delay_spi();
// delay_spi();
//
// CLK=0;
//
// data_read=data_read|DO; ///看 c是否每一位输出数据
//
// }
//
// return data_read;
}
//***读取寄存器***************
unsigned char read_sr(unsigned char Send_Read_Reg_CMD)
{
unsigned char read_1;
CS=0;
send_spi(Send_Read_Reg_CMD );
read_1=read_spi();
CS=1;
return read_1;
}
//****写入多个字节***********/
void write_ye(u16 *P, u32 sendaddr,u8 j )
{
unsigned char i;
write_sr(); ////允许写
waitwiriteEND(1,0);
/// while(FLASHBUSY()); ////
CS=0;
// waitwiriteEND(2,0);
send_spi(PP); ///////页数据指令
send_spi((sendaddr&0xff0000)>>16);
send_spi((sendaddr&0xff00)>>8);
send_spi(sendaddr&0xff);
delay_spi();
delay_spi();
for(i=0;i<j;i++)
{
delay_spi();
FlashData = P[i];
send_spi(FlashData);
}
CS=1;
Delay3ms();
}
///***********读取多个字节***********/
void read_data(u32 readaddr, u8 rx) ////地址+
{
unsigned int i=0;
unsigned char save_H,save_L;
write_sr();
CS=0;
send_spi(0x03); ///读数据指令
send_spi((readaddr&0xff0000)>>16); //地址1高
send_spi((readaddr&0xff00)>>8); //地址2
send_spi(readaddr&0xff); //地址3低
send_spi(0x00); ///清读
while(rx--)
{
delay_spi( );
save_L=read_spi();
atey[i]=save_L;
i++;
}
CS=1;
Delay3ms();
}
/*********扇区擦除***********/
void Erase_datac( u32 readAddr,unsigned char c_addr)
{
/********允许写入命令*******/
write_sr();
CS=0;
send_spi( SE );//发送扇区擦除命令
if(c_addr==1)
{
send_spi((readAddr & 0xFF0000) >> 16);//地址1高
send_spi((readAddr & 0xFF00) >> 8);//地址2
send_spi(readAddr & 0xFF);//地址3低
}
Delay3ms();
CS=1;//结束,关闭模块
Delay300ms();
}
//*****读ID************************
// void ccc()
//{
// unsigned int i;
// CS=0;
// send_spi(0x90);
// waitwiriteEND(0,30);
// for(i=0;i<5;i++)
// {
// atey[i]=read_spi();
// }
//
// CS=1;
// CS=0;
//// send_spi(0xAB);
// send_spi(0x9f);
// for(i=5;i<10;i++)
// {
// atey[i]= read_spi();
// }
// waitwiriteEND(0,30);
// CS=0;
//}
//***********主程序******/////////////////////////////***
#include"main.h"
#include"M25P32.H"
#include"UART12.h"
sbit led=P2^6;
sbit led2=P2^7;
xdata unsigned int atey[16];
unsigned char but[8]={"asdfghjk"};
void main(void)
{
int i=0;
uart12_1();
int_spi(); /////初始
while(1)
{
Erase_datac(FLASH_WriteAddress,1); //扇区擦除
led=0;
write_ye(but,FLASH_WriteAddress,8); ///写入数据
led2=0;
// led2=0;
// Delay3ms();
Delay3ms();
read_data(FLASH_WriteAddress, 8); //读取数据
led2=0;
// ccc();
SendString("out:123");
// led=0;
// SendString(atey);
SendString("\r\n");
// for(i=0;i<8;i++)
// {
//
// led=0;
// SendData(atey[i]);
//
// }
}
}
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
该献的血还是要献的。你不献他不献。难道让我去献? --- 出自坛友:lovejp1981
|