Adding Memory for working variables via 23K256 or 23K640 SRAM

Simmicht

Senior Member
I am providing this as a working example of accessing the Microchip 23K256 SRAM chip using a 28X2 Picaxe chip.
This chip has 32768 x 8bit Bytes available.
I had to slow down the SPI but that might be due to the wiring using long leads etc.

Code:
'Written 26-JUL-2012 to 28X2
'Written/Modified by Simmicht
'This program reads and writes to the Microchip 23K256  256K SPI Bus Low-Power Serial SRAM
'
'                Electrical Connections
'                PIXAXE28X2                    23K256
'                Pin 13    PinC.2    CS  ->    Pin 1        Chip Select BAR
'                Pin 15    PinC.4    SDI ->    Pin 2        SO
'                                        Pin 3        NC
'                                        Pin 4        GND
'                Pin 16    PinC.5    SDO ->    Pin 5        SI
'                Pin 14    PinC.3    SCK ->    Pin 6        SCK
'                                        Pin 7        HOLD_BAR 
'                                        Pin 8        3V3
'
#REM

###############################
#                    #
#    MAIN INITILISATION BLOCK#
#                    #
###############################



#endrem

#SLOT 0
                    ' Written 26-JUL-2012 - PicAxe 28X2
                    ' By Simmicht
#picaxe 28X2
'#terminal 38400            '8MHz resonator
#terminal 19200
'#terminal 9600
#no_data
#no_table

SYMBOL StdFreq = EM16         'Has 4MHz Xtal installed
'SYMBOL StdFreq = m8         'Has 4MHz Xtal installed
setfreq StdFreq
'SetTimer t1s_16

#rem                    'For 32MHz
SYMBOL TwoSecond = 8000
SYMBOL OneSecond = 4000
SYMBOL Point5Second = 2000
SYMBOL Point3Second = 1200
SYMBOL Point1Second = 400
#endrem
                    'For 16MHz
SYMBOL TwoSecond = 4000
SYMBOL OneSecond = 2000
SYMBOL Point5Second = 1000
SYMBOL Point3Second = 600
SYMBOL Point1Second = 200



SYMBOL    I         = W2



'instruction set for 23K256 memory chip
SYMBOL _23K_READ         =    %00000011
SYMBOL _23K_WRITE     =    %00000010
SYMBOL _23K_RDSR         =    %00000101
SYMBOL _23K_WDSR         =    %00000001

SYMBOL _23K_BYTEMODE    =    %00000000
SYMBOL _23K_PAGEMODE    =    %10000000
SYMBOL _23K_SEQMODE    =    %01000000


SYMBOL _23K_CS        = C.2
SYMBOL _23K_StatusReg     = B54'W27
SYMBOL _23K_Byte        = B55'W27
SYMBOL _23K_AddressReg     = W26
SYMBOL _23K_AddressRegL    = B52'W26
SYMBOL _23K_AddressRegH    = B53'W26



HIGH _23K_CS                 'disable 23K256





hspisetup spimode00, spislow      ; spi mode




'set sequential mode

gosub ReadMode_23K
Sertxd("Status register is ",#_23K_Byte,cr,lf)

'_23K_Byte= _23K_SEQMODE
'gosub WriteMode_23K

_23K_Byte= _23K_PAGEMODE
gosub WriteMode_23K

gosub ReadMode_23K
Sertxd(" MODE is ",#_23K_Byte," - ")
IF _23K_Byte=%01000000 THEN 
    Sertxd("Sequential")
ELSEIF _23K_Byte=%10000000 THEN
    Sertxd("32 Byte Page mode")
ELSE
    Sertxd("Byte mode")
ENDIF
Sertxd(cr,lf)




FOR I = 0 to 100
    _23K_Byte=I
    _23K_AddressReg=I        'Word address of byte to read/write
    GOSUB Write23K
NEXT


do

FOR I = 0 to 100
    _23K_AddressReg=I        'Word address of byte to read/write
    GOSUB Read23K
    Sertxd("Read@",#I," = ",#_23K_Byte,cr,lf)
NEXT






_23K_AddressReg=0            'Word address of byte to read/write
gosub ReadBlock23K        'now rea out 100 bytes sequentially




END


for I = 1 to 2
    pause 2000
next



loop
END






'===========================================================================
ReadBlock23K:
setfreq M8

LOW _23K_CS 'ENABLE  23K256

HSPIOUT(_23K_READ       ) 'READ FROM ADDRESS
HSPIOUT(_23K_AddressRegH) 'READ FROM ADDRESS
HSPIOUT(_23K_AddressRegL) 'READ FROM ADDRESS

FOR I = 0 to 100
    HSPIIN (_23K_Byte)
    setfreq StdFreq
    sertxd(#I,":",#_23K_Byte,",")
    setfreq M8

NEXT
HIGH _23K_CS 'disable 23K256
setfreq StdFreq
RETURN



'===========================================================================

ReadMode_23K:
setfreq M8
LOW _23K_CS 'ENABLE  23K256
HSPIOUT(_23K_RDSR       ) 'Read setup Mode call
HSPIIN (_23K_Byte)
HIGH _23K_CS 'disable 23K256
setfreq StdFreq
RETURN

'===========================================================================

WriteMode_23K:
setfreq M8
LOW _23K_CS 'ENABLE  23K256
HSPIOUT(_23K_WDSR       ) 'write setup Mode call
HSPIOUT(_23K_Byte)
HIGH _23K_CS 'disable 23K256
setfreq StdFreq
RETURN


'===========================================================================
Read23K:
setfreq M8
LOW _23K_CS 'ENABLE  23K256
HSPIOUT(_23K_READ       ) 'READ 
HSPIOUT(_23K_AddressRegH) 'READ FROM ADDRESS
HSPIOUT(_23K_AddressRegL) 'READ FROM ADDRESS
HSPIIN (_23K_Byte)
HIGH _23K_CS 'disable 23K256
setfreq StdFreq
RETURN


'===========================================================================
Write23K:
setfreq M8
'Sertxd("H=",#_23K_AddressRegH," L=",#_23K_AddressRegL,cr,lf)
LOW _23K_CS 'ENABLE  23K256
HSPIOUT(_23K_WRITE      ) 'WRITE
HSPIOUT(_23K_AddressRegH) 'READ FROM ADDRESS
HSPIOUT(_23K_AddressRegL) 'READ FROM ADDRESS
HSPIOUT(_23K_Byte      ) 'WRITE TO ADDRESS
HIGH _23K_CS 'disable 23K256
setfreq StdFreq
RETURN
 
Last edited:
Top