SPI driver on seperate cog
Otmar
Posts: 7
Hello i have written a simple SPI driver for interfacing a ISD1700 voice recorder chip.
The driver is writte in Spin because i dont need high data rates.
My problem is to get this driver working correctly on a sperate cog.
When i am using the driver from the main cog, everything workes fine -> so the driver generally works
So what i have to change to get the driver working on a seperate cog?
Thanks
Andre
The driver is writte in Spin because i dont need high data rates.
My problem is to get this driver working correctly on a sperate cog.
When i am using the driver from the main cog, everything workes fine -> so the driver generally works
So what i have to change to get the driver working on a seperate cog?
CON baudRate = 10000 VAR byte SPI_MISO byte SPI_MOSI byte SPI_CLK byte SPI_CS byte bitCount byte byteCount byte foo word bitTime PUB start :okay init(20,17,18,19) PUB init(MISO,MOSI,SCK,CS) 'read variables SPI_MISO := MISO SPI_MOSI := MOSI SPI_CLK := SCK SPI_CS := CS 'init port pins DIRA[noparse][[/noparse]SPI_MOSI]~~ 'OUTPUT DIRA[noparse][[/noparse]SPI_CLK]~~ 'OUTPUT DIRA[noparse][[/noparse]SPI_CS]~~ 'OUTPUT DIRA[noparse][[/noparse]SPI_MISO]~ 'INTPUT OUTA[noparse][[/noparse]SPI_CLK]~~ 'set high OUTA[noparse][[/noparse]SPI_CS]~~ 'set high OUTA[noparse][[/noparse]SPI_MOSI]~ 'set_low bitCount := 0 byteCount := 0 bitTime := clkfreq / baudRate OUTA[noparse][[/noparse]SPI_CS]~ tx($01) tx($00) OUTA[noparse][[/noparse]SPI_CS]~~ waitcnt(100000+cnt) OUTA[noparse][[/noparse]SPI_CS]~ tx($65) tx($C0) tx($0C) OUTA[noparse][[/noparse]SPI_CS]~~ repeat while TRUE PUB tx(dataByte) | t ,h ,rx OUTA[noparse][[/noparse]SPI_CLK]~ OUTA[noparse][[/noparse]SPI_MOSI]~ t := cnt repeat h from 0 to 7 OUTA[noparse][[/noparse]SPI_MOSI] := dataByte & $01 'set MOSI pin rx:=INA[noparse][[/noparse]SPI_MISO] << 7 | rx >>1 waitcnt(t += bitTime) !OUTA[noparse][[/noparse]SPI_CLK] dataByte:= dataByte >> 1 waitcnt(t += bitTime) if h <7 !OUTA[noparse][[/noparse]SPI_CLK] return rx
Thanks
Andre
Comments
The main thing that people forget is that each cog has its own I/O registers, so you need to execute the initialization routine in the new cog so the DIRA and OUTA registers get initialized properly. You could do "COGNEW(init(20,17,18,19),@stack)" in your start routine where stack is a minimum of 20 levels. In your init routine, the REPEAT loop would do the actual work after the initialization (and it can be just REPEAT).
There are examples of multicog programs in the Propeller Education Kit tutorials and in the "sticky" threads at the top of the thread list for this forum.