Shop OBEX P1 Docs P2 Docs Learn Events
Memory Stick Datalogger in SPI mode — Parallax Forums

Memory Stick Datalogger in SPI mode

Michael @ AfineolMichael @ Afineol Posts: 33
edited 2010-04-06 14:53 in Propeller 1
I am having an intiailization issue with my Datalogger. If I either load the eeprom or RAM with my program the Datalogger will not initialize, but if I reload RAM with my program the Datalogger works everytime. Iam using the Datalogger SPI mode·code as a base. I am not sure what I am doing wrong.

PUB ProgramInit   USBOffset := 0                                                                  
  TempOffset := USBOffset

 
  IFNOT Init_LCD(LCD_Pin, LCD_Baud, LCD_Lines)
    REBOOT
  lcd.cls
  lcd.str(lcdnum.dec(USBOffset))      

  WAITCNT((CLKFREQ * 2) + CNT)

  Init_USB (SPI_CS, SPI_CLK ,SPI_SDI, SPI_SDO)
  WAITCNT(CLKFREQ  + CNT)

 
  logger.changeDirectory(string("\"))
  IF logger.openFileForRead(string("Myfile.txt"),0)
    logger.seek(USBOffset)                                                          
    logger.readFromFileUntilChar(string("Myfile.txt"),@arrUSBBuffer,CR,@USBOffset)
    logger.closeFile(string("Myfile.txt"))
    lcd.cls 
    lcd.str(num.dec(USBOffset))
    WAITCNT((CLKFREQ + 2) + CNT)

PUB Init_USB(vSPI_CS, vSPI_CLK ,vSPI_SDI, vSPI_SDO)
 
  logger.DataloggerSPI(vSPI_CS, vSPI_CLK, vSPI_SDI, vSPI_SDO)
  
  WAITCNT(CLKFREQ / 4 + CNT)      ' Wait for 250ms initialization
  Repeat
    logger.receivePromptOrError(2000)     ' get unsollicited message from datalogger
    If logger.diskPresent
'       if logger.diskIdentify(@dirbuf,255,0)                                                    
      quit
    Else
       WAITCNT(CLKFREQ + CNT)                                                                  'wait 1 second

Comments

  • Peter VerkaikPeter Verkaik Posts: 3,956
    edited 2010-04-04 21:01
    Here is the comment Huey wrote

    'I started using this code in a data logger project and it was a great jump start.
    'I did have a little trouble when logging at a high rate of speed and ended up adding
    '2 lines to the code below to correct the problem.
     
    PRI transfer(read,status,data): val | mask
       '/**
       ' * Transfer data to/from Vinculum USB Host in SPI mode, using seperate data in and data out pin
       ' * * @param read True for read, false for write.
       ' * @pram status False to access command register, true to access status register.
       ' * @param data If write, byte to write. If read, not used.
       ' * @return 9bit value, bit0 is 0 if byte written succesfully or new data read
       ' * If read, b8-b1 is byte read
       ' */ '
       ' For read, send 110, then read 8 bits (MSB first), read statusbit (total 12 clockpulses)
       ' For write, send 100, then write 8 bits (MSB first), read statusbit (total 12 clockpulses)
       repeat 'line added by Huey ---------------------------------------------------------------
         val := 0
         data := $800 | ($400 & read) | ($200 & status) | (data << 1)
         mask := $800
         outa[noparse][[/noparse]SPI_CLK]~~ ' At least one clock after deselecting
         outa[noparse][[/noparse]SPI_CLK]~ outa[noparse][[/noparse]SPI_CS]~~ ' Select chip
         repeat 12 ' Start, direction, address, 8 data, status
           outa[noparse][[/noparse]SPI_SDO] := (data & mask) > 0
           val |= (mask & (ina[noparse][[/noparse]SPI_SDI] > 0))
           outa[noparse][[/noparse]SPI_CLK]~~ ' Data valid on positive edge of clock
           outa[noparse][[/noparse]SPI_CLK]~
           mask >>= 1
         outa[noparse][[/noparse]SPI_CS]~ ' Deselect chip
         outa[noparse][[/noparse]SPI_CLK]~~ ' At least one clock after deselecting
         outa[noparse][[/noparse]SPI_CLK]~
       while (((val & $001) > 0) AND NOT ($400 & read)) 'line added by Huey -----------------------------------------------
       return val
     
    'I also added the following code to get things started during initialization.
    'This is only called in my program 1 time after power up.
     
    PUB flush 'very important to have this section in the code for logger to work on power up
      waitcnt(clkfreq/1000 + cnt)
      repeat
        if readByte <> -1 'if new data read
          waitcnt(clkfreq/1000 + cnt)
        else
          quit
          
    'Overall it worked great. Huey 
    
    

    I have not tried these additions but they may work for you.

    regards peter

    Post Edited (Peter Verkaik) : 4/5/2010 2:41:02 AM GMT
  • Michael @ AfineolMichael @ Afineol Posts: 33
    edited 2010-04-06 14:53
    Peter, Thank you! That did the trick. I added·logger.flush and it solved my issue.·
    PUB ProgramInit    USBOffset := 0                                                                  
      TempOffset := USBOffset
    
     
      IFNOT Init_LCD(LCD_Pin, LCD_Baud, LCD_Lines)
        REBOOT
      lcd.cls
      lcd.str(lcdnum.dec(USBOffset))      
    
      WAITCNT((CLKFREQ * 2) + CNT)
    
      Init_USB (SPI_CS, SPI_CLK ,SPI_SDI, SPI_SDO)
      WAITCNT(CLKFREQ  + CNT)
     
      logger.flush
    
    

    
    
    ·
Sign In or Register to comment.