This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

c51:

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,

Parents
  • "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!

Reply
  • "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!

Children