Memory Stick Datalogger in SPI mode
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
'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. HueyI 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
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·