Seriel data input på en CC1070

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
opatagio
Inlägg: 236
Blev medlem: 24 maj 2005, 20:19:21

Seriel data input på en CC1070

Inlägg av opatagio »

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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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...
opatagio
Inlägg: 236
Blev medlem: 24 maj 2005, 20:19:21

Inlägg av opatagio »

Precis. Det som jag egentligen inte har klurat ut är hur man skiftar ut en byte. Att den ska skifta ut byten när det kommer en klocksignal på en I/O port är inga problem Det är snarare vilken metod man kan använda mjukarumässigt sett.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

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...
Matte
Inlägg: 218
Blev medlem: 4 april 2007, 19:54:17
Ort: Stockholm

Inlägg av Matte »

mjukvarumässigt sätt skulle jag göra precis som sodjan tänk dock på när du ska lägga ut data och när du ska toggla clockan. e ingen expert på pic men du har inte tillgång till två spi interface :) du kan juh kasta in n mux oxå men om du bara ska skicka ibland o långsamt så kör me mjukvara ist.
opatagio
Inlägg: 236
Blev medlem: 24 maj 2005, 20:19:21

Inlägg av opatagio »

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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Eftersom du tänker i stort sett som jag så kan det ju inte vara helt åt skogen... :-)
Matte
Inlägg: 218
Blev medlem: 4 april 2007, 19:54:17
Ort: Stockholm

Inlägg av Matte »

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.
Skriv svar