Forum: Mikrocontroller und Digitale Elektronik SI4713 über SPI mit einem Atmega


von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Hallo

wir arbeiten an einem UKW Radiosender. Das ganze ist ein Schulprojekt.

Wir haben ein SI4713 Modul von Adafruit gekauft und wollen es über SPI 
ansteuern, leider funktioniet es nicht ganz.

Die Initialisierung passt und wir bekommen auch das Statusbyte 
zurückgesendet, leider ist das auch alles. Wir bekommen weder eine 
andere Antwort noch wird etwas ausgesendet(Radio).

Im Anhang der Code.

Wir sind echt ratlos, da wir alles machen was im Datenblatt beschrieben 
ist.

Ich hoffe jemand kann einen Fehler erkennen.

Mfg Sebastian.

von Tuxpilot (Gast)


Lesenswert?

Ich denke, weitere Informationen wären recht nützlich. Z. B.:

Welcher ATmega, welcher Schaltplan (inkl. Stromversorgung), was steht in 
si4713.h, was steht in spi_init(), wo ist spi_init(), woran erkennt ihr, 
dass ihr das Statusbyte bekommt?

Es scheint in eurem Code nichts zu geben, was eine Rückmeldung erzeugt, 
wie ein UART, welches Debugging-Meldungen ausgibt.

von Purzel H. (hacky)


Lesenswert?

Die Debug Konzepte scheinen noch nicht so fortgeschritten zu sein ... 
ist da irgend etwas in dieser Richtung geplant ?

Naja, weil - tut nicht - ist etwas wenig.

von Rudolph (Gast)


Lesenswert?

Wo ist denn der Part der den SI4713 überhaupt erst in den SPI-Modus 
bringt?
Vollständig darf das schon sein wenn Hilfe erwartet wird, in dem 
Code-Schnipsel werden ja nicht mal die Pins für den Chip initialisiert.

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Hier der komplette Code.

Tuxpilot schrieb:
> woran erkennt ihr,
> dass ihr das Statusbyte bekommt?

mit dem Logic Analyzer (Analog Discovery) überprüft.

Tuxpilot schrieb:
> Welcher ATmega, welcher Schaltplan (inkl. Stromversorgung),

Atmega16. Momentan wird ein Arduinoähnliches Board von unserer Schule 
verwendet. Mit Kabeln wird es mit dem Modul von Adafruit verbunden.

Es wird über USB mit Strom versorgt.  (Schaltplan des Boards mit Atmega 
im Anhang)

Rudolph schrieb:
> Wo ist denn der Part der den SI4713 überhaupt erst in den SPI-Modus
> bringt?

Reicht es nicht wenn man den Pin GP02 auf HIGH legt? (siehe Anhang)

von Andreas M. (amesser)


Lesenswert?

Ich kann nicht erkennen wo Ihr das #SEN Signal korrekt bedient wie im 
Manual gefordert.

von Sebastian (Gast)


Lesenswert?

Andreas M. schrieb:
> Ich kann nicht erkennen wo Ihr das #SEN Signal korrekt bedient wie im
> Manual gefordert.

Mit ENABLE_SI4713; wird SEN ausgewählt.

wir haben zuerst nach jedem Command+Argumente-Block den IC ausgewählt 
und abgewählt. (so wie es im Datenblatt steht) Dies funktionierte jedoch 
nicht (Keine Antwort vom IC)

von Purzel H. (hacky)


Lesenswert?

und das
 si4713_receive_resp() ?

(sorry habe das zip nicht angeschaut).

von Rudolph (Gast)


Lesenswert?

Sebastian schrieb:
>> Wo ist denn der Part der den SI4713 überhaupt erst in den SPI-Modus
>> bringt?
>
> Reicht es nicht wenn man den Pin GP02 auf HIGH legt? (siehe Anhang)

Vielleicht. GP02 hat einen internen Pulldown, zumindest steht das im 
Schaltplan von Adafruit als Hinweis.
/RST würde ich aber vielleicht auch bedienen und nicht einfach auf 5V 
klemmen.

Apropos Schaltplan, da fällt auf, dass Adafruit da so einen hässlichen 
FET Level-Shifter verbaut hat auf den I2C Leitungen.
Und zwar recht hochohmig.
Ihr habt den SPI auf 750kHz eingestellt, das könnte etwas viel sein.

von Andreas M. (amesser)


Lesenswert?

Sebastian schrieb:
> Andreas M. schrieb:
>> Ich kann nicht erkennen wo Ihr das #SEN Signal korrekt bedient wie im
>> Manual gefordert.
>
> Mit ENABLE_SI4713; wird SEN ausgewählt.
>
> wir haben zuerst nach jedem Command+Argumente-Block den IC ausgewählt
> und abgewählt. (so wie es im Datenblatt steht) Dies funktionierte jedoch
> nicht (Keine Antwort vom IC)

Ihr habt dann hoffentlich bevor ihr die "Respons" auslest den Chip auch 
wieder angewählt? Sequenz wäre meiner Meinung wie folgt:

# command senden
1) #sen auf Low
2) control byte + command byte + 7 byte args
3) #sen auf High

# status lesen
4) #sen auf Low
5) control byte + 1 dummy byte (read)
6) #sen auf high

# 4 -6 solange wiederholen bis ready

7) #sen auf low
8) # control byte + 16 dummy bytes (read)
9) #sen auf high

: Bearbeitet durch User
von Lukas (Gast)


Lesenswert?

Wir haben jetzt das SEN jedesmal auf Low und wieder auf High gesetzt, 
wie du es vorgeschlagen hast. Das si4713 schickt immernoch jedesmal als 
Antwort 0x80 und bei den Response-Bytes schickt es nur 0x00 zurück.

von Andreas M. (amesser)


Lesenswert?

Lukas schrieb:
> Wir haben jetzt das SEN jedesmal auf Low und wieder auf High gesetzt,
> wie du es vorgeschlagen hast. Das si4713 schickt immernoch jedesmal als
> Antwort 0x80 und bei den Response-Bytes schickt es nur 0x00 zurück.

Ok nur um noch mal sicher zu sein:

zum lesen des Status Bytes macht Ihr folgendes:

1) #sen auf low
2) Sendes des Control Bytes "0xA0" an den Si
3) Senden eines Dummy bytes an den SI um die Status Antwort zu bekommen
4) #sen auf high

Danach dann zum auslesen der response:

5) #sen auf low
6) Sendes des Control Bytes "0xE0" an den Si
7) Senden von 16 dummy bytes an den SI um die response zu bekommen
8) #sen auf high

In eurem code oben kann ich nur sehen, dass Ihr 1-4 macht, nie jedoch 
5-8. Und die Antwort 0x80 auf 1-4 wäre ja nicht so falsch. Denn Status 
"0x80" bedeutet ja das der Si Bereit zum Empfang des nächsten Kommandos 
ist und kein Fehler beim letzten Kommando aufgetreten ist.

Bei welchem Kommando erwartet Ihr denn Response Daten?

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.