SPI Single IO NOR Flash Library for Nucleo F767ZI Interfacing
Fork of W25X40BV by
S25FL256S.cpp
- Committer:
- shivanandgowdakr
- Date:
- 2018-10-23
- Revision:
- 8:9f5a31575cdd
- Parent:
- 6:ef894010def4
File content as of revision 8:9f5a31575cdd:
// S25FL256S.cpp
#include"S25FL256S.h"
// CONSTRUCTOR
S25FL256S::S25FL256S(PinName mosi, PinName miso, PinName sclk, PinName cs) : SPI(mosi, miso, sclk), _cs(cs)
{
this->format(SPI_NBIT, SPI_MODE);
this->frequency(SPI_FREQ);
chipDisable();
}
// READING
int S25FL256S::readByte(int addr)
{
chipEnable();
this->write(FOUR_READ);
this->write((addr & ADDR_BMASK3) >> ADDR_BSHIFT3);
this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
int response = this->write(DUMMY_ADDR);
chipDisable();
return response;
}
void S25FL256S::readStream(int addr, char* buf, int count)
{
int i;
if (count < 1)
return;
chipEnable();
this->write(FOUR_READ);
this->write((addr & ADDR_BMASK3) >> ADDR_BSHIFT3);
this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
for ( i = 0; i < count; i++) {
buf[i] = this->write(DUMMY_ADDR);
// printf("i= %d :%c \r\n",i,buf[i]);
}
buf[i]='\0';
chipDisable();
}
// WRITING
void S25FL256S::writeByte(int addr, int data)
{
writeEnable();
chipEnable();
this->write(FOUR_PP);
this->write((addr & ADDR_BMASK3) >> ADDR_BSHIFT3);
this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
this->write(data);
chipDisable();
writeDisable();
// wait(WAIT_TIME);//instead of wait poll for WIP flag of status reg or use checkIfBusy() function...see main for more dtails
}
void S25FL256S::writeStream(int addr, char* buf, int count)
{
if (count < 1)
return;
writeEnable();
wait(0.1);
chipEnable();
this->write(FOUR_PP);
this->write((addr & ADDR_BMASK3) >> ADDR_BSHIFT3);
this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
for (int i = 0; i < count; i++) {
this->write(buf[i]);
}
chipDisable();
writeDisable();
uint8_t busy=checkIfBusy();
while(busy)
{
busy=checkIfBusy();
}
}
void S25FL256S::writeString(int addr, string str)
{
if (str.length() < 1)
return;
writeEnable();
chipEnable();
this->write(FOUR_PP);
this->write((addr & ADDR_BMASK3) >> ADDR_BSHIFT3);
this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
for (int i = 0; i < str.length(); i++)
this->write(str.at(i));
chipDisable();
writeDisable();
wait(WAIT_TIME);//instead of wait poll for WIP flag of status reg or use checkIfBusy() function...see main for more dtails
}
uint8_t S25FL256S::readRegister()
{
chipEnable();
this->write(RDSR1);
uint8_t val=this->write(DUMMY_ADDR);
chipDisable();
if(val&0x01==0x01)
return 1;
else
return 0;
}
//ERASING
void S25FL256S::chipErase()
{
writeEnable();
chipEnable();
this->write(BE);
chipDisable();
writeDisable();
wait(WAIT_TIME);//instead of wait poll for WIP flag of status reg or use checkIfBusy() function...see main for more dtails
}
void S25FL256S::Read_Identification(uint8_t *buf)
{
chipEnable();
this->write(RDID);
for(int i=0; i<80; i++)
buf[i]=this->write(DUMMY_ADDR);
chipDisable();
wait(WAIT_TIME);//instead of wait poll for WIP flag of status reg or use checkIfBusy() function...see main for more dtails
}
int S25FL256S::sectorErase(int addr)
{
writeEnable();
chipEnable();
this->write(FOUR_SE);
this->write((addr & ADDR_BMASK3) >> ADDR_BSHIFT3);
this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
chipDisable();
writeDisable();
uint8_t busy=checkIfBusy();
while(busy)
{
busy=checkIfBusy();
printf(" Am Here \r\n\r\n");
}//instead of wait poll for WIP flag of status reg or use checkIfBusy() function...see main for more dtails
return 1;
}
void S25FL256S::reset()
{
writeEnable();
chipEnable();
this->write(RESET);
chipDisable();
writeDisable();
}
uint8_t S25FL256S::checkIfBusy()
{
uint8_t value=readRegister();
// printf("Value of Status Reg=%X\r\n\r\n",value);
if((value&0x01)==0x01)
return 1;
else
return 0;
}
void S25FL256S::writeRegister(uint8_t regValue)
{
writeEnable();
chipEnable();
this->write(WRR);
this->write(regValue);
chipDisable();
writeDisable();
wait(WAIT_TIME);//instead of wait poll for WIP flag of status reg or use checkIfBusy() function...see main for more dtails
}
void S25FL256S::clearRegister(void)
{
writeEnable();
chipEnable();
this->write(CLSR);
chipDisable();
writeDisable();
wait(WAIT_TIME);//instead of wait poll for WIP flag of status reg or use checkIfBusy() function...see main for more dtails
}
void S25FL256S::writeLong(int addr, long value)
{
//Decomposition from a long to 4 bytes by using bitshift.
//One = Most significant -> Four = Least significant byte
uint8_t four = (value & 0xFF);
uint8_t three = ((value >> 8) & 0xFF);
uint8_t two = ((value >> 16) & 0xFF);
uint8_t one = ((value >> 24) & 0xFF);
writeEnable();
chipEnable();
this->write(FOUR_PP);
this->write((addr & ADDR_BMASK3) >> ADDR_BSHIFT3);
this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
this->write(four);
this->write(three);
this->write(two);
this->write(one);
chipDisable();
writeDisable();
wait(0.1);
}
long S25FL256S::raedLong(int addr)
{
//Read the 4 bytes from the eeprom memory.
chipEnable();
this->write(FOUR_READ);
this->write((addr & ADDR_BMASK3) >> ADDR_BSHIFT3);
this->write((addr & ADDR_BMASK2) >> ADDR_BSHIFT2);
this->write((addr & ADDR_BMASK1) >> ADDR_BSHIFT1);
this->write((addr & ADDR_BMASK0) >> ADDR_BSHIFT0);
long four = this->write(DUMMY_ADDR);
long three = this->write(DUMMY_ADDR);
long two = this->write(DUMMY_ADDR);
long one = this->write(DUMMY_ADDR);
chipDisable();
//Return the recomposed long by using bitshift.
return ((four << 0) & 0xFF) + ((three << 8) & 0xFFFF) + ((two << 16) & 0xFFFFFF) + ((one << 24) & 0xFFFFFFFF);
}
//ENABLE/DISABLE (private functions)
void S25FL256S::writeEnable()
{
chipEnable();
this->write(WREN);
chipDisable();
}
void S25FL256S::writeDisable()
{
chipEnable();
this->write(WRDI);
chipDisable();
}
void S25FL256S::chipEnable()
{
_cs = 0;
}
void S25FL256S::chipDisable()
{
_cs = 1;
}
