SPI DataFlash Library
Inhaltsverzeichnis
Overview
This library reads/writes Atmel AT25DF-compatible SPI DataFlash ICs (ex. Spansion S25FL) through either a SW or HW SPI interface. The sample serves also as Firmware for the DataFlash Programmer application to initially write data into the memory. It uploads a list of any type of files, image files are converted on the fly to the uncompressed 16-Bit color BIN format. To access the stored information, an include file with all the neccessary constants (memory position, size, image width & height) is generated.
The library has been developed and tested using an XMega-A1 Xplain board with a Spansion S25FL032P (32Mbit) dataflash mounted on it (U502!).
How to use
Include the library. Set the options above the $include statement, needs the new Submode.
Config Submode = New Const Flash_port_spi = PORTC $include "SpiFlash.inc"
Init the DataFlash SPI interface
Sub Flash_init()
Read the 81 Bytes JEDEC RDID information
Sub Flash_get_info(byref Spiflashbuffer() As Byte)
Disable the SPI interface
Sub Flash_stop()
Erase a sector (64Kb block, upper 8 Bit of 24 Bit byte adress). The memory has to be erased (set to &HFF) before writing data.
Sub Flash_sector_erase(byval Sector As Byte)
Erase the whole memory
Sub Flash_bulk_erase()
Writes a page to the memory (256 Bytes) to a specified page adress (upper 16 Bit of 24 Bit byte adress).
Sub Flash_write_page(byval Address As Word , Byref Pagedata() As Byte)
Reads a block of data starting from the 24 Bit adress
Sub Flash_read(byval Address As Dword , Byref Spiflashbuffer() As Byte , Byval Length As Word)
Reads a block of data from the flash memory to an SRAM adress
Sub Flash_readto(byval Sourceaddress As Dword , Byval Destinationaddress As Dword , Byval Length As Dword)
Start an asynchronous read sequence. Data can be read byte-wise from the 24 Bit start adress until Flash_endread() is called.
Sub Flash_beginread(byval Address As Dword)
Reads a Byte (needs Flash_beginread() first)
Function Flash_readbyte() As Byte
Stop a read sequence
Sub Flash_endread()
Options
Electrical connection
Sample
$regfile = "xm128a1def.dat" $crystal = 32000000 $hwstack = 64 $swstack = 64 $framesize = 64 Config Submode = New Const False = 0 Const True = 1 $include "XMegaPll.inc" Config Com1 = 115200 , Mode = Asynchroneous , Parity = None , Stopbits = 1 , Databits = 8 Open "COM1:" For Binary As #1 ' use the watchdog for communication timeouts Config Watchdog = 1000 Const Flash_port_ss = Portq ' Xplained DataFlash SS Const Flash_pin_ss = 2 Const Flash_enable_statusled = True $include "SPI-Flash.inc" Dim Flashbuffer(256) As Byte Dim Shakedhands As Boolean Dim Tempbyte As Byte , Tempword As Word , Tempdword As Dword Flash_init Do ' wait for command Inputbin #1 , Tempbyte Select Case Tempbyte ' Handshake/Exit Case &HAA: Shakedhands = Not Shakedhands ' some kind of accidental write protection Printbin #1 , &HF0 ' ack ' erase a sector (address bits 23..16) Case &H01: Reset Watchdog Start Watchdog Inputbin #1 , Tempbyte ' read sector address Stop Watchdog If Shakedhands = True Then Flash_sector_erase Tempbyte Printbin #1 , &HF0 ' erase whole memory Case &H02: If Shakedhands = True Then Flash_bulk_erase Printbin #1 , &HF0 ' write a page (256 Bytes, address bits 23..8) Case &H03: Reset Watchdog Start Watchdog Inputbin #1 , Tempword ' read page address Inputbin #1 , Flashbuffer(1) ; 256 ' read 256 bytes page data Stop Watchdog Swap Tempword If Shakedhands = True Then Flash_write_page Tempword , Flashbuffer(1) Printbin #1 , &HF0 ' read a page (256 Bytes, address bits 23..8) Case &H04: Reset Watchdog Start Watchdog Inputbin #1 , Tempword ' read page address Stop Watchdog Swap Tempword Tempdword = Tempword Shift Tempdword , Left , 8 If Shakedhands = True Then Flash_read Tempdword , Flashbuffer(1) , 256 Printbin #1 , Flashbuffer(1) ; 256 ' write page data ' read the device ID data (81 Bytes) Case &H05: If Shakedhands = True Then Flash_get_info Flashbuffer(1) Printbin #1 , Flashbuffer(1) ; 81 End Select Loop
DataFlash Programmer
Donate
This Software is Donationware. <paypal>1</paypal> See here for more informations