📄 10244.c
字号:
#include <absacc.h>
#include <reg52.h>
//#include <math.h>
#include <intrins.h>
#define SPI_CS XBYTE[0x9000]
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
#define SomeNOP();_nop_();_nop_( );_nop_();_nop_();//_nop_();_nop_();
sbit SCLK = P1^3; //
sbit DIN = P1^2;
sbit DOUT = P1^1;
sbit I2CSCL = P1^6;
sbit I2CSDA = P1^7;
bit sen_data_f,rev_end_f;
bit busy_bit;
uchar state_word=0x55;
uchar nn,command;
uchar xdata flash_r_data[1500]={0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,};
uchar xdata flash_w_data[1000]={0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01};
uchar xdata rev_data[1000];
uchar xdata sen_data[1000];
ulong sen_len,sendatalong,revdatalong;
ulong long_num;
ulong address_num;
/***********************************************************************
************************************************************************/
void feedog(void)
{
I2CSDA=0;
I2CSDA=1;
}
void Delay_N_mS( unsigned int n_milisecond) // n mS delay
{
unsigned char i;
while(n_milisecond--)
{
i=248;
while(i--);
}
}
/**************************************************************************
**************************************************************************/
void init_serialcomm(void)
{
TMOD=0x21; //24MHz晶振
TL1=0xF3; //串行速率:
TH1=0xF3;
SCON=0x50;
PCON=0x80;
TR1=1;
EA=1; // IE = 0x90;
ES=1;
SCLK=0;
}
/***************写使能*******************************/
void write_en1()
{
EA=0;
SCLK=0;
SPI_CS=0XFB;
command=0x06;
for(nn=0;nn<8;nn++)
{
DIN=(bit)(command&0x80); //0x06写使能命令字
SCLK=1;
SomeNOP();
SCLK=0;
command=command<<1;
}
SCLK=0;
SPI_CS=0XFF;
EA=1;
}
/*********读状态寄存 判是否忙器*****************/
bit inquire_busy() //准备好返回1 忙返回:0
{
EA=0;
SCLK=0;
SPI_CS=0XFB;
command=0x05;
for(nn=0;nn<8;nn++)
{
DIN=(bit)(command&0x80);
SCLK=1;
SomeNOP();
SCLK=0;
command=command<<1;
}
state_word=0;
for(nn=0;nn<8;nn++)
{
state_word=state_word<<1;
SCLK=0;
SomeNOP();
SCLK=1;
if(DOUT) state_word++;
}
SCLK=0;
SPI_CS=0XFF; //disable SPI
EA=1;
if(state_word&0x01) return 0;
else
return 1;
}
/*************写状态寄存器,关闭写保护*******************************/
void close_protect(void)
{
write_en1();
SomeNOP();
EA=0;
SCLK=0;
SPI_CS=0XFB;
command=0x01;
for(nn=0;nn<8;nn++)
{
DIN=(bit)(command&0x80); //0x01写寄存器命令字去掉写保护
SCLK=1;
SomeNOP();
SCLK=0;
command=command<<1;
}
command=0x00;
for(nn=0;nn<8;nn++)
{
DIN=(bit)(command&0x80); //0x01写寄存器命令字去掉写保护
SCLK=1;
SomeNOP();
SCLK=0;
command=command<<1;
}
SCLK=0;
SPI_CS=0XFF;
/*
SPI_CS=0XF7;
command=0x01;
for(nn=0;nn<16;nn++)
{
SCLK=0;
DIN=(bit)(command&0x80); //0x01写寄存器命令字去掉写保护
command=command<<1;
//SomeNOP();
SCLK=1;
}
SCLK=0;
SPI_CS=0XFF; */
EA=1;
}
/**********擦出芯片**********************************/
void erase()
{
write_en1();
SomeNOP();
EA=0;
SCLK=0;
SPI_CS=0XFB;
command=0x62;
for(nn=0;nn<8;nn++)
{
DIN=(bit)(command&0x80); //0x06写使能命令字
SCLK=1;
SomeNOP();
SCLK=0;
command=command<<1;
}
SCLK=0;
SPI_CS=0XFF;
EA=1;
feedog();
Delay_N_mS(1500);
feedog();
Delay_N_mS(1500);
feedog();
Delay_N_mS(500);
feedog();
}
/*********读*****************************/
void read_1024(ulong address,uint count)
{
uint cci;
uint shift_address;
EA=0;
SPI_CS=0XFF;
SomeNOP();
SCLK=0;
SPI_CS=0XFB;
shift_address=address/65536; //middle_address;
shift_address=shift_address|0x0300;
for(nn=0;nn<16;nn++)
{
DIN=(bit)(shift_address&0x8000);
SCLK=1;
SomeNOP();
SCLK=0;
shift_address=shift_address<<1;
}
shift_address=address;
for(nn=0;nn<16;nn++)
{
DIN=(bit)(shift_address&0x8000);
SCLK=1;
SomeNOP();
SCLK=0;
shift_address=shift_address<<1;
}
for(cci=0;cci<count;cci++)
{
flash_r_data[cci]=0;
for(nn=0;nn<8;nn++)
{
flash_r_data[cci]=flash_r_data[cci]<<1;
SCLK=0;
SomeNOP();
SCLK=1;
if(DOUT) flash_r_data[cci]++;
}
SomeNOP();
}
SCLK=0;
SPI_CS=0XFF; //disable SPI
EA=1;
}
/***************************************************************/
void write_1024(uint count)
{
uint cci;
uint shift_address;
ulong middle_address;
uchar xdata send_middle;
write_en1();
SomeNOP();
EA=0;
SCLK=0;
SPI_CS=0XFB;
middle_address=address_num;
for(nn=0;nn<16;nn++)
{
middle_address=middle_address>>1;
}
shift_address=address_num/65536; //middle_address;
shift_address=shift_address|0x0200;
for(nn=0;nn<16;nn++)
{
DIN=(bit)(shift_address&0x8000);
SCLK=1;
SomeNOP();
SCLK=0;
shift_address=shift_address<<1;
}
shift_address=address_num;
for(nn=0;nn<16;nn++)
{
DIN=(bit)(shift_address&0x8000);
SCLK=1;
SomeNOP();
SCLK=0;
shift_address=shift_address<<1;
}
SomeNOP( );
for(cci=0;cci<count;cci++)
{
send_middle=flash_w_data[cci];
for(nn=0;nn<8;nn++)
{
DIN=(bit)(send_middle&0x80);
SCLK=1;
SomeNOP();
SCLK=0;
send_middle=send_middle<<1;
SomeNOP();//elay_N_mS( 1);
}
feedog();
SomeNOP();
}
SCLK=0;
SPI_CS=0XFF; //disable SPI
EA=1;
Delay_N_mS( 1);
}
void modbuscom() interrupt 4 using 1
{
uint t;
t=1000000.0*2*3/(9600.0*7); //7:循环语句执行时间
if(TI) //发送中断
{
TI = 0;
if(sen_len < sendatalong)
{ //未发送完
//tdi = sen_data[sen_len];
SBUF = sen_data[sen_len];
sen_len++;
}
else
{
sen_data_f = 0; //发送完成标志
}
}
if(RI==1)
{
RI=0;
rev_data[revdatalong]=SBUF;
//commseg[I+1]=recdata[I];
revdatalong++;
while(revdatalong>0&&RI==0&&t>0)
{
t--; //13us
}
if(t==0)
{
rev_end_f=1;
}
}
}
void send_data( uint num)
{
uint kk;
for(kk=0;kk<num;kk++)
{
sen_data[kk]=flash_r_data[kk];
//stj++;
}
SBUF = sen_data[0];
sendatalong =num;
sen_len = 1;
rev_data[0]=0x00;
revdatalong=0;
}
void main(void)
{
uint write_num,kkk;
address_num=0; //0x1ff00;
SPI_CS=0XFF;
init_serialcomm();
close_protect();
feedog();
Delay_N_mS(300);
feedog();
for(write_num=0;write_num<300;write_num++)
{
flash_w_data[write_num]=write_num;
}
feedog();
SBUF=0X33;
sendatalong =5;
sen_len = 1;
while(1)
{
feedog();
if(rev_data[0]==0x88)
{
address_num=0x0001ff00; //address_num+64;
kkk=64;
write_1024(kkk);
busy_bit=inquire_busy();
read_1024(0x0001fe00,1000);
flash_r_data[1]=state_word;
flash_r_data[2]=rev_data[1];
flash_r_data[3]=rev_data[2];
send_data(1000);
rev_data[0]=0X00;
revdatalong=0;
}
if(rev_data[0]==0x66)
{
erase();
//read_1024(0x0001fe00,999);
send_data(1000);
rev_data[0]=0X00;
revdatalong=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -