While trying to interface flash SST25VF512 with AT80c51, i find difficulty in Byte program mode of writing to flash.
This is the code i used, could somebody who has worked on this please help me out,
void main(void){ ce = 1; SCK = 0; TMOD = 0x20; TH1 = -3; // 9600 baud SCON = 0x50; TR1 = 1; TI = 1; addr = 0x00000012; Rd_ID = Read_ID(); Byte_Program(addr); void Byte_Program(unsigned long addr){ ce = 0; E_WRSR(); WREN(); Send_Byte(0x02); // Byte Program CMD Send_Byte(((addr & 0xFFFFFF) >> 16)); // sending 3 address bytes Send_Byte(((addr & 0xFFFF) >> 8)); Send_Byte(addr & 0xFF); Send_Byte(0x10); //send data SR_byte = Read_Status_Register(); while((SR_byte &0x01) != 0x00){ SR_byte = Read_Status_Register(); } ce = 1; } void E_WRSR(){ ce = 0; Send_Byte(0x50); // enable Status Reg ce = 1; ce = 0; Send_Byte(0x01); // select write to status register Send_Byte(0x00); // mode 0, ce = 1; } void WREN(){ ce = 0; Send_Byte(0x06);// to Write enable ce = 1; } unsigned char Get_Byte(){ unsigned char i=0, in=0, temp=0; for(i=0;i<8;i++){ in = (in << 1); temp = SO; SCK = 1; if (temp == 1){ in = in | 0x01; } SCK = 0; } return in; } void Send_Byte(unsigned char b_out){ for(i=0;i<8;i++){ if((b_out & 0x80) == 0x80) si = 1; else si = 0; SCK = 1; b_out = (b_out << 1); SCK = 0; } }
Thanks in advance,
a brief look makes me guess that you are running too fast 1) what is your CPU clock 2) is your CPU a 12-clocker 6-clocker ... ? 3) what is the max IIC baudrate for the SST25VF512
Erik
It is 450 MHz, could you please tell how do we find if its 6 clocker or 12 clocker?
3) SST25VF512 is SPI compatible, given its max clock speed is 20 MHz,
we set baud as SMOD = 0, TH = -3, 9600 baud for 8051 how is it found for flash?
Erik asked: "1) what is your CPU clock"
hem raj2 replied "It is 450 MHz"
No - Erik is asking what speed you are clocking the AT80c51 !!
"how do we find if its 6 clocker or 12 clocker"
See the Data Sheet
If it is able to read , then i believe speed mismatch is not the problem,
what could be the problem,
clocking 8051, you mean baud rate that is set to 9600, smod is mode 0, so, not doubled,
i think its 12 clocker
We divide crystal frequency by 12 and then further by 16 or 32 depending on smod
If that is it, then its 12 clocker, Is it right?
"clocking 8051, you mean baud rate"
No.
The CPU clock is the crystal fequency, or the frequency of whatever clock source you use instead of a crystal. This is what clocks the CPU - hence the term, "CPU Clock"
"If it is able to read , then i believe speed mismatch is not the problem"
Read what? Do you mean that your code reads the flash OK?
This does not necessarily mean that your timing is correct for writing!
Your timing could be marginal; ie, "only just close enough" for reading and that could make it "only just over the limit" for writing - hence reading could work, and writing not!
You probably do not want to write the status register before every write operation. Yes, there is a write enable bit there, and yes, this sequence will work correctly. However, the status register in these types of flash is non-volatile, implemented with the same flash technology as the rest of the chip. Every time you write the status register, you effectively erase it and reprogram it. After the rated number of cycles on your flash chip, the status register will burn out and the chip will stop working, even if the data sectors are still good.
The WREN command is sufficient to tell the chip to allow programming. It does not cause the status register to be erased and reprogrammed as does WRSR. Using WRSR is not necessary, and will limit the lifetime of the chip if you frequently write data.
So what do i do in this case, please tell me
Thanks Dave, so you suggest WRSR need not be written IN the write operation is it, fine, then how do we set the memory protection bits? Without setting them, is there any way to write,
"After the rated number of cycles on your flash chip, the status register will burn out and the chip will stop working, even if the data sectors are still good." Could you please tell this rated number of cycles. Can write operation process be completed within that?
"Using WRSR is not necessary, and will limit the lifetime of the chip if you frequently write data." Is it apart from the 10,000 cycles for the chip as a whole?
Then how do we get to write data and check also that the program is running fine,
waiting for reply,
Ok, since i am doing it manually to clock the flash thru SCK. I believe 8051 uses the internal crystal to execute through the program. that is 11.0592 MHz
sorry drew,
"Could you please tell this rated number of cycles."
That'll be in the datasheet
Note that it is not a precise number below which everything is fine and above which nothing works; the thing wears out gradually.