working with external memory


Closed Thread
Results 1 to 16 of 16

Hybrid View

  1. #1


    Did you find this post helpful? Yes | No

    Default Code to read and write to M25P128

    Hi Ruben,

    Try this. I have several methods for reading and writing to the M25Pxxx family. All work but the ones not commented out are the fastest. In some infrequent calls I have left the slow routines in place as they don't add any significan time to the download of data from the M25Pxxx memory.

    [code]
    ReadFromM25P128:
    memclk = 0 'data change point
    memclk = 1 : reply.7 = memq : memclk = 0
    memclk = 1 : reply.6 = memq : memclk = 0
    memclk = 1 : reply.5 = memq : memclk = 0
    memclk = 1 : reply.4 = memq : memclk = 0
    memclk = 1 : reply.3 = memq : memclk = 0
    memclk = 1 : reply.2 = memq : memclk = 0
    memclk = 1 : reply.1 = memq : memclk = 0
    memclk = 1 : reply.0 = memq : memclk = 0
    'takes 50 uSecs per character
    debug #reply, ", " 'Debug takes 6.7 mSecs
    return


    RDSRWIP: 'reads the Status Register - waits for WIP bit to go low
    'Data from M25P128 changes on fall of clock so sample on rise of clock.
    code = $05 'Read Status Register code
    gosub sendcode
    WIPclr:
    for shift = 7 to 0 step -1 'read 8 bit reply
    high memclk : reply.0[shift] = memq : low memclk : pauseus 1
    next shift
    if reply.0 = 1 then wipclr
    return

    SendCode: 'Serial MSB first sends the CODE byte from PIC to M25P128
    TRISE.0 = 0 : PortE.0 = 0 : memclk = 0 'MemClk
    TRISC.0 = 0 : PortC.0 = 0 : memd = 0 'MemD
    ' for shift = 7 to 0 step -1 'send MSB first
    ' memclk = 0 : memd = code.0[shift] : memclk = 1: pauseus 1 : memclk = 0
    ' next shift 'this is SLOW ~500 uSecs per character
    memclk = 0
    memclk = 0 : memd = code.7 : memclk = 1
    memclk = 0 : memd = code.6 : memclk = 1
    memclk = 0 : memd = code.5 : memclk = 1
    memclk = 0 : memd = code.4 : memclk = 1
    memclk = 0 : memd = code.3 : memclk = 1
    memclk = 0 : memd = code.2 : memclk = 1
    memclk = 0 : memd = code.1 : memclk = 1
    memclk = 0 : memd = code.0 : memclk = 1
    ' much faster, takes about 52 uSecs per character
    return
    /[code]

    You can see here I have several methods for reading from the M25P128. The decrementing loop "... for shift = 7 to 0 step -1..." works and is simple BUT it takes about 500 uSecs per character.

    HTH
    BrianT

  2. #2
    Join Date
    Aug 2004
    Posts
    64


    Did you find this post helpful? Yes | No

    Default reading m25p16

    Brian:
    Thanks for your fast response...
    I am reading wav files stored in the M25P, and using this to send the address:
    cs1 = 0 'SEND COMMAND AND ADDRESS
    SHIFTOUT MOSI,SCK,1,[$03\8] 'read command $03
    SHIFTOUT MOSI,SCK,1 ,[PAGE.BYTE1\8,PAGE.BYTE0\8,00\7]'addr 000000
    I send the command and then the 24 bits address,but note in the last address byte I send
    only 7 bytes. then I go to a loop to read the data and send it to the port to convert to
    analog with a R2R network,until I find a special end of file char to stop the reading.
    If I send the 8 bits, I get shifted data. With 7 bits I got the correct data and I can identify
    the end of file byte. I do not know why.
    the read routine is this:
    ASM
    MOVLW 8
    MOVWF _CNT
    SIGUE
    BTFSS _MISO ;MOV BIT TO CHR,0
    BCF _CHR,0
    BTFSC _MISO
    BSF _CHR,0
    BSF _SCK ;READ AFTER SENDING THE CLOCK
    RLF _CHR,1
    BCF _SCK
    NOP
    NOP
    NOP
    NOP
    NOP
    DECFSZ _CNT,1
    GOTO SIGUE
    ENDASM

    Am I missing some previous command to set up the chip for reading..?

    I will test your routines to see if I got an improvement.
    Thanks again...
    Ruben de la Pena V.

  3. #3
    Join Date
    Aug 2004
    Posts
    64


    Did you find this post helpful? Yes | No

    Smile it works !...

    Brian:
    I only use the read routines for a little wav player. I use a 16F1826 at 16 mhz.(Internal Osc).
    The working routines:
    '************************************************* *****
    TESTREAD:
    CS1 = 1
    PAUSEUS 200
    CS1= 0
    code = 03 'read command
    gosub sendbyte
    code = 0 'higher add.
    gosub sendbyte
    code = 00 'high add.
    gosub sendbyte
    code = 0 'low add.
    gosub sendbyte
    nextread:
    GOSUB READBYTE
    SEROUT2 LED,32,[HEX2 REPLY," "]
    'PORTB = REPLY
    PAUSEUS 50
    GOTO nextread

    sendbyte:
    sclk = 0
    sclk = 0 : memd = code.7 : sclk = 1
    sclk = 0 : memd = code.6 : sclk = 1
    sclk = 0 : memd = code.5 : sclk = 1
    sclk = 0 : memd = code.4 : sclk = 1
    sclk = 0 : memd = code.3 : sclk = 1
    sclk = 0 : memd = code.2 : sclk = 1
    sclk = 0 : memd = code.1 : sclk = 1
    sclk = 0 : memd = code.0 : sclk = 1
    return
    Readbyte:
    sclk = 0 'data change point
    sclk = 1 : reply.7 = memq : sclk = 0
    sclk = 1 : reply.6 = memq : sclk = 0
    sclk = 1 : reply.5 = memq : sclk = 0
    sclk = 1 : reply.4 = memq : sclk = 0
    sclk = 1 : reply.3 = memq : sclk = 0
    sclk = 1 : reply.2 = memq : sclk = 0
    sclk = 1 : reply.1 = memq : sclk = 0
    sclk = 1 : reply.0 = memq : sclk = 0
    return
    '*********************************************
    I conected the M25P in port A and send the data to the PortB.
    It works up to 48 Mhz(audio), but I am using it at 16 KHZ.
    The M25P does not need anything aditional to work...
    Greetings and thanks again...
    Ruben de la Pena V.

Members who have read this thread : 0

You do not have permission to view the list of names.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts