Seriel data input på en CC1070
Seriel data input på en CC1070
Tjenare
Som rubriken säger så har jag lite problem (eller snarare förvirrat bort mig själv) angående en CC1070 RF Transmitter. Den har stöd för SPI (4-wire) men dessa används för programmeringen av 1070 kretsen och själva data-överförningen i "transmit mode" ska, som jag uppfattat det, ske via ett I/O ben på MCU utöver de som används i SPI. Sedan ska även datan från detta I/O ben klockas med 1070 kretsens egna klockpulser (DCLK-pinnen). Det jag inte förstår är hur man ska föra över serialla datan med ett I/O ben från MCU samt hur denne ska tolka klockpulserna som kommer från 1070 och sedan se till att alla "timings" blir rätt.
På sidan 12 och 13 i CC1070 databladet kan man se vilka pinnar som används till vad. Sedan på sidan 17 i samma datablad står det hur det är tänkt att kopplas mot en MCU. Den biten som jag inte riktigt förstår.
Hastighet är inte det allra väsentligaste i mitt fall, då jag ämnar sända data ungefär var 5-10 minut till mottagaren.
MCU ifråga är en PIC 16F690 med EUSART och SPI (SSP) stöd. Datablad finns här http://ww1.microchip.com/downloads/en/D ... 41262D.pdf
RF sändarkrets jag tänkt använda är TI CC1070. Datablad finns här http://focus.ti.com/lit/ds/symlink/cc1070.pdf
Som rubriken säger så har jag lite problem (eller snarare förvirrat bort mig själv) angående en CC1070 RF Transmitter. Den har stöd för SPI (4-wire) men dessa används för programmeringen av 1070 kretsen och själva data-överförningen i "transmit mode" ska, som jag uppfattat det, ske via ett I/O ben på MCU utöver de som används i SPI. Sedan ska även datan från detta I/O ben klockas med 1070 kretsens egna klockpulser (DCLK-pinnen). Det jag inte förstår är hur man ska föra över serialla datan med ett I/O ben från MCU samt hur denne ska tolka klockpulserna som kommer från 1070 och sedan se till att alla "timings" blir rätt.
På sidan 12 och 13 i CC1070 databladet kan man se vilka pinnar som används till vad. Sedan på sidan 17 i samma datablad står det hur det är tänkt att kopplas mot en MCU. Den biten som jag inte riktigt förstår.
Hastighet är inte det allra väsentligaste i mitt fall, då jag ämnar sända data ungefär var 5-10 minut till mottagaren.
MCU ifråga är en PIC 16F690 med EUSART och SPI (SSP) stöd. Datablad finns här http://ww1.microchip.com/downloads/en/D ... 41262D.pdf
RF sändarkrets jag tänkt använda är TI CC1070. Datablad finns här http://focus.ti.com/lit/ds/symlink/cc1070.pdf
Du får tydligen en "klocka" från kretsen. Denna får du använda
i koden för att lägga ut bitar tillbaka till kretsen. Om du vill köra
pollat eller med interrupt beror mer på hur resten av din applikation ser ut.
Eller så finns det tydligen en "transparent UART mode" som inte använder
klocksignalen alls...
i koden för att lägga ut bitar tillbaka till kretsen. Om du vill köra
pollat eller med interrupt beror mer på hur resten av din applikation ser ut.
Eller så finns det tydligen en "transparent UART mode" som inte använder
klocksignalen alls...
Du har "värdet" som en byte i ett register.
Varje gång det kommer en "klocksignal" så gör du en "rotate with carry"
(åt ena eller det andra hållet beroende på i vilken ordning, LSB eller MSB
först, som modulen vill hs dom). Berende på C-flaggan så antingen sätter
eller clearar du data-pinnen. Piece of cake...
Komplettera med räknare och eventuelt några flaggor för att hålla
reda på hur många bitar du har shiftat ut och vad du håller på med
överhuvudtaget...
Varje gång det kommer en "klocksignal" så gör du en "rotate with carry"
(åt ena eller det andra hållet beroende på i vilken ordning, LSB eller MSB
först, som modulen vill hs dom). Berende på C-flaggan så antingen sätter
eller clearar du data-pinnen. Piece of cake...
Komplettera med räknare och eventuelt några flaggor för att hålla
reda på hur många bitar du har shiftat ut och vad du håller på med
överhuvudtaget...
Har tyvärr inte 2 SPI lösningar på 16F690. Så det får bli mjukvarumässigt. Kommer köra så att jag roterar ut en bit åt vänster som sodjan föreslog (vänster eller höger beroende på cc1070 givetvis) sedan kollar jag när klockpulsen blir hög och sätter TX pinnen på MCU hög eller låg beroende på Carry-flaggan. Lade med en räknare så loopen avslutas efter alla 8 bitarna är skickade. Kommer dock på mottagar-MCUn att köra dennes RX pinne som interrupt. Så jag måste börja med en start bit från TX MCUn så RX MCU förstår när data är på väg för att sedan där börja skifta in datan.
Rätta mig gärna om jag tänker fel eller min logik är helt åt skogen.
Rätta mig gärna om jag tänker fel eller min logik är helt åt skogen.
tog mig lite tid att kolla i data bladet och ny data läses in på possitiv clock flank alltså måste du lägga ut ny data på negativ flank.
din motagnings strategi kommer inte att fungera då ettor och nollor kommer att inträffa helt slumpmässigt då man inte sänder. det går heller inte bara att skicka data du måste ha ett protokoll för kommunikation samt hur bitarna skall se ut i luften.
härär ett förslag på ett protokoll
PREAMBLE = 0101010101.....typ 32 bitar för att synka sändare och mottagare, andvänder du NRZ kodning måste troligen PLL låsas innan preambln slutar.
NÄTVERKSADRSS, typ 16bitar med ett unikt kodord för ditt nätverk sedock till att sista biten på pramble måste vara samma som första biten i Nätverksadrssen för att motagaren skall veta att prambelen är slut. Detta är för att din motagarde inte skall ragera på alla sändare på samma freqvens band.
nästa fält bör vara Length där du kan ange hur långt paketet eller så andvändr du alltid en konstant längd.
nu kan du kasta in data + src,dest adress osv.
avsluta paktet med ett CRC fält för att detektera evetuella trasiga bitar i paketet.
jag vet att i databladet för CC1110 finns exempl och förklaringar på protokoll.
ett tips kan vara att köra manchester koding så slipper du låsa PLL du får halva hastigheten men slipper n massa strul.
I mottagaren får du sätta ett interupt på klockan och sen leta efter 25bitar korrekt preamble får du låsa PLL(NRZ) och sen då du får två lika bitar kan du gissa att preambelen är slut och nätverksadressen har börjat.
tänk oxå på att det är CC chippet som sändr klockan både i TX och RX.
din motagnings strategi kommer inte att fungera då ettor och nollor kommer att inträffa helt slumpmässigt då man inte sänder. det går heller inte bara att skicka data du måste ha ett protokoll för kommunikation samt hur bitarna skall se ut i luften.
härär ett förslag på ett protokoll
PREAMBLE = 0101010101.....typ 32 bitar för att synka sändare och mottagare, andvänder du NRZ kodning måste troligen PLL låsas innan preambln slutar.
NÄTVERKSADRSS, typ 16bitar med ett unikt kodord för ditt nätverk sedock till att sista biten på pramble måste vara samma som första biten i Nätverksadrssen för att motagaren skall veta att prambelen är slut. Detta är för att din motagarde inte skall ragera på alla sändare på samma freqvens band.
nästa fält bör vara Length där du kan ange hur långt paketet eller så andvändr du alltid en konstant längd.
nu kan du kasta in data + src,dest adress osv.
avsluta paktet med ett CRC fält för att detektera evetuella trasiga bitar i paketet.
jag vet att i databladet för CC1110 finns exempl och förklaringar på protokoll.
ett tips kan vara att köra manchester koding så slipper du låsa PLL du får halva hastigheten men slipper n massa strul.
I mottagaren får du sätta ett interupt på klockan och sen leta efter 25bitar korrekt preamble får du låsa PLL(NRZ) och sen då du får två lika bitar kan du gissa att preambelen är slut och nätverksadressen har börjat.
tänk oxå på att det är CC chippet som sändr klockan både i TX och RX.