Jag har precis börjat med att försöka tolka hieroglyferna i databladet och om jag inte har helt fel så ska man kunna ändra byte för byte.
• Fast Erase and Byte-Program:
– Chip-Erase Time: 35 ms (typical)
– Sector-/Block-Erase Time: 18 ms (typical)
– Byte-Program Time: 7 µs (typical)
Byte-Program
The Byte-Program instruction programs the bits in the
selected byte to the desired data. The selected byte must
be in the erased state (FFH) when initiating a Program
operation. A Byte-Program instruction applied to a pro-
tected memory area will be ignored.
Det är väl ofta så också att flash kan bara raderas blockvis, medans man kan ändra I EEPROM byte för byte?
Det varierar kraftigt med vad det är för typ av flash. Allt från radering av hela kretsen till enstaka byte. Jag har stött på båda dom varianterna, och mycket däremellan.
AndLi skrev:Jn: Nä, det är det som är "problemet" med flash. Att ställa om en bit till 0 är inga problem ,men att få den till 1 behövs en riktig erase.
Så det går att fylla en 4 KByte sektor i SST25VF080B med ettor för att senare skriva in byte för byte? Om inte så förmodar jag att man behöver ha en processor med minst 4 KByte RAM eller EEPROM-minne för att kunna lagra all data som ska skrivas till sektorn?
BEEP: Det finns ju flera såna sektorer i minnet, (250 stycken?), så man behöver ju inte ha 4kb i µC'n utan genom att flytta runt sakerna mellan olika sektorer måste man ju kunna få en bit till 1. (Man flyttar över all data till en annan sektor, sen raderar man sektor 1, sen flyttar man tillbaks allt till sektor 1 från den temporära sektorn (utom den som ska raderas)). Men det blir ju väldigt mycket mera jobb!
Beep: Nej, varför ska du behöva ha all data lagrad i förväg? Jag antar att datan genereras på något vis , t.ex en insignal som ska loggas eller tider/händelser som ska registreras. Du kan ju också fylla på med text, ljud eller bilder via interface från en PC (t.ex. RS232, genom mikroprocessorn).
Se till att flash-minnet är raderat till att börja med. sedan kan du ju fylla på byte för byte tills det är fullt. Det är ju inget RAM och är alltså inte lämpligt att ändra i hur som helst när man väl lagrat datan. Sedan när du läst av informationen och vill ha in ny data så kör du chip-erase och börjar om från början igen. Det är väl det allra enklaste sättet att använda minnet på.
squiz3r: Det där var alldeles för enkelt för att jag skulle komma på det själv
jesse: Jag ska fylla en stor del av flashminnet med färdig data som ska kunna ändras vid behov så den data som inte ändras måste ju lagras någon annanstans under tiden när sektorn raderas.
Jag försöker att koda iaf, men jag kan för lite C programmering så google får många frågor under tidens gång. Det känns som att det kommer att ta ett bra tag för mig det här...
Det skulle vara trevligt om någon mer kunnig än mig skulle visa en kodsnutt, känns som att många frågetecken skulle redas ut då.
Jag har portat över "SST - software driver" till SPIN (Parallax - Propeller) och har börjat med att försöka sätta minnet i skrivläge och göra en skrivläges kontroll men tyvärr så får jag inga ettor eller nollor från minnet.
CON
_clkmode = xtal1 + pll16x ' PLL
_xinfreq = 5_000_000 ' Crystal 5 MHz
' 16*5 = µC 80MHz (PASM: Instruction =>4 Clocks. SPIN: Very slow)
SI = 0 ' Serial Data Input
SCK = 1 ' Serial Clock
SO = 2 ' Serial Data Output
CE = 3 ' Chip Enable
LED_DEBUG = 4 ' Led
GND = 5 ' Led -> GND
PIN_MASK = 1<<SI | 1<<SCK | 1<<CE | 1<<LED_DEBUG | 1<<GND
PUB Main
Init ' Set pin and initialize SCK
WREN ' Enable Write Enable Latch
if WREN_Check ' WEL check
outa[LED_DEBUG]~~
repeat
PUB Init
dira |= PIN_MASK ' Set output
outa[SCK] := 0 ' Set clock to low initial state
PUB WREN
'' This procedure enables the Write Enable Latch.
'' It can also be used to Enables Write Status Register.
outa[CE] := 0 ' Enable device, clear CE low
Send_Byte($06) ' Send WREN command
outa[CE] := 1 ' Disable device, set CE high
PUB WREN_Check | byte_
'' This procedure checks to see if WEL bit set before program/erase.
byte_ := Read_Status_Register ' Read the status register
if byte_ == $02 ' Verify that WEL bit is set
result := true
else
result := false
' add source code or statements for this file to compile
' i.e. option: insert a display to view error on LED?
PUB Read_Status_Register | byte_
outa[CE] := 0 ' Enable device, clear CE low
Send_Byte($05) ' Send RDSR command
byte_ := Get_Byte ' Receive byte
outa[CE] := 1 ' Disable device, set CE high
result := byte_
PRI Send_Byte(out) | i
repeat i from 0 to 7 ' for (i = 0 i < 8 i++)
if (out & $80) == $80 ' check if MSB is high
outa[SI] := 1
else
outa[SI] := 0 ' if not, set to low
outa[SCK] := 1 ' toggle clock high
out := (out << 1) ' shift 1 place for next bit
outa[SCK] := 0 ' toggle clock low
PRI Get_Byte | i,in,temp
in := 0
repeat i from 0 to 7 ' for (i = 0 i < 8 i++)
in := (in << 1) ' shift 1 place to the left or shift in 0
temp := ina[SO] ' save input
outa[SCK] := 1 ' toggle clock high
if temp == 1 ' check to see if bit is high
in := in | $01 ' if high, make bit high
outa[SCK] := 0 ' toggle clock low
result := in
Senast redigerad av BEEP 15 mars 2009, 12:22:49, redigerad totalt 4 gånger.