Forum: Mikrocontroller und Digitale Elektronik SPI-Daten zerhacken


von Klaus Bröntgen (Gast)


Lesenswert?

hallo,

folgendes Problem steht im Raum:

für ein Meßgerät habe ich eine Wandlerplatine gebaut, die eine
CCD-Zeile ausliest und die einzelnen Pixel 12bit-A/D-wandelt (das muß
so). Der Wandler hat als Ausgang eine SPI-Schnittstelle.
Jetzt würde ich die Platine gerne mal testen. Da aber erstens das
Controllerboard noch nicht fertig existiert und zweitens ein 32Bit SAM7
drauf sein wird, den ich drittens (noch) nicht programmieren kann/will
(stolper ja gerade mal durch die 8bit-AVR-Welt), suche ich jetzt eine
Möglichkeit, das ganze mit einem AVR zu verbinden. Dieser kann ja nun
von Haus aus nur 8bit verwalten. Sieht jemand eine Möglichkeit, wie ich
die oberen 4 Bit entsorgen kann? Da ein Spektrum ausgewertet wird (sieht
aus wie ein Kamm-Muster), kann ich den Verlust der absoluten Spannung
verkraften, bräuchte aber dringend die unteren 8 Bit, um die Helligkeit
um den Peak herum genau erfassen zu können. Ob man die SPI-Daten
irgendwie in eins der Registerpaare X,Y,Z umleiten kann? Oder
vielleicht "laufen" die ersten 4 Bit (MSB kommt zuerst) ja auch
"über" und es bleiben eh nur 8 stehen? Achneh, vermutlich nicht, denn
nach dem 5.Bit macht der AVR ja das ChipSelect wieder aus und der
Wandler hört auf zu senden.....
Oder mit Timern/Hardware die "Datenannahme" um 4 Bit verzögern...?
Ist mein erster Kontakt zu SPI, wenn jemandem was einfällt, wäre ich
recht dankbar.....

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Wenn die Datenrate nicht zu hoch ist, könntest Du auch eine
"Software-SPI"-Schnittstelle verwenden, bei der ist die übertragene
Wortlänge unbegrenzt.

von Klaus Bröntgen (Gast)


Lesenswert?

da heißen will? SPI "künstlich" selber erzeugen oder wie muß ich mir
das vorstellen? Also Portpins als Clk,CS und MISO verwenden und die
ganzen "Formalitäten" in Eigenregie abhandeln?

von Mike (Gast)


Lesenswert?

Schau dir mal von Ulrich Radig die MMC-Library an, dort hat man die Wahl
zwischen Hard- und Soft-SPI. Es sollte sich prima abkupfern lassen.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

@Klaus: Genau so ist's gemeint.

von Klaus Bröntgen (Gast)


Lesenswert?

nun gut. also ist handwerk gefragt. werd mal sehen, was das wird.....

von Klaus Bröntgen (Gast)


Lesenswert?

@Mike:
arrrgh! C! das wird nichts mit kupfern.......

von Tobias S. (tobias)


Lesenswert?

Willst du uns etwa erzaehlen, dass du spaeter mit dem SAM7 ein Spektrum
auswerten willst und nochnichtmal c kannst?

Gruss Tobias

von Stefan Kleinwort (Gast)


Lesenswert?

Kann mir kaum vorstellen, dass es noch AD-Wandler gibt, die EXAKT 12
SPI-Pulse brauchen. Viel wahrscheinlicher ist, dass es mit 16 Pulsen (2
* SPI nacheinander lesen/schreiben) genauso geht.

Aber dazu sollte man mal wieder mehr Infos haben ...

Gruß, Stefan

von Klaus Bröntgen (Gast)


Lesenswert?

so in etwa. muß ich auch nicht.
1) soll ich die schaltung bzw. das controllerboard entwickeln
1b) ich studiere e-technik, nicht informatik!
2) ist es nicht meine aufgabe, das "endprogramm" zu schreiben; dafür
gibts hier einen spezialisten
3) programmiert dieser ebenfalls in assembler und NICHT in C! die
bisher eingesetzte lösung verwendet einen shark-dsp, ebenfalls in
assembler programmiert.
4) ist es mein ziel, "nebenbei" ein wenig programmierung abzufassen
und hier und da eine testroutine zu schreiben.mir reicht es zb. die
eingegangenen werte einzugrenzen und die lage der peaks grob
festzustellen, um zu sehen, was sich tut. ein gauss-fitting oder ein
center-of-gravity werde ich NICHT drüberhetzen, dafür bin ich zu blöd!

wenn man kein c kann, is das für dich sowas wie analphabetismus?
ich sehe das eher andersrum.

von Klaus Bröntgen (Gast)


Lesenswert?

@stefan:
Stimmt, exakt 12 Pulse kriegt er nicht. Man kann ihn mit 14 oder 16
clocks bedienen und der Wandler (AD7274) hängt dann noch
führende/schließende Nullen an. Während dieser Periode muß das CS aber
unten bleiben, sonst wird der Transfer abgewürgt und mit neuem CS eine
neue Wandlung ausgelöst. Also 2x8bit lesen wird nichts. Oder habe ich
Dich da falsch verstanden?

von Stefan Kleinwort (Gast)


Lesenswert?

Bei den meisten SPI-Implementierungen ist kein CS-Pin mit dabei. Den
machst Du "von Hand" mit einem normalen IO-Pin (so ist es beim
ATmega). Beim ARM (welcher?) kann das anders sein, glaube ich aber
nicht. Wenn das CS vom SPI-System mit erzeugt wird, dann ist meistens
auch die Wortbreite irgendwo einstellbar.

Gruß, Stefan

von Klaus Bröntgen (Gast)


Lesenswert?

jo, beim arm (atmel sam7x256) ist der CS ein "fester" pin. es gibt
zwei spi-ports (0 und 1) mit je 4 chipselects.Werden zwar mit all den
anderen gemuxt, haben aber eben genau diese aufgabe. Ich verstehe das
so, daß ich mein SPI in Betrieb nehme und dem I/O-controller sage, wo
er mir den CS ausgeben möchte (gibt jeweils 1-2 Möglichkeiten, da man
unterschiedliche Peripherien gleichzeitig benutzen können muß).
Ja, die Wortbreite kann man auch einstellen.
Aber darum gehts ja (vorerst) noch nicht, da ich ja vom arm erstmal die
finger lasse.
Am AVR scheint mir aber die gleiche Philosophie verwirklicht. Im
Datenblatt (Mega8535) steht auch, daß die portbins B dafür verwendet
werden. Sprich der I/O-Controller zappelt mit den pins, um die
schnittstelle zu betreiben. Und wenn ich das nicht will, muß ich wohl
alles von Hand machen....

von Stefan Kleinwort (Gast)


Lesenswert?

Im Manual 29.7.9: Chip select register

Die Bitanzahl pro Transfer ist beim SAM7S zwischen 8 und 16 Bits
einstellbar.

>Am AVR scheint mir aber die gleiche Philosophie verwirklicht. Im
>Datenblatt (Mega8535) steht auch, daß die portbins B dafür verwendet
>werden. Sprich der I/O-Controller zappelt mit den pins, um die
>schnittstelle zu betreiben. Und wenn ich das nicht will, muß ich wohl
>alles von Hand machen....

Wäre mir neu, dass ein ATmega eine CS-Leitung im Master-Mode selbst
bedient. Ich kenne das Manual des 8535 aber nicht. Von Hand machen ist
gut: wo ist das Problem: vor und nach dem Transfer jeweils den CS zu
bedienen?

Gruß, Stefan

von Klaus Bröntgen (Gast)


Lesenswert?

>Die Bitanzahl pro Transfer ist beim SAM7S zwischen 8 und 16 Bits
>einstellbar.

hab ich doch gesagt:
<selbstzitat>
>Ja, die Wortbreite kann man auch einstellen.
<\selbstzitat>
übrigens sprach ich vom sam7x, aber der unterschied ist so groß
nicht...

>Wäre mir neu, dass ein ATmega eine CS-Leitung im Master-Mode selbst
>bedient.
wer außer dem master soll denn dann das chip select bedienen?
vielleicht habe ich spi ja falsch verstanden, aber irgendwer sollte
schon den hut aufhaben, oder?

>gut: wo ist das Problem: vor und nach dem Transfer jeweils den CS zu
>bedienen?
ich sprach von keinem problem.

von Rahul D. (rahul)


Lesenswert?

Grundsätzlich sieht die SPI-Übertragung doch so aus, dass der Master
(Mikrocontroller) dem Slave (AD-Wandler) solange den Takt zur Verfügung
stellt, bis dieser fertig mit seiner Übertragung ist.
Wenn der ADC also im 16Bit Modus arbeitet, kann man die Hardware-SPI
problemlos benutzen (ich habe mir das Datenblatt jetzt nicht komplett
angetan); im 14Bit-Modus muß man etwas basteln...
Prinzipiell sollte man aber wohl eher die oberen 8 Bit benutzen, da es
bei den unteren IMHO Rauscheffekte geben kann...

von Hauke Sattler (Gast)


Lesenswert?

Die üblichen AVR (Mega8-Mega128) haben KEINEN Hardware CS.
Wie das mit den neuen 20 MHz Typen ist weiß ich nicht.
Aber so oder so, es macht kein Problem, man muß den Hardware CS ja
nicht benutzen.

Beispiel:


ldi r17,$80
out DDR_SPI,r17    ; Set SCK output, all others input

ldi r17,(1<<SPE)|(1<<MSTR)|(1<<SPR0)
out SPCR,r17       ; Enable SPI, Master, set clock rate fck/16
(initialisierung des HW-SPI laut atmel)

cbi PORTB,0
sbi DDRB,0         ;SoftwareCS auf low setzen

clr r16            ;Arbeitsregister leeren
out SPDR,r16       ;SPI Übertragung starten

Warte_auf_byte1:
sbis SPSR,SPIF
   rjmp Warte_auf_byte1

in r17,SPDR        ;1. empfangenes Byte holen
out SPDR,r16       ;SPI Übertragung starten(erneut)

Warte_auf_byte2:
sbis SPSR,SPIF
   rjmp Warte_auf_byte2

in r16,SPDR         ;2. empfangenes Byte holen

sbi PORTB,0         ;SoftwareCS auf high setzen

.exit


Damit sollte dann das ergebniss in register 16 und 17 landen

cu
Hauke

von Klaus Bröntgen (Gast)


Lesenswert?

jo, das schaut schonmal gut aus, danke!
das mit dem hardware-cs nehme ich zurück, hab mich da mittlerweile
belesen und gebe euch recht.verwunderlich finde ich es dennoch, obwohl
mir es ja entgegen kommt....

werde das mal durchexerzieren. aber zuerst wird mal mein
stk-extension-board um einen wandler erweitert, damit das ganze auch
sinn macht.....

muß mir noch nen algorithmus basteln, mit dem ich die datenflut im
voraus filtern kann (2088 pixelwerte passen wohl nicht in den ram).
also ein paar pixeladressen festlegen und nur deren werte aus dem
datenstrom holen. sollte aber mit einem counter am ccd-clock irgendwie
machbar sein.

vielen dank soweit, ich halte euch (bei bedarf) auf dem laufenden...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.