Published using Google Docs
( S25FL127.fth )
Updated automatically every 5 minutes

TACHYON [~

FORGET S25FL127.fth

pub S25FL127.fth                ." SPANSION 16Mbyte SPI FLASH 150327-0000  "  ;

{ STATS (not including utilities)

NAMES:  $54D8...74C2 for 8,170 bytes (+171)

CODE:   $0924...480D for 16,105 bytes (+243)

}

{ serial flash utility listing

lsfl

SERIAL FLASH DEVICE           MFG:01              DEVICE:17 V1.3

Memory size:                  16,777,216 bytes

Buffer size:                  256 bytes

Erase block regions           2=Boot device

Erase block info #1           16 sectors x 4,096 bytes

Erase block info #2           255 sectors x 65,536 bytes

Voltage range                 2.7V min            3.6V max

Word programming time:        64us typ            256us max

Buffer programming time:      1024us typ          4096us max

Sector erase time:            256us typ           2048us max

Chip erase time:              32768us typ         262144us max

}

Screenshot from 2014-11-19 16:56:56.png

Screenshot from 2014-11-19 17:01:29.png

Screenshot from 2014-11-19 17:03:34.png

Screenshot from 2014-11-19 17:08:06.png

--- Initialize the serial flash I/O

pub !SFIO

         &23.24.26.25 SPIPINS ( ce.miso.mosi.clk --- )

          #P26 HIGH --- shouldn't need to set this - check SPIPINS code

         ;

--- end the serial flash transfer by setting chip select high

pub SFEND                        &SFCS OUTSET ;

--- send a command to the serial flash

pub SFCMD ( cmd -- )         SFEND SPIWRB DROP ;

--- send a 24-bit address to the chip

pub SFADR ( addr -- )        8 SHL 3 FOR SPIWR NEXT DROP ;

( serial flash commands )

--- write enable

pub WREN                        6 SFCMD ;

pub WRDI                        4 SFCMD ;

--- read configuration register

pub RDCR                        $35 SFCMD 0 SPIRD SFEND ;

--- read a status register (0 or 1)

pub RDSR ( n -- )                2* 5 + SFCMD 0 SPIRD SFEND ;

statusreg1.png

configreg.png

statusreg2.png

pub BANK! ( addr -- )                        $17 SFCMD SPIWRB DROP SFEND ;

pub BANK@ ( addr -- bank )                 $16 SFCMD 0 SPIRD SFEND ;

pub SFREAD ( dst len cmd -- )                SFCMD ADO 0 SPIRD I C! LOOP SFEND ;

pub READ ( src dst cnt -- )                 3 SFCMD ROT SFADR ADO 0 SPIRD I C! LOOP SFEND ;

--- PAGE PROGRAM - program up to a page from src to dst for cnt

pub PP        ( src dst cnt -- )                        2 SFCMD SWAP SFADR ADO I C@ SPIWRB DROP LOOP SFEND ;

--- single byte program

pub SFC! ( byte addr -- )                2 SFCMD SFADR SPIWRB DROP SFEND ;

--- single word program

pub SFW! ( word addr -- )                2 SFCMD SFADR DUP SPIWRB DROP 8 SHR SPIWRB DROP SFEND ;

--- single long program -- long is broken up into bytes to get the correct order

pub SF! ( long addr -- )                2 SFCMD SFADR DUP SPIWRB DROP 8 SHR DUP SPIWRB DROP 8 SHR DUP SPIWRB DROP 8 SHR SPIWRB DROP SFEND ;

--- SECTOR ERASE

pub SE ( addr -- )                        $D8 SFCMD SFADR SFEND ;

{HELP WRR ( data -- )

Write registers

The Write Registers (WRR) command allows new values to be written to Status Register 1, Configuration

Register, and Status Register 2

}

pub WRR ( data cnt -- )                        1 SFCMD FOR DUP SPIWRB 8 SHR NEXT DROP SFEND ;

--- serial flash soft reset

pub SFRST        $F0 SFCMD SFEND ;

( Serial flash reporting utilies )

--- add some tabbing extensions for formatting

BYTE xtab

: XTAB ( n -- )         xtab C@ - SPACES ; BEGIN xtab C@ OVER < WHILE SPACE REPEAT DROP ;

: (XTAB)        DUP (EMIT) DUP $0D = IF 0 xtab C! THEN $1F > IF xtab C++ THEN ;

: !XTAB         ' (XTAB) uemit W! ;

pub @RDID        BUFFERS + ;

pub RDID@        @RDID C@ ;

pub RDID2@        @RDID C@++ SWAP C@ 8 SHL + ;

pub .VR                DUP 4 SHR $30 + EMIT "." EMIT >N $30 + EMIT "V" EMIT SPACE ;

pub .RD ( offset -- )

         #30 XTAB

         DUP RDID@ |< DUP $0A .NUM PRINT" us typ"

         #50 XTAB

         SWAP 4 + RDID@ |< * $0A .NUM PRINT" us max"

         ;

pub .BLKINFO ( blk -- )

         DUP 4 * $2D +

        CR PRINT" Erase block info #" SWAP 1+ PRINT

         30 XTAB DUP RDID2@ 1+ 0 PRINTDEC PRINT"  sectors x "

         2+ RDID2@ $2A RDID@ |< * 0 PRINTDEC PRINT"  bytes"

          ;

pub lsfl        

         !XTAB !SFIO

          CR PRINT" SERIAL FLASH DEVICE"

         $90 SFCMD 0 SFADR         0 SPIRD

         30 XTAB PRINT" MFG:" .BYTE

         50 XTAB PRINT" DEVICE:" 0 SPIRD .BYTE SFEND

        BUFFERS 384 $9F SFREAD

          $43 RDID@ PRINT"  V" EMIT "." EMIT $44 RDID@ EMIT

         CR PRINT" Memory size:" 30 XTAB $27 RDID@ |< 0 PRINTDEC PRINT"  bytes"

         CR PRINT" Buffer size:" 30 XTAB $2A RDID@ |< 0 PRINTDEC PRINT"  bytes"

         CR PRINT" Erase block regions" 30 XTAB $2C RDID@ DUP . 1 =

           IF PRINT" =Uniform" ELSE PRINT" =Boot" THEN PRINT"  device"

         0 .BLKINFO 1 .BLKINFO

        CR PRINT" Voltage range " 30 XTAB  $1B RDID@ .VR PRINT" min" 50 XTAB $1C RDID@ .VR PRINT" max"

         CR PRINT" Word programming time:   " $1F .RD

          CR PRINT" Buffer programming time: " $20 .RD

          CR PRINT" Sector erase time:       " $21 .RD

           CR PRINT" Chip erase time:         " $22 .RD

         CR PRINT" Device ID and CFI dump "

         0 384 BUFFERS BDUMP

         CR PRINT" SERIAL FLASH DISCOVERABLE PARAMETERS"

        BUFFERS BL $5A SFREAD

         0 BL BUFFERS BDUMP

         ;

--- temporary testers

: L                         BUFFERS $100 DUMP ;

: SFL ( cmd -- )         SFCMD  81 FOR 0 SPIRD SPACE .BYTE NEXT SFEND ;

]~

END

lsfl