serial synchronous
Hope I did this right.
Instead of using smart pins I have been trying to port this over to spin2.
{{
- Propeller SPI Engine ... Spin Version v1.0 *
- Author: Beau Schwabe *
- Copyright (c) 2009 Parallax *
- See end of file for terms of use. *
Revision History:
V1.0 - original program
}}
CON
#0,MSBPRE,LSBPRE,MSBPOST,LSBPOST '' Used for SHIFTIN routines
''
'' =0 =1 =2 =3
''
'' MSBPRE - Most Significant Bit first ; data is valid before the clock
'' LSBPRE - Least Significant Bit first ; data is valid before the clock
'' MSBPOST - Most Significant Bit first ; data is valid after the clock
'' LSBPOST - Least Significant Bit first ; data is valid after the clock
#4,LSBFIRST,MSBFIRST '' Used for SHIFTOUT routines
''
'' =4 =5
''
'' LSBFIRST - Least Significant Bit first ; data is valid after the clock
'' MSBFIRST - Most Significant Bit first ; data is valid after the clock
VAR long ClockDelay,ClockState
PUB start(_ClockDelay, _ClockState)
ClockState := _ClockState
ClockDelay := ((clkfreq / 100000 * _ClockDelay) - 4296) #> 381
PUB SHIFTOUT(Dpin, Cpin, Mode, Bits, Value)
dira[Dpin]~~ ' make Data pin output
outa[Cpin] := ClockState ' set initial clock state
dira[Cpin]~~ ' make Clock pin output
if Mode == 4 'LSBFIRST Value <-= 1 ' pre-align lsb repeat Bits outa[Dpin] := (Value ->= 1) & 1 ' output data bit PostClock(Cpin) if Mode == 5 'MSBFIRST Value <<= (32 - Bits) ' pre-align msb repeat Bits outa[Dpin] := (Value <-= 1) & 1 ' output data bit PostClock(Cpin)
PUB SHIFTIN(Dpin, Cpin, Mode, Bits)|Value
dira[Dpin]~ ' make dpin input outa[Cpin] := ClockState ' set initial clock state dira[Cpin]~~ ' make cpin output Value~ ' clear output if Mode == 0 'MSBPRE repeat Bits value := (Value << 1) | ina[Dpin] PostClock(Cpin) if Mode == 1 'LSBPRE repeat Bits +1 Value := (Value >> 1) | (ina[Dpin] << 31) PostClock(Cpin) value >>= (32 - Bits) if Mode == 2 'MSBPOST repeat Bits PreClock(Cpin) Value := (Value << 1) | ina[Dpin] if Mode == 3 'LSBPOST repeat Bits + 1 PreClock(Cpin) Value := (Value >> 1) | (ina[Dpin] << 31) Value >>= (32 - Bits) return Value
PUB PostClock(_Cpin)
waitcnt(cnt+ClockDelay)
!outa[_Cpin]
waitcnt(cnt+ClockDelay)
!outa[_Cpin]
PUB PreClock(_Cpin)
!outa[_Cpin]
waitcnt(cnt+ClockDelay)
!outa[_Cpin]
waitcnt(cnt+ClockDelay)
I would like to do this with this as is prior to learning to do this with the smart pins, not in pasm2 but in spin2 then translate it to pasm2 with a clear understanding of that I am doing.
First application is the sparkfun load cell amp.
https://www.sparkfun.com/products/13879
unfortunately all I get is Arduino libraries. I want to do it from scratch. Only way to learn.
Thanks in advance.
Martin.
P1 was much easier.
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
}}
Comments
What am I missing?
Thanks
In my Spin1 driver for that device I read it with this method
It I were to do a direct translation to Spin2 it would look like this:
Though much faster than Spin1, we can go even faster with SPI using inline assembly -- this is what I did in my P2 driver for the HX711
I haven't worked with this code in a while. When I get time to clean it up and document it, I will remove the locals and replace the longmove with
This will move my configuration variables to cog registers pr0..pr4.
Most important thing you miss: The load cell amp board uses I2C (two wire) and not "serial synchronous" (SPI). So porting this object does not make any sense for that project.
I'm pretty sure there are some JM_... objects for I2C and SPI in the Github-Obex.
If the above code is the version you have ported to Spin2, then you miss for example that the rotate operators have changed:
The compiler will tell you that, and maybe other things you need to change for Spin2. There are threads about the differences of Spin1 and Spin2.
Andy
I have one of those boards, Andy (from a work project a couple years ago) -- it is SPI, even though the board markings might suggest I2C. See the code snippets in my post above.
Oh, my bad. I should have read the description a little more carefully. Just saw that I2C is mentioned, but that is for a different board.
Andy
question?
I basically understand the input suggestion but I am now trying to replecate in spin2 the output.
repeat Bits
outa[Dpin] := (Value <-= 1) & 1 ' output data bit
PostClock(Cpin)
value <<=(32-bits)
repeat 24
outa(dpin) := (value <-= 1) & 1
waitms(10)
!outa(_cpin)
waitms(10)
!outa(_cpin)
as above in the spin1 example. Looking throught the spin2 manual and find nothing.
Any help appreciated.
Thanks in advance.
Martin
Got it.