|
I2C_ROMENGINE
Table of Contents |
I2C_ROMEngine/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // I2C Electrically Erasable Programmable Read Only Memory Engine // // Author: Kwabena W. Agyeman // Updated: 7/27/2010 // Designed For: P8X32A // Version: 1.1 // // Copyright (c) 2010 Kwabena W. Agyeman // See end of file for terms of use. // // Update History: // // v1.0 - Original release - 8/8/2009. // v1.1 - Added variable pin support - 7/27/2010. // // For each included copy of this object only one spin interpreter should access it at a time. // // Nyamekye, ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Public Spin methodsStart and StopROMEngineStart and ROMEngineStop methods are used for starting and stopping this object. This uses/frees the pins used.ROMEngineStop
SOURCE CODE... PUB ROMEngineStop
if(lockNumber)
lockret(-1 + lockNumber~)
ROMEngineStart(dataPinNumber, clockPinNumber, lockNumberToUse)
SOURCE CODE... PUB ROMEngineStart(dataPinNumber, clockPinNumber, lockNumberToUse)
ROMEngineStop
dataPin := ((dataPinNumber <# 31) #> 0)
clockPin := ((clockPinNumber <# 31) #> 0)
if((dataPin <> clockPin) and (chipver == 1))
lockNumber := lockNumberToUse
if(lockNumberToUse == -1)
lockNumber := locknew
result or= ++lockNumber
EEPROM read/writeHer you find basic send/receive-methods for single bytes.readByte(EEPROMaddress)
SOURCE CODE... PUB readByte(EEPROMaddress) result &= readPage(EEPROMaddress, @result, 1) writeByte(EEPROMaddress, value)
SOURCE CODE... PUB writeByte(EEPROMaddress, value) return writePage(EEPROMaddress, @value, 1) readWord(EEPROMaddress)
SOURCE CODE... PUB readWord(EEPROMaddress) result &= readPage(EEPROMaddress, @result, 2) writeWord(EEPROMaddress, value)
SOURCE CODE... PUB writeWord(EEPROMaddress, value) return writePage(EEPROMaddress, @value, 2) readLong(EEPROMaddress)
SOURCE CODE... PUB readLong(EEPROMaddress) result &= readPage(EEPROMaddress, @result, 4) writeLong(EEPROMaddress, value)
SOURCE CODE... PUB writeLong(EEPROMaddress, value) return writePage(EEPROMaddress, @value, 4) readPage(EEPROMaddress, RAMaddress, byteCount)
SOURCE CODE... PUB readPage(EEPROMaddress, RAMaddress, byteCount)
result := eepromPoll(EEPROMaddress)
if(result)
stopDataTransfer
startDataTransfer
result and= transmitPacket(constant((10 << 4) | 1) | ((EEPROMaddress >> 15) & $E))
repeat ((byteCount <# (65_536 - (RAMaddress #> 0))) #> 0)
byte[RAMaddress++] := receivePacket(--byteCount)
stopDataTransfer
clearLock
writePage(EEPROMaddress, RAMaddress, byteCount)
SOURCE CODE... PUB writePage(EEPROMaddress, RAMaddress, byteCount)
result := eepromPoll(EEPROMaddress)
if(result)
repeat ((byteCount <# (65_536 - (RAMaddress #> 0))) #> 0)
result and= transmitPacket(byte[RAMaddress++])
stopDataTransfer
clearLock
PRIvate MethodseepromPoll(EEPROMaddress)SOURCE CODE... PRI eepromPoll(EEPROMaddress)
' 8 Stack Longs
setLock
startDataTransfer
result := cnt
repeat until(transmitPacket(constant(10 << 4) | ((EEPROMaddress >> 15) & $E)))
stopDataTransfer
startDataTransfer
if((||(cnt - result)) > (clkfreq / constant(1_000 / 5)))
return false
result := transmitPacket(EEPROMaddress >> 8)
result and= transmitPacket(EEPROMaddress)
transmitPacket(value)SOURCE CODE... PRI transmitPacket(value) ' 4 Stack Longs
value := ((!value) >< 8)
repeat 8
dira[dataPin] := value
dira[clockPin] := false
dira[clockPin] := true
value >>= 1
dira[dataPin] := false
dira[clockPin] := false
result := not(ina[dataPin])
dira[clockPin] := true
dira[dataPin] := true
receivePacket(aknowledge)SOURCE CODE... PRI receivePacket(aknowledge) ' 4 Stack Longs
dira[dataPin] := false
repeat 8
result <<= 1
dira[clockPin] := false
result |= ina[dataPin]
dira[clockPin] := true
dira[dataPin] := (not(not(aknowledge)))
dira[clockPin] := false
dira[clockPin] := true
dira[dataPin] := true
startDataTransfer ' 3 Stack LongsSOURCE CODE... PRI startDataTransfer ' 3 Stack Longs outa[dataPin] := false outa[clockPin] := false dira[dataPin] := true dira[clockPin] := true stopDataTransfer ' 3 Stack LongsSOURCE CODE... PRI stopDataTransfer ' 3 Stack Longs dira[clockPin] := false dira[dataPin] := false setLock ' 3 Stack LongsSOURCE CODE... PRI setLock ' 3 Stack Longs
if(lockNumber)
repeat while(lockset(lockNumber - 1))
clearLock ' 3 Stack LongsSOURCE CODE... PRI clearLock ' 3 Stack Longs
if(lockNumber)
lockclr(lockNumber - 1)
Global Static DATaSOURCE CODE... ' //////////////////////Variable Array///////////////////////////////////////////////////////////////////////////////////////// dataPin byte 29 ' Default data pin. clockPin byte 28 ' Default clock pin. lockNumber byte 00 ' Driver lock number. ' ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// License┌──────────────────────────────────────────────────────────────────────────────────────┐ │ TERMS OF USE: MIT License │ ├──────────────────────────────────────────────────────────────────────────────────────┤ │Permission is hereby granted, free of charge, to any person obtaining a copy of this │ │software and associated documentation files (the "Software"), to deal in the Software │ │without restriction, including without limitation the rights to use, copy, modify, │ │merge, publish, distribute, sublicense, and/or sell copies of the Software, and to │ │permit persons to whom the Software is furnished to do so, subject to the following │ │conditions: │ │ │ │The above copyright notice and this permission notice shall be included in all copies │ │or substantial portions of the Software. │ │ │ │THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, │ │INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A │ │PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT │ │HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF │ │CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE │ │OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. │ └──────────────────────────────────────────────────────────────────────────────────────┘ SourceThis documentation was generated purely thru the power of the mind of @PhiPi out of the source<a href='I2C_ROMEngine.spin' target='_blank'>I2C_ROMEngine.spin</a> using <a href='http://www.phipi.com/spin2html/' target='_blank'>Spin Code Documenter</a> |