This is the latest working repository used in our demo video for the Maxim to display temperature readings on Bluetooth

Dependencies:   USBDevice

Revision:
3:36de8b9e4b1a
Parent:
2:86d928355813
Child:
4:1fcd660d72fe
--- a/HSP/Devices/S25FS256/S25FS512.cpp	Sat Apr 10 02:05:01 2021 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,525 +0,0 @@
-
-/*******************************************************************************
- * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
- * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Except as contained in this notice, the name of Maxim Integrated
- * Products, Inc. shall not be used except as stated in the Maxim Integrated
- * Products, Inc. Branding Policy.
- *
- * The mere transfer of this software does not imply any licenses
- * of trade secrets, proprietary technology, copyrights, patents,
- * trademarks, maskwork rights, or any other form of intellectual
- * property whatsoever. Maxim Integrated Products, Inc. retains all
- * ownership rights.
- *******************************************************************************
- */
-
-#include "mbed.h"
-#include "S25FS512.h"
-#include "QuadSpiInterface.h"
-//#include "DebugRoutines.h"
-
-//******************************************************************************
-S25FS512::S25FS512(QuadSpiInterface *_quadSpiInterface) {
-	this->quadSpiInterface = _quadSpiInterface;
-}
-
-//******************************************************************************
-S25FS512::~S25FS512()
-{
-}
-
-//******************************************************************************
-void S25FS512::init(void) {
-  setQuadMode();
-}
-
-//******************************************************************************
-int S25FS512::wren4Wire(void) {
-  uint8_t cmdArray[8];
-  // Send WREN
-  cmdArray[0] = 0x06;
-  //wait_ms(1);
-  return reg_write_read_multiple_4Wire(cmdArray, 1, flashBuffer, 1);
-}
-
-//******************************************************************************
-uint8_t S25FS512::wren(void) {
-  uint8_t cmdArray[8];
-  // Send WREN
-  cmdArray[0] = 0x06;
-  //wait_ms(1);
-  return reg_write_read_multiple_quad(cmdArray, 1, flashBuffer, 0);
-}
-
-//******************************************************************************
-int8_t S25FS512::reg_write_read_multiple_quad_last(uint8_t *bufferOut, uint8_t numberOut, uint8_t *bufferIn, uint8_t numberIn, uint8_t last) {
-	int32_t  success = 0;
-	//if (spiSlave.port != 1) {
-	//	while (1);
-	//}
-//	success = SPI_Transmit(&spiSlave, dataIn, numberIn, dataOut, numberOut, MXC_E_SPI_UNIT_BYTES, MXC_E_SPI_MODE_QUAD, 0, last);//MXC_E_SPI_MODE_QUAD
-
-	success = quadSpiInterface->SPI_Transmit(
-			bufferOut, numberOut,
-			bufferIn, numberIn,
-			(int)last);
-
-	if (success != 0) return -1;
-	return 0;
-}
-
-//******************************************************************************
-int8_t S25FS512::reg_write_read_multiple_4Wire(uint8_t *bufferOut,
-                                               uint8_t numberOut,
-                                               uint8_t *bufferIn,
-                                               uint8_t numberIn) {
-  int32_t success = 0;
-  success = quadSpiInterface->SPI_Transmit4Wire(bufferOut, numberOut, bufferIn,
-                                                numberIn, (int)1);
-
-  if (success != 0) return -1;
-  return 0;
-}
-
-//******************************************************************************
-int8_t S25FS512::reg_write_read_multiple_quad(uint8_t *bufferOut, uint8_t numberOut, uint8_t *bufferIn, uint8_t numberIn) {
-	int8_t ret;
-	ret = reg_write_read_multiple_quad_last(bufferOut,numberOut,bufferIn,numberIn,1);
-	return ret;
-}
-
-//******************************************************************************
-void S25FS512::readID(uint8_t *id) {
-    uint8_t cmd = 0x9F;
-    reg_write_read_multiple_quad(&cmd, 1, id, 4);
-}
-
-//******************************************************************************
-int8_t S25FS512::writeAnyRegister(uint32_t address, uint8_t data) {
-	uint8_t cmdArray[5];
-	cmdArray[0] = 0x71;
-	cmdArray[1] = (address >> 16) & 0xFF;
-	cmdArray[2] = (address >> 8) & 0xFF;
-	cmdArray[3] = (address >> 0) & 0xFF;
-	cmdArray[4] = data;
-	return reg_write_read_multiple_quad(cmdArray,5,flashBuffer,0);
-}
-
-//******************************************************************************
-int8_t S25FS512::writeAnyRegister4Wire(uint32_t address, uint8_t data) {
-  uint8_t cmdArray[5];
-  cmdArray[0] = 0x71;
-  cmdArray[1] = (address >> 16) & 0xFF;
-  cmdArray[2] = (address >> 8) & 0xFF;
-  cmdArray[3] = (address >> 0) & 0xFF;
-  cmdArray[4] = data;
-  return reg_write_read_multiple_4Wire(cmdArray, 5, flashBuffer, 5);
-}
-
-//******************************************************************************
-int8_t 	S25FS512::writeRegisters(void) {
-	uint8_t cmdArray[3];
-	wait_ms(1);
-	cmdArray[0] = 0x01;
-	cmdArray[1] = 0x00;
-	cmdArray[2] = 0x02; // set Quad to 1
-	reg_write_read_multiple_quad(cmdArray,3,flashBuffer,0);
-	return 0;
-}
-
-//******************************************************************************
-int8_t S25FS512::readAnyRegister(uint32_t address, uint8_t *data, uint32_t length) {
-	uint8_t cmdArray[4];
-	cmdArray[0] = 0x65;
-	cmdArray[1] = (address >> 16) & 0xFF;
-	cmdArray[2] = (address >> 8) & 0xFF;
-	cmdArray[3] = (address >> 0) & 0xFF;
-	return reg_write_read_multiple_quad(cmdArray,4,data,length);
-}
-
-//******************************************************************************
-int8_t S25FS512::bulkErase(void) {
-	uint8_t cmdArray[1];
-	cmdArray[0] = 0x60;
-	return reg_write_read_multiple_quad(cmdArray,1,flashBuffer,0);
-}
-
-//******************************************************************************
-int8_t S25FS512::pageProgram(uint32_t address, uint8_t *buffer) {
-	uint32_t i;
-	uint8_t cmdArray[6 + 256];
-	uint8_t *ptr;
-
-	//for (i = 0; i < 256; i++) {
-	//	dataArray[i] = i;
-	//}
-	cmdArray[0] = 0x12; //0x02; //0x71;
-	cmdArray[1] = (address >> 24) & 0xFF;
-	cmdArray[2] = (address >> 16) & 0xFF;
-	cmdArray[3] = (address >> 8) & 0xFF;
-	cmdArray[4] = (address >> 0) & 0xFF;
-	for (i = 0; i < 256; i++) {
-		cmdArray[5 + i] = buffer[i];
-	}
-//	reg_write_read_multiple_quad(cmdArray,256 + 4,flashBuffer,256 + 4);
-
-	ptr = cmdArray;
-	reg_write_read_multiple_quad_last(ptr,5 + 64,flashBuffer,0,0);
-	//wait_ms(1);
-	ptr += (5 + 64);
-	reg_write_read_multiple_quad_last(ptr,64,flashBuffer,0,0);
-	//wait_ms(1);
-	ptr += 64;
-	reg_write_read_multiple_quad_last(ptr,64,flashBuffer,0,0);
-	//wait_ms(1);
-	ptr += 64;
-	reg_write_read_multiple_quad_last(ptr,64,flashBuffer,0,1);
-	//wait_ms(1);
-	return 0;
-}
-
-//
-// read page 0 and assure that it is empty
-//
-void S25FS512::test_verifyPage0Empty(uint8_t *ptr, int currentPage, int pagesWrittenTo) {
-    uint8_t data[512];
-    bool pageEmpty;   
-    readPages_Helper(0, 0, data, 0);
-    pageEmpty = isPageEmpty(data);
-    if (pageEmpty == false) {
-      //PRINTD_2("ERROR: Page 0 is no longer empty!!!!!!!\r\n");
-	  //PRINTD_2("Page 0->\r\n");
-      //DebugRoutines::dumpBuffer(data, 256);
-	  //PRINTD_2("Page 0->\r\n");
-      readPages_Helper(0, 0, data, 0);
-      //DebugRoutines::dumpBuffer(data, 256);
-	  //PRINTD_2("Page 0->\r\n");
-      readPages_Helper(0, 0, data, 0);
-      //DebugRoutines::dumpBuffer(data, 256);
-	  if (ptr != NULL) {
-		//PRINTD_2("currentPage=%d ", (int)currentPage);
-		//PRINTD_2("pagesWrittenTo=%d\r\n", (int)pagesWrittenTo);
-		//PRINTD_2("Writing page data->\r\n");
-		//DebugRoutines::dumpBuffer(ptr, 256);
-	  }
-      while (1) ;
-    }
-}
-
-//******************************************************************************
-int8_t S25FS512::quadIoRead_Pages(uint32_t address, uint8_t *buffer, uint32_t numberOfPages) {
-	uint8_t cmdArray[5];
-	uint8_t *ptr;
-	uint8_t last;
-	uint32_t i;
-	cmdArray[0] = 0xEC; //0xEB;
-	cmdArray[1] = (address >> 24) & 0xFF;
-	cmdArray[2] = (address >> 16) & 0xFF;
-	cmdArray[3] = (address >> 8) & 0xFF;
-	cmdArray[4] = (address >> 0) & 0xFF;
-	//reg_write_read_multiple_quad(cmdArray,4,flashBuffer,32);
-/*	last = 0;
-	num = 0;
-	inc = 32;
-	while (num < number) {*/
-	ptr = buffer;
-	last = 0;
-	// only send the command
-	reg_write_read_multiple_quad_last(cmdArray, 5, ptr, 0, 0);
-	//wait_ms(1);
-	reg_write_read_multiple_quad_last(cmdArray, 0, ptr, 5, 0);
-	//wait_ms(1);
-	for (i = 0; i < numberOfPages; i++) {
-		reg_write_read_multiple_quad_last(cmdArray,0,ptr,64, 0);
-		//wait_ms(1);
-		ptr += 64;
-		reg_write_read_multiple_quad_last(cmdArray,0,ptr,64, 0);
-		//wait_ms(1);
-		ptr += 64;
-		reg_write_read_multiple_quad_last(cmdArray,0,ptr,64, 0);
-		//wait_ms(1);
-		ptr += 64;
-		// check if this is the last page
-		if ((i + 1) == numberOfPages) {
-			last = 1;
-		}
-		reg_write_read_multiple_quad_last(cmdArray,0,ptr,64, last);
-		//wait_ms(1);
-		ptr += 64;
-	}
-	return 0;
-}
-
-//******************************************************************************
-int8_t S25FS512::quadIoRead_PartialPage(uint32_t address, uint8_t *buffer, uint32_t numberOfBytesInPage) {
-	uint8_t cmdArray[5];
-	uint8_t *ptr;
-	uint8_t last;
-	uint32_t packetSize;
-	uint32_t xferCount;
-	cmdArray[0] = 0xEC; //0xEB;
-	cmdArray[1] = (address >> 24) & 0xFF;
-	cmdArray[2] = (address >> 16) & 0xFF;
-	cmdArray[3] = (address >> 8) & 0xFF;
-	cmdArray[4] = (address >> 0) & 0xFF;
-	//reg_write_read_multiple_quad(cmdArray,4,flashBuffer,32);
-	ptr = buffer;
-	last = 0;
-	// only send the command
-	reg_write_read_multiple_quad_last(cmdArray, 5, ptr, 0, 0);
-	//wait_ms(1);
-	reg_write_read_multiple_quad_last(cmdArray, 0, ptr, 5, 0);
-	//wait_ms(1);
-
-	xferCount = 0;
-	do { 
-		packetSize = 64;
-		if ((xferCount + packetSize) > numberOfBytesInPage) {
-			packetSize = numberOfBytesInPage;
-			last = 1;
-		}
-		reg_write_read_multiple_quad_last(cmdArray,0,ptr,packetSize, 0);
-		xferCount += packetSize;
-		ptr += packetSize;
-	} while (last != 1);
-	return 0;
-}
-
-//******************************************************************************
-int8_t S25FS512::checkBusy(void) {
-	uint8_t cmdArray[5];
-	cmdArray[0] = 0x05;
-	reg_write_read_multiple_quad(cmdArray,1,flashBuffer,2);
-	return flashBuffer[1] & 0x1;
-}
-
-//******************************************************************************
-void S25FS512::waitTillNotBusy(void) {
-	while (checkBusy() == 1) {		}
-}
-
-//******************************************************************************
-int8_t S25FS512::sectorErase(uint32_t address) {
-	uint8_t cmdArray[5];
-	cmdArray[0] = 0xDC; //0xD8;
-	cmdArray[1] = (address >> 24) & 0xFF;
-	cmdArray[2] = (address >> 16) & 0xFF;
-	cmdArray[3] = (address >> 8) & 0xFF;
-	cmdArray[4] = (address >> 0) & 0xFF;
-	return reg_write_read_multiple_quad(cmdArray,5,flashBuffer,0);
-}
-
-//******************************************************************************
-int8_t S25FS512::parameterSectorErase(uint32_t address) {
-	uint8_t cmdArray[5];	
-	cmdArray[0] = 0x21;     //0x20 (P4E), 0x21 (4P4E)
-	cmdArray[1] = (address >> 24) & 0xFF;
-	cmdArray[2] = (address >> 16) & 0xFF;
-	cmdArray[3] = (address >> 8) & 0xFF;
-	cmdArray[4] = (address >> 0) & 0xFF;
-	reg_write_read_multiple_quad(cmdArray,5,flashBuffer,0);
-	return 0;
-}
-
-//******************************************************************************
-int8_t S25FS512::readIdentification(uint8_t *dataArray, uint8_t length) {
-	// 4QIOR = 0x9F
-	uint8_t cmdArray[1];
-	cmdArray[0] = 0x9F;	// read ID command
-	return reg_write_read_multiple_quad(cmdArray,1,dataArray,length);
-}
-
-//******************************************************************************
-uint8_t S25FS512::reset(void) {
-	uint8_t cmdArray[8];
-	wait_ms(1);
-	cmdArray[0] = 0x66;
-	reg_write_read_multiple_quad(cmdArray,1,flashBuffer,0);
-	wait_ms(1);
-	cmdArray[0] = 0x99;
-	reg_write_read_multiple_quad(cmdArray,1,flashBuffer,0);
-	return 0;
-}
-
-//******************************************************************************
-uint8_t S25FS512::enableHWReset(void) {
-	uint8_t data[8];
-	wait_ms(1);
-	// CR2V Configuration Register-2 Volatile
-	// bit 5
-	readAnyRegister(0x00800003,data, 8);
-	writeAnyRegister(0x00800003,0x64);
-	return 0;
-}
-
-//******************************************************************************
-uint8_t S25FS512::detect(void) {
-	uint8_t array[8];
-	uint8_t array2[8];
-
-	// Send WREN
-	wren();
-	// Send WREN
-	wren();
-	// delay
-	wait_ms(1);
-	// Put into quad mode
-	//setQuadMode();
-
-	// Send WDIS
-//	array[0] = 0x04;
-//	test_reg_write_multiple_4wire(array,1);
-
-	// Send WREN
-	wren();
-	// delay
-	wait_ms(1);
-
-	// Send write any register cmd
-	writeAnyRegister(0x0003, 0x48);
-/*
-	//
-	// try reading the ID by using 4 wire spi for the command and quad for reading
-	//
-
-	// send read id cmd
-	array[0] = 0x9F;
-	test_reg_write_multiple_4wire(array,1);
-	// send read id via quad
-	test_reg_read_multiple_quad(array,7);
-*/
-	// delay
-	wait_ms(1);
-	array[0] = 0x9F;	// read ID command
-	reg_write_read_multiple_quad(array,1,array2,7);
-
-/*
-	//uint8_t val[5];
-	uint32_t result;
-	test_reg_write(0x9F);
-	test_reg_read2(0x9F,&result);
-	test_reg_read3(0x9F,&result);
-	*/
-	return 0;
-}
-
-//******************************************************************************
-int S25FS512::setQuadMode(void) {
-  wait_ms(1);
-  wren4Wire();
-  wait_ms(1);
-  writeAnyRegister4Wire(0x800002, 0x02); // set Quad = 1
-  wait_ms(1);
-  wren4Wire();
-  wait_ms(1);
-  writeAnyRegister4Wire(0x800003, 0x48); // set 8 latency, set QPI 4-4-4
-  return 0;
-}
-
-//******************************************************************************
-bool S25FS512::isPageEmpty(uint8_t *ptr) {
-	int i;
-	for (i = 0; i < 256; i++) {
-		if (ptr[i] != 0xFF) return false;
-	}
-	return true;
-}
-
-//******************************************************************************
-int8_t S25FS512::parameterSectorErase_Helper(uint32_t address) {
-	waitTillNotBusy();
-	wait_us(100);
-	wren();
-	wait_us(200);
-	parameterSectorErase(address);
-	wait_us(100);
-	waitTillNotBusy();
-	return 0;
-}
-
-//******************************************************************************
-int8_t S25FS512::sectorErase_Helper(uint32_t address) {
-	waitTillNotBusy();
-	wait_us(100);
-	wren();
-	wait_us(200);
-    sectorErase(address);
-	wait_us(100);
-	waitTillNotBusy();
-	return 0;
-}
-
-//******************************************************************************
-int8_t S25FS512::bulkErase_Helper(void) {
-	waitTillNotBusy();
-	wait_us(100);
-	wren();
-	wait_us(100);
-	bulkErase();
-	wait_us(100);
-	waitTillNotBusy();
-	wait_us(100);
-	return 0;
-}
-
-//******************************************************************************
-// write a page worth of data (256 bytes) from buffer, offset defined where in the buffer to begin write
-int8_t S25FS512::writePage_Helper(uint32_t pageNumber, uint8_t *buffer, uint32_t offset) {
-	uint8_t *ptr;
-	waitTillNotBusy();
-	//wait_ms(1);
-	wren();
-	ptr = &buffer[offset];
-	//wait_ms(1);
-	pageProgram(pageNumber << 8,ptr);
-	wait_us(100);
-	waitTillNotBusy();
-
-	//wait_ms(1);
-	return 0;
-}
-
-//******************************************************************************
-// read pages from flash into buffer, offset defined where in the buffer use
-int8_t S25FS512::readPages_Helper(uint32_t startPageNumber,uint32_t endPageNumber, uint8_t *buffer, uint32_t offset) {
-	int8_t status = 0;
-	uint8_t *ptr;
-	uint32_t page;
-	ptr = &buffer[offset];
-	waitTillNotBusy();
-	for (page = startPageNumber; page <= endPageNumber; page++) {
-		wait_us(100);
-		status = quadIoRead_Pages((uint32_t)(page << 8), (uint8_t *)ptr, 1);
-		ptr += 0x100;
-	}
-	return status;
-}
-
-//******************************************************************************
-int8_t S25FS512::readPartialPage_Helper(uint32_t pageNumber, uint8_t *buffer, uint32_t count) {
-	int8_t status = 0;
-	waitTillNotBusy();
-	status = quadIoRead_PartialPage((uint32_t)(pageNumber << 8), (uint8_t *)buffer, count);
-	return status;
-}
-
-