SPI og enkelte justeringer

Efter at jeg fik DCC signalet komplet i sidste indlæg har jeg fundet lidt tid til at rode med SPI delen. Derudover har jeg laver et par andre ændringer i kredsløbet, primært for at få sensor output. Jeg tror ikke jeg får brug for alle sensor outputs, men det er surt at stå og mangle et output efter et år eller to, så nu har den fået dem jeg lige kunne komme i tanke om.

Ændringerne er ikke så store, og jeg udelader de skema sider der ikke er ændret. Så nu ser det sådan her ud:

Billede

Den eneste ændring på det overordnede niveau er at BOOSTER_ENABLE i "Command Register" har skiftet navn til COMMAND_VALID og nu udelukkende er ført ind i "Panel and Sensors" hvor den endelige BOOSTER_ENABLE nu genereres. "Panel and Sensors" hed "LedStatusLight" på den tidligere version, men har nu skiftet navn da der er noget mere funktionalitet nu.

Command Buffer

Billede

Her er der tilføjet en counter (74HC590) der er forbundet til SPI bussen så den tæller clock edges - altså antallet af bits. Antallet af bytes får man så ved at dele med 8 - altså ignorere output bits 0-2. Clocken til counterens storage register (CPR) er forbundet direkte til SPI SS (Slave Select) - så den flytter resultatet af counteren ind i output registret når SS signalet afsluttes. Master Reset Counter (MRC) er forbundet til den inverterede SPI SS - så master reset vil altid være aktiv når SPI enheden ikke er aktiv - derved sikrer jeg at jeg altid får counteren resat når en ny kommando startes. Forbindelsen fra Ripple Counter Out (RCO) går lav når counteren "løber over". Derved bliver Count Enable høj og counteren stopper. Da counteren løber over efter 32 bytes forhinder dette at for eksempel 36 bytes tælles som 4 (32 + 4 = 36). Istedet vil counteren angive en 0 bytes kommando der deaktiverer min booster.

Ved at kombinere bit 6 og 7 med et OR gate kan jeg detekterer hvis der er modtaget 8-31 bytes og også deaktivere boosteren i dette tilfælde. Jeg rodede med at inkludere output bits 0-2 i resultatet - så ville jeg også detektere hvis der blev send en "halv" kommando. Det virkede fint men kræver en ekstra 74HC32 (eller noget med en 4-input NOR gate). Det var vældig smart med planer om at min LED ville lyse rødt hvis den fik et "uheldigt" input - men jeg har besluttet mig for at undlade det nu. Der er nok at rode med. Det har altid været planen at kredsløbet skal acceptere en 0, 1, eller 2 byte "kommando" som disable - dette ville gøre det muligt at have et read-only SPI device med 16 inputs på samme SPI SS pin da dette device er "write-only" . For eksempel med status input fra boosterne. Sikkert ikke noget jeg vil bruge, men nu er muligheden der.

Jeg fik rodet nogle pins sammen da jeg sad og fedtede med mit breadboard, så counter clocken var forbundet til SPI MOSI ved et uheld. Så jeg talte hvor mange kange mit output skiftede fra 0-1. Det tog lige et par minutter eller to at finde ud af hvor det underlige resultat kom fra, men ellers virkede det i første forsøg.

Jeg har kun et enkelt input shift register på mit breadboard - hvis det virker med 1, så virker det jo nok også med 6. Der blev ikke ændret noget i kredsløbet for shift registrerne.

Billede

Her er der tilføjet en "Master Switch" der overrider "booster enable". Jeg ved ikke om jeg får brug for den - jeg ender nok med kun at have én booster med sin egen kontakt, men nu er muligheden der - sætter jeg ingen kontakt i skal de to pins bare forbindes direkte. Der er et tilsvarende sensor output så computeren kan finde ud af at alle boostere er slået fra. Der er også sensor output for "COMMAND_VALID" der går høj hvis kommandoen ikke er 3-6 bytes lang. Det burde computeren allerede vide da den selv har sendt kommandoen - så næppe noget jeg for brug for... men man ved jo aldrig. Endelig er der sensor output for BOOSTER_ENABLE - ikke direkte nødvendigt da det kan udledes fra de andre to sensor output, men det skal alligevel bruges til at sende til boosterne, så det kræver kun et enkelt stik at tilføje en sensor.

Alle sensor output går igennem en transistor så de let kan drive en optocoupler hvis der bliver brug for det. Jeg kunne sagtens nøjes med en BC557 eller lignende, men nu har jeg nogle BC327-40 og de koster næsten det samme... så nu kan mine sensor output trække 500mA istedet for 100mA. Bare fordi....

Booster Connectors

 Billede

Ud over at køre DCC output ud gennem en transistor så det også let kan trække en optocoupler eller 10 har jeg brugt den sidste gate på min 74HC4053 til at sikre at mit output til boosteren altid vil være lavt hvis boosteren ikke er enabled. Så kan en booster der aktiverer når den ser "DCC lignende" signaler også bruges.

BOOSTER_ENABLE er allerede drevet af en transistor, så det kan sendes direkte til boosteren.

Så, nu må jeg igang med at lære om PCB design....

 

 

 

 

__________________

mvh
Lars M

Er så småt ved at begynde at pille i skala n, epoke III, DB.

Like 0 kan lide
Top