Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: pulga-lorawan-drv Si1133 BME280
Revision 70:99b7a15c09da, committed 2021-09-13
- Comitter:
- MatteusCarr
- Date:
- Mon Sep 13 18:55:32 2021 +0000
- Parent:
- 69:2d56b571c78e
- Commit message:
- Teste Flash
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SPI_MX25R.cpp Mon Sep 13 18:55:32 2021 +0000
@@ -0,0 +1,319 @@
+/*
+ * SPI_MX25R Series SPI-Flash Memory
+ * Macronix Low Power Serial NOR Flash
+ * (x2, and x4 I/O modes not implemented)
+ */
+
+#include "SPI_MX25R.h"
+
+
+SPI_MX25R::SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) :
+ m_spi(mosi, miso, sclk), m_cs(cs) { }
+
+SPI_MX25R::~SPI_MX25R() { }
+
+void SPI_MX25R::writeEnable(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_WREN) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::writeDisable(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_WRDI) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::resetEnable(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_RSTEN) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::reset(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_RST) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::pgmersSuspend(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_PESUS) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::pgmersResume(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_PERES) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::deepPowerdown(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_DP) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::setBurstlength(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_SBL) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::releaseReadenhaced(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_RRE) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::noOperation(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_NOP) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::enterSecureOTP(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_ENSO) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::exitSecureOTP(void)
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_EXSO) ;
+ m_cs = CS_HIGH ;
+}
+
+uint8_t SPI_MX25R::readStatus(void)
+{
+ uint8_t data ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_RDSR) ;
+ data = m_spi.write(DUMMY) ; // dummy
+ m_cs = CS_HIGH ;
+ return( data ) ;
+}
+
+uint32_t SPI_MX25R::readConfig(void)
+{
+ uint8_t data;
+ uint32_t config32 = 0 ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_RDCR) ; // send 15h
+ data= m_spi.write(DUMMY) ; // dumy to get 1st Byte out
+ config32 = config32 | data ; // put in 32b reg
+ data= m_spi.write(DUMMY) ; // dummy to get 2nd Byte out
+ config32 = (config32 << 8) | data ; // shift and put in reg
+ m_cs = CS_HIGH ;
+ return( config32 ) ;
+}
+
+uint8_t SPI_MX25R::readSecurity(void)
+{
+ uint8_t data ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_RDSCUR) ; // send 2Bh
+ data = m_spi.write(DUMMY) ; // dummy
+ m_cs = CS_HIGH ;
+ return( data ) ;
+}
+
+uint32_t SPI_MX25R::readID(void)
+{
+ uint8_t data;
+ uint32_t data32 = 0 ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_RDID) ; // send 9Fh
+ data= m_spi.write(DUMMY) ; // dumy to get 1st Byte out
+ data32 = data32 | data ; // put in 32b reg
+ data= m_spi.write(DUMMY) ; // dummy to get 2nd Byte out
+ data32 = (data32 << 8) | data ; // shift and put in reg
+ data= m_spi.write(DUMMY) ; // dummy to get 3rd Byte out
+ data32 = (data32 << 8) | data ; // shift again and put in reg
+ m_cs = CS_HIGH ;
+ return( data32 ) ;
+}
+
+uint32_t SPI_MX25R::readREMS(void)
+{
+ uint8_t data;
+ uint32_t data32 = 0 ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_REMS) ; // send 90h
+ m_spi.write(DUMMY) ; // send DUMMY1
+ m_spi.write(DUMMY) ; // send DUMMY2
+ m_spi.write(0) ; // send address=0x00 to get Manu ID 1st.
+ data= m_spi.write(DUMMY) ; // dumy to get Manufacturer ID= C2h out
+ data32 = data32 | data ; // put in 32b reg
+ data= m_spi.write(DUMMY) ; // dummy to get 2nd Byte = Device ID out
+ data32 = (data32 << 8) | data ; // shift and put in reg
+ m_cs = CS_HIGH ;
+ return( data32 ) ;
+}
+
+uint8_t SPI_MX25R::readRES(void)
+{
+ uint8_t data;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_RES) ; // send ABh
+ m_spi.write(DUMMY) ; // send DUMMY1
+ m_spi.write(DUMMY) ; // send DUMMY2
+ m_spi.write(DUMMY) ; // send DUMMY3
+ data= m_spi.write(DUMMY) ; // dumy to get Electronic Sig. out
+ m_cs = CS_HIGH ;
+ return( data ) ;
+}
+
+void SPI_MX25R::programPage(int addr, uint8_t *data, int numData)
+{
+ int i ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_PP) ; // Program Page 02h
+ m_spi.write((addr >> 16)&0xFF) ; // adr 23:16
+ m_spi.write((addr >> 8)&0xFF) ; // adr 15:8
+ m_spi.write(addr & 0xFF) ; // adr 7:0
+ for (i = 0 ; i < numData ; i++ ) { // data = 00, 01, 02, .. to FEh, FFh = all 256 Bytes in 1 page.
+ m_spi.write(data[i]) ;
+ }
+ m_cs = CS_HIGH ;
+ // poll in main
+}
+
+void SPI_MX25R::writeStatusreg(int addr) // Write SR cmd 01h + 3B data
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_WRSR) ; // Write SR cmd 01h
+ m_spi.write((addr >> 16)&0xFF) ; // address
+ m_spi.write((addr >> 8)&0xFF) ;
+ m_spi.write(addr & 0xFF) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::writeSecurityreg(int addr) // WRSCUR cmd 2Fh + 1B data
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_WRSCUR) ; // Write SR cmd 01h
+ m_spi.write(addr & 0xFF) ;
+ m_cs = CS_HIGH ;
+}
+
+void SPI_MX25R::blockErase(int addr) // 64KB Block Erase
+{
+ uint8_t data[3] ;
+ data[0] = (addr >> 16) & 0xFF ;
+ data[1] = (addr >> 8) & 0xFF ;
+ data[2] = (addr & 0xFF) ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_BE) ;
+ for (int i = 0 ; i < 3 ; i++ ) { // Address setting
+ m_spi.write(data[i]) ;
+ }
+ m_cs = CS_HIGH ;
+ // poll in main
+}
+
+void SPI_MX25R::blockErase32KB(int addr) // 32KB Block Erase
+{
+ uint8_t data[3] ;
+ data[0] = (addr >> 16) & 0xFF ;
+ data[1] = (addr >> 8) & 0xFF ;
+ data[2] = (addr & 0xFF) ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_32KBE) ;
+ for (int i = 0 ; i < 3 ; i++ ) { // Address Setting
+ m_spi.write(data[i]) ;
+ }
+ m_cs = CS_HIGH ;
+ // poll in main
+}
+
+void SPI_MX25R::sectorErase(int addr) // 4KB Sector Erase
+{
+ uint8_t data[3] ;
+ data[0] = (addr >> 16) & 0xFF ;
+ data[1] = (addr >> 8) & 0xFF ;
+ data[2] = (addr & 0xFF) ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_SE) ;
+ for (int i = 0 ; i < 3 ; i++ ) { // Address Setting
+ m_spi.write(data[i]) ;
+ }
+ m_cs = CS_HIGH ;
+ // poll in main
+}
+
+void SPI_MX25R::chipErase(void) // Chip Erase
+{
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_CE) ;
+ m_cs = CS_HIGH ;
+ // poll in main
+}
+
+uint8_t SPI_MX25R::read8(int addr) // Single Byte Read
+{
+ uint8_t data ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_READ) ; // send 03h
+ m_spi.write((addr >> 16)&0xFF) ;
+ m_spi.write((addr >> 8)&0xFF) ;
+ m_spi.write(addr & 0xFF) ;
+ data = m_spi.write(DUMMY) ; // write data is dummy
+ m_cs = CS_HIGH ;
+ return( data ) ; // return 1 byte
+}
+
+uint8_t SPI_MX25R::readSFDP(int addr) // Read SFDP
+{
+ uint8_t data ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_RDSFDP) ; // send cmd 5Ah
+ m_spi.write((addr >> 16)&0xFF) ; // address[23:16]
+ m_spi.write((addr >> 8)&0xFF) ; // address[15:8]
+ m_spi.write(addr & 0xFF) ; // address[7:0]
+ m_spi.write(DUMMY) ; // dummy cycle
+ data = m_spi.write(DUMMY) ; // return 1 byte
+ m_cs = CS_HIGH ;
+ return( data ) ;
+}
+
+uint8_t SPI_MX25R::readFREAD(int addr) // x1 Fast Read Data Byte
+{
+ uint8_t data ;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_FREAD) ; // send cmd 0BH
+ m_spi.write((addr >> 16)&0xFF) ; // address[23:16]
+ m_spi.write((addr >> 8)&0xFF) ; // address[15:8]
+ m_spi.write(addr & 0xFF) ; // address[7:0]
+ m_spi.write(DUMMY) ; // dummy cycle
+ data = m_spi.write(DUMMY) ; // return 1 byte
+ m_cs = CS_HIGH ;
+ return( data ) ;
+}
+
+
+void SPI_MX25R::readNBytes(int addr, uint8_t *data, int nBytes) // read sequential n bytes
+{
+ int i;
+ m_cs = CS_LOW ;
+ m_spi.write(CMD_READ) ; // send 03h
+ m_spi.write((addr >> 16)&0xFF) ;
+ m_spi.write((addr >> 8)&0xFF) ;
+ m_spi.write(addr & 0xFF) ;
+ for (i = 0 ; i < nBytes ; i++ ) { // data: sequential data bytes
+ data[i] = m_spi.write(DUMMY) ;
+ }
+ m_cs = CS_HIGH ;
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/SPI_MX25R.h Mon Sep 13 18:55:32 2021 +0000
@@ -0,0 +1,190 @@
+#ifndef _SPI_MX25R_H_
+#define _SPI_MX25R_H_
+
+#include "mbed.h"
+
+ /**
+ Page Defines, write read based on page size
+ */
+ #define MX25R_PAGES 0x7FFF // total memory size - Addresses 0x7FFFFF
+/**
+ * Macronix Serial Flash Low Power Memories
+ * SPI_MX25R Series SPI-Flash Memory
+ */
+#define CS_LOW 0 // SPI CS# (Chip Select) Setting
+#define CS_HIGH 1 // SPI CS# (Chip Select) Setting
+#define DUMMY 0x00 // Dummy byte which can be changed to any value
+/**
+ * MX25R Series Register Command Table.
+ * x2 and x4 commands not currently supported with FRDM K64F platform
+ */
+#define CMD_READ 0x03 // x1 Normal Read Data Byte
+#define CMD_FREAD 0x0B // x1 Fast Read Data Byte
+#define CMD_2READ 0xBB // x2 2READ
+#define CMD_DREAD 0x3B // x2 DREAD
+#define CMD_4READ 0xEB // x4 4READ
+#define CMD_QREAD 0x6B // x4 QREAD
+#define CMD_PP 0x02 // Page Program
+#define CMD_4PP 0x38 // x4 PP
+#define CMD_SE 0x20 // 4KB Sector Erase
+#define CMD_32KBE 0x52 // 32KB Block Erase
+#define CMD_BE 0xD8 // 64KB Block Erase
+#define CMD_CE 0xC7 // Chip Erase
+#define CMD_RDSFDP 0x5A // Read SFDP
+#define CMD_WREN 0x06 // Write Enable
+#define CMD_WRDI 0x04 // Write Disable
+#define CMD_RDSR 0x05 // Read Status Register
+#define CMD_RDCR 0x15 // Read Configuration Register
+#define CMD_WRSR 0x01 // Write Status Register
+#define CMD_PESUS 0xB0 // Program/Erase Suspend
+#define CMD_PERES 0x30 // Program/Erase Resume
+#define CMD_DP 0xB9 // Enter Deep Power Down
+#define CMD_SBL 0xC0 // Set Burst Length
+#define CMD_RDID 0x9F // Read Manufacturer and JDEC Device ID
+#define CMD_REMS 0x90 // Read Electronic Manufacturer and Device ID
+#define CMD_RES 0xAB // Read Electronic ID
+#define CMD_ENSO 0xB1 // Enter Secure OTP
+#define CMD_EXSO 0xC1 // Exit Secure OTP
+#define CMD_RDSCUR 0x2B // Read Security Register
+#define CMD_WRSCUR 0x2F // Write Security Register
+#define CMD_NOP 0x00 // No Operation
+#define CMD_RSTEN 0x66 // Reset Enable
+#define CMD_RST 0x99 // Reset
+#define CMD_RRE 0xFF // Release Read Enhanced Mode
+
+
+class SPI_MX25R
+{
+public:
+/**
+ * Macronix MX25R Low Power and Wide Vcc SPI-Flash Memory Family
+ *
+ * @param SI/SIO0 SPI_MOSI pin
+ * @param SO/SI01 SPI_MISO pin
+ * @param SCLK SPI_CLK pin
+ * @param CSb SPI_CS pin
+ */
+ SPI_MX25R(PinName mosi, PinName miso, PinName sclk, PinName cs) ;
+
+ ~SPI_MX25R() ;
+
+ SPI m_spi;
+ DigitalOut m_cs ;
+ int _mode ;
+
+/// Write Enable
+ void writeEnable(void) ;
+
+/// Write Disable
+ void writeDisable(void) ;
+
+/// Reset Enable
+ void resetEnable(void) ;
+
+/// Reset
+ void reset(void) ;
+
+/// Program or Erase Suspend
+ void pgmersSuspend(void) ;
+
+/// Program or Erase Resume
+ void pgmersResume(void) ;
+
+/// Enter Deep Power Down
+ void deepPowerdown(void) ;
+
+/// Set Burst Length
+ void setBurstlength(void) ;
+
+/// Release from Read Enhanced Mode
+ void releaseReadenhaced(void) ;
+
+/// No Operation
+ void noOperation(void) ;
+
+/// Enter OTP Area
+ void enterSecureOTP(void) ;
+
+/// Exit OTP Area
+ void exitSecureOTP(void) ;
+
+/// Chip Erase
+ void chipErase(void) ;
+
+/// Write Status and Configuration Reg 1 and 2
+ void writeStatusreg(int addr) ;
+
+/// Write Security Reg
+ void writeSecurityreg(int addr) ;
+
+/** Page Program
+ *
+ * @param int addr start address
+ * @param uint8_t *data data buffer
+ * @param int numData the number of data to be written
+ */
+ void programPage(int addr, uint8_t *data, int numData) ;
+
+/** Sector Erase
+ *
+ * @param int addr specify the sector to be erased
+ */
+ void sectorErase(int addr) ;
+
+/** Block Erase
+ *
+ * @param int addr specify the sector to be erased
+ */
+ void blockErase(int addr) ;
+
+/** 32KB Block Erase
+ *
+ * @param int addr specify the sector to be erased
+ */
+ void blockErase32KB(int addr) ;
+
+/** Read Status Register
+ *
+ * @returns uint8_t status register value
+ */
+ uint8_t readStatus(void) ;
+
+/** Read Security Register
+ *
+ * @returns uint8_t security register value
+ */
+ uint8_t readSecurity(void) ;
+
+/** Read Manufacturer and JEDEC Device ID
+ *
+ * @returns uint32_t Manufacturer ID, Mem Type, Device ID
+ */
+ uint32_t readID(void) ;
+
+/** Read Electronic Manufacturer and Device ID
+ *
+ * @returns uint32_t Manufacturer ID, Device ID
+ */
+ uint32_t readREMS(void) ;
+
+/** Read Electronic ID
+ *
+ * @returns uint8_t Device ID
+ */
+ uint8_t readRES(void) ;
+
+/** Read Configuration Register
+ *
+ * @returns uint32_t configuration register value
+ */
+ uint32_t readConfig(void) ;
+ uint8_t readSFDP(int addr) ;
+ uint8_t readFREAD(int addr) ;
+ uint8_t read8(int addr) ;
+ void write8(int addr, uint8_t data) ;
+ // read sequential n bytes
+ void readNBytes(int addr, uint8_t *data, int nBytes);
+ private:
+
+} ;
+#endif // _SPI_MX25R_H_
\ No newline at end of file
--- a/SPI_MX25R.lib Tue Jun 01 20:19:52 2021 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -https://os.mbed.com/users/Arkadi/code/SPI_MX25R/#b6bb8d236251
--- a/main.cpp Tue Jun 01 20:19:52 2021 +0000
+++ b/main.cpp Mon Sep 13 18:55:32 2021 +0000
@@ -26,6 +26,7 @@
#include "serial.h"
#include "gps.h"
#include "lora_radio.h"
+#include "SPI_MX25R.h"
using namespace events;
@@ -110,73 +111,23 @@
pc.baud(9600);
pc.printf("config9600\n");
//enable serial rx interrupt
- pc.attach(&serial_post_to_queue, RawSerial::RxIrq);
- gps_config();
- gps_leBootMsg();
- gps_config_gnss ();
wait_ms(250);
-
- //########################################################
- // setup tracing
- setup_trace();
-
- // stores the status of a call to LoRaWAN protocol
- lorawan_status_t retcode;
-
- // Initialize LoRaWAN stack
- /*if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) {
- pc.printf("\r\n LoRa initialization failed! \r\n");
- return -1;
- }*/
-
- if(lorawan_initialize_stack(&ev_queue) != 0){
- return -1;
- }
-
- pc.printf("\r\n Mbed LoRaWANStack initialized \r\n");
-
- // prepare application callbacks
- /*callbacks.events = mbed::callback(lora_event_handler);
- lorawan.add_app_callbacks(&callbacks);
- */
-
- callbacks.events = mbed::callback(lora_event_handler);
- lorawan_add_callbacks(callbacks);
-
- // Set number of retries in case of CONFIRMED message
- if(lorawan_set_confirmed_msg_retries(CONFIRMED_MSG_RETRY_COUNTER) != 0){
- pc.printf("\r\n set_confirmed_msg_retries failed! \r\n\r\n");
- return -1;
- }
-
-
- pc.printf("\r\n CONFIRMED message retries : %d \r\n",
- CONFIRMED_MSG_RETRY_COUNTER);
-
- // Enable adaptive data rate
- if(lorawan_enable_adaptive_datarate() != 0){
- pc.printf("\r\n enable_adaptive_datarate failed! \r\n");
- return -1;
- }
-
-
- pc.printf("\r\n Adaptive data rate (ADR) - Enabled \r\n");
-
-
- if(lorawan_connect() != 0){
- pc.printf("\r\n Connection error, code = %d \r\n", retcode);
- return -1;
- }
-
- pc.printf("\r\n Connection - In Progress ...\r\n");
_actuated_led =0;
- //
- // make your event queue dispatching events forever
- ev_queue.call_every(TX_TIMER, GPS_Read);
- ev_queue.dispatch_forever();
+ uint8_t data[2];
+ data[0]= 0xFF; //byte qualquer
+ data[1] = 0xFF; //byte qualquer
+
+ SPI_MX25R *flash = new SPI_MX25R(P0_20, P0_17, P0_22, P0_24);
+
+ flash->writeEnable();
+ flash->programPage(0x191F50, data, 2);
+
+ pc.printf("o numero foi: %d\n\r", flash->read8(0x191F50));
+ pc.printf("o numero foi: %d\n\r", flash->read8(0x191F51));
+
return 0;
}