Hello
Have anyone sucessfull used the M25P32 serial memory device?
Perhaps a sample code to share?
Thank You
Best regards
pedro
THE BOOK of DT's INTERRUPTS is an
organization of interrupt service
routines and other works written by Darrel Taylor, RIP. Interrupt routines are arranged per Darrel's original list. Darrel Taylor's Instant Interrupts are an extension of the work of Tim Box whom in October of 2002 wrote INT_CTRL.pbp Many of the forum members felt this is a long overdue project. THE BOOK of DT's INTERRUPTS will be a valuable resource and a tribute to Darrel Taylor the "Fanatical Contributor". THE BOOK of DT's INTERRUPTS is located at http://dt.picbasic.co.uk/ |
Hello
Have anyone sucessfull used the M25P32 serial memory device?
Perhaps a sample code to share?
Thank You
Best regards
pedro
Hi Pedro,
I have used the M25P32 with good success. Here are some code snips as pointers.
In essence I build an array of 4 x 64 characters and then burst them into the memory. I do this 4 times per record so I store 1024 bytes each logging sample period.
Heavily cut to fit the 10k character limit but I am sure you can nut it out.
HTH
Brian
DEFINE osc 4 '20
'DEFINE NO_CLRWDT 1
DEFINE Loader_Used 1
DEFINE DEBUG_REG PORTC 'Debug pin port
DEFINE DEBUG_BIT 6 'Debug pin bit
DEFINE DEBUG_BAUD 19200 'Debug baud rate
DEFINE DEBUG_MODE 0 'Debug mode: 0 = True, 1 = Inverted
'DEFINE DEBUG_PACING 100 'Debug character pacing in us
'****************** Variables **************************
' RAM Assignments and Variables
' -----------------------------
MEMchip var byte ' either 0 or 1 to
ADval var word 'Create adval to store result
DB var byte ' Single Data Byte to be passed to memory
DB2 var byte
DS0 var byte[64] ' String of data bytes to be passed to memory
DS1 var byte[64] ' String of data bytes to be passed to memory
DS2 var byte[64] ' String of data bytes to be passed to memory
DS3 var byte[64] ' String of data bytes to be passed to memory
UZ var word
Addr0 var byte ' LSB of 24 bit address
Addr1 var byte
Addr2 var byte ' MSB of 24 bit address
'*************************** Hardware assigns
'PortD
CLK var portd.0 ' Clock to both M25P32
MD var portd.1 ' Data to both M25P32
MQ var portd.2 ' Data from both M25P32
MS0 var portd.3 ' Chip 0 Select - active LOW
MS1 var portd.4 ' Chip 1 Select - active LOW - idle HIGH
SpareD5 var portd.5 ' spare
SpareD6 var portd.6 ' spare
SpareD7 var portd.7 ' spare
TRISD = %00000100
PortD = %00011110
'**************************** Subroutines *****************************
goto endsubroutines ' jump subroutines at startup
WakeUpMemory: 'M25P32
' Release from deep power down
TRISA = %00000001
TRISB = %11101111 'SDA, SCL, Thermistor, MicPwr, nc, nc, nc, nc
TRISC = %10000000 'Rx232, Tx232 & LED, MW0, MS1, MD, MC, MemPwr1, MemPwr0
TRISD = %11100001 'SDA2, SCL2, Alarm, MW1, MS0, MH1, MH0, MQ
ADCON0 = %11000001 'ADC enabled
' ADCON1 = %10000010 ' 10 bit resolution - use ADRESH & ADRESL
ADCON1 = %00000010 ' 8 bit resolution IF ADRESH is used as adVal
high clk
high md
input mq
high sda
high scl
low micpwr
high tx232
high ms0
high ms1
' Mem 0 - Release from Deep Power Down
low ms0
high ms1
shiftout md, clk, 1, [$AB, $AA, $AA, $AA ] 'wake needs 3 dummy bytes
shiftin mq, clk, 0, [db] '
high ms0
high ms1
pause 1
' Mem 1 - Release from Deep Power Down
high ms0
low ms1
shiftout md, clk, 1, [$AB, $AA, $AA, $AA ] 'wake needs 3 dummy bytes
shiftin mq, clk, 0, [db] '
high ms0
high ms1
pause 1
return
'****************** end of subroutines ****************************
EndSubRoutines:
'********************** Initialise ********************************
''ZZZZZZZZZZZZZ Run from here ZZZZZZZZZZZZZZZZZZ
ReadActionFlag:
read 0,af
if af = 0 then erasemem ' followed by log data AF = 2
if af = 1 then memdump ' followed by end
if af = 2 then logdata ' followed by dump memory AF = 1
if af = 3 then waitfornewcode ' followed by end
'********************************* Erase Memory ***************************
EraseMem:
gosub wakeupmemory 'set up TRIS etc & release from deep power down
'Remove write protection by writing to Status Register
low ms0
low ms1
'Issue WRite ENable before status register write
shiftout Md, clk, 1, [$06 ] ' WREN issued to BOTH chips
high ms0
high ms1
pauseus 10
' Write to both Mem0 & Mem1 Status Register
low ms0
low ms1
shiftout Md, clk, 1, [$01,$00 ]' Write Status Reg, clear protection bits
high ms0
high ms1
pause 16 ' tw is 15
' Issue Bulk erase command
low ms0
low ms1
'need a WRite ENable before the bulk erase command
shiftout Md, clk, 1, [$06 ] ' WREN issued to BOTH chips
high ms0
high ms1
pauseus 10
low ms0
low ms1
shiftout Md, clk, 1, [$C7]' Bulk Erase command to BOTH chips
high ms0
high ms1
c = 0
EraseCheck: 'loop at 1/sec until erase complete
c = c + 1
low ms0 'select Mem0
high ms1
shiftout md, clk, 1, [$05] 'Read Status Register
shiftin mq, clk, 0, [a]
a = a & %00000001 ' extract bit 0
high ms0
high ms1
pauseus 10
high ms0
low ms1 'select Mem1
shiftout md, clk, 1, [$05]
shiftin mq, clk, 0, [b]
b = b & %00000001
high ms0
high ms1
pause 1000 'nominal 1 second loop
debug #c, ",", #a, ",", #b ," "
if c//15 = 0 then debug $0D, $0A
if c > 250 then end
if (a = 0) or (b = 0) and c < 15 then
debug $0D, $0A, "Premature WIP flag clear - retrying", $0D, $0A
pause 1000
goto erasemem
endif
if (a = 1) or (b = 1 ) then erasecheck 'not finished yet
debug $0D, $0A, $0D, $0A, " Erase times VALID - PASS", $0D, $0A
''*************** Memory Dump ***********************
MemDump:
addr0 = 0 'LSB byte address - 256 entries
addr1 = 0 ' page address - 256 entries
addr2 = 0 'MSB sector address - 64 entries in M25P32 128 in M25P64
high ms0
high ms1
for memchip = 0 to 1 ' do it for both memory chips
for addr2 = 0 to 63 ' 64 sectors per chip
for addr1 = 0 to 255 ' 256 pages per sector each with 256 bytes
' Wake from deep power down
if memchip = 0 then
low ms0
high ms1
pauseus 10
else
high ms0
low ms1
pauseus 10
endif
shiftout Md, clk, 1, [$AB, $AA, $AA, $AA ] 'wake from deep power down
shiftin mq, clk, 0, [db] ' DB is chip identifier - discarded
high ms0
high ms1
pause 1
' Select Memory Dump mode
if memchip = 0 then
low ms0
high ms1
pause 1
else
low ms1
high ms0
pause 1
endif
shiftout Md, clk, 1, [$03, addr2, addr1, addr0 ] ' Select MemDump mode
xxxxxxxx snip xxxxxxxxxxxx
RecordingBlock:
' WakeUpMemory already called so should be ready to go
' select the correct memory chip
if addr2 < 64 then
low ms0
high ms1
else
high ms0
low ms1
endif
'Prepare to clear write protection bits
shiftout Md, clk, 1, [$06 ] ' WREN issued
high ms0
high ms1
if addr2 < 64 then
low ms0
high ms1
else
high ms0
low ms1
endif
shiftout Md, clk, 1, [$01,$00 ]' Write Status Reg, clear protection bits
high ms0
high ms1
pause 15 ' this is tw from datasheet
' Write a 4x1024 character blocks with data from various sources
CollectDataForPage0:
xxxxxxxxxxxxxxxxxxxxx snip xxxxxxxxxxxxxxxxx
'Now write the 256 bytes just collected to memory
'Program the page
'Prepare memory to accept data - issue WREN
if addr2 < 64 then
low ms0
high ms1
else
high ms0
low ms1
endif
shiftout Md, clk, 1, [$06 ] ' issue WREN
ms0 = 1 ' deselect both memory chips at end
ms1 = 1
if addr2 < 64 then
MS0 = 0 ' select memory 0
MS1 = 1
else
ms0 = 1
ms1 = 0
endif
shiftout md, clk, 1, [$02, addr2, addr1, addr0] ' issue Page Program command
' Write the first full page of 256 samples including time & date
for a = 0 to 63
shiftout md, clk, 1, [ds0[a]] ' write the date, time & heart sample
next a
for a = 0 to 63
shiftout md, clk, 1, [ds1[a]] ' write the heart sample
next a
for a = 0 to 63
shiftout md, clk, 1, [ds2[a]] ' write the heart sample
next a
for a = 0 to 63
shiftout md, clk, 1, [ds3[a]] ' write the heart sample
next a
MS0 = 1 'deselect both memory chips
MS1 = 1
' Page Program now running - increment pointers and
' buffer some heart samples into RAM
addr0 = 0 'byte address - set zero for justin
addr1 = addr1 + 1 'increment page address
if addr1 = 0 then addr2 = addr2 + 1 'increment sector address
'Stop completely at end of memory
if addr2 > 127 then end ' avoids overwriting old data
Bookmarks