Browse Source

xflash: add xflash_multipage_program and documentation

Add a new high-level command to perform multipage writes quickly.
Yuri D'Elia 2 years ago
parent
commit
b398a09a4f
2 changed files with 34 additions and 3 deletions
  1. 22 0
      Firmware/xflash.c
  2. 12 3
      Firmware/xflash.h

+ 22 - 0
Firmware/xflash.c

@@ -116,6 +116,28 @@ void xflash_page_program(uint32_t addr, uint8_t* data, uint16_t cnt)
 	_CS_HIGH();
 }
 
+void xflash_multipage_program(uint32_t addr, uint8_t* data, uint16_t cnt)
+{
+    while(cnt)
+    {
+        xflash_enable_wr();
+        _CS_LOW();
+        xflash_send_cmdaddr(_CMD_PAGE_PROGRAM, addr);
+        while(1)
+        {
+            // send data
+            _SPI_TX(*(data++));
+            if(!--cnt || !(++addr & 0xFF))
+            {
+                // on a page boundary or end of write
+                _CS_HIGH();
+                xflash_wait_busy();
+                break;
+            }
+        }
+    }
+}
+
 void xflash_page_program_P(uint32_t addr, uint8_t* data, uint16_t cnt)
 {
 	_CS_LOW();

+ 12 - 3
Firmware/xflash.h

@@ -34,16 +34,25 @@ extern uint8_t xflash_rd_status_reg(void);
 extern void w25x20cl_wr_status_reg(uint8_t val);
 #endif
 extern void xflash_rd_data(uint32_t addr, uint8_t* data, uint16_t cnt);
-extern void xflash_page_program(uint32_t addr, uint8_t* data, uint16_t cnt);
-extern void xflash_page_program_P(uint32_t addr, uint8_t* data, uint16_t cnt);
+
 extern void xflash_sector_erase(uint32_t addr);
 extern void xflash_block32_erase(uint32_t addr);
 extern void xflash_block64_erase(uint32_t addr);
 extern void xflash_chip_erase(void);
-extern void xflash_page_program(uint32_t addr, uint8_t* data, uint16_t cnt);
 extern void xflash_rd_uid(uint8_t* uid);
 extern void xflash_wait_busy(void);
 
+// write up to a single page of data (256bytes)
+extern void xflash_page_program(uint32_t addr, uint8_t* data, uint16_t cnt);
+
+// write up to a single page of data from program memory
+extern void xflash_page_program_P(uint32_t addr, uint8_t* data, uint16_t cnt);
+
+// xflash_multipage_program: high-level interface for multi-page writes.
+//   Write any amount of data, chunking writes to page boundaries as needed.
+//   Automatically enables writes and waits for completion.
+extern void xflash_multipage_program(uint32_t addr, uint8_t* data, uint16_t cnt);
+
 #if defined(__cplusplus)
 }
 #endif //defined(__cplusplus)