Forum: Mikrocontroller und Digitale Elektronik USI SPI (AtTiny24V)


von Swen W. (swen_w)


Lesenswert?

Hallo,

ich kriege SPI auf dem AtTiny 24 nicht zum laufen. Ich bin er st in der 
Testphase und habe mir einen c- code aus dem Internet besorgt. Laut 
Datenbankwelt hätte dies schon eine Chance zu funktionieren, geht aber 
leider nicht.
1
#define F_CPU 1000000
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
#define PORT_SPI    PORTA
7
#define DDR_SPI     DDRA
8
#define USI_SCK     PA4
9
#define USI_DO      PA6
10
#define USI_DI      PA5
11
12
int main(void)
13
{
14
  DDR_SPI &= ~(1<<USI_DI);
15
  PORT_SPI |= 1 << USI_DI;
16
17
  // Define the following pins as output
18
  DDR_SPI |= ((1<<USI_DO)|(1<<USI_SCK));
19
  
20
    while (1) 
21
    {
22
    volatile uint8_t result = 0;
23
    uint8_t data = 0b10101010;
24
    USIDR = data;
25
    USISR |= 1 << USIOIF;
26
27
    while ((USISR & (1 << USIOIF)) == 0 ) {
28
      USICR = (1<<USIWM0)|(1<<USICS1)|(1<<USICLK)|(1<<USITC);
29
    }
30
    
31
    result = USIBR;
32
    
33
    volatile int sepp = 0;
34
    }
35
}

Dachte mir wenn ich nun eine Brücke zwischen MOSI und MISO stecke dass 
ich im result den Wert von data habe, bleibt aber auf 0.

Hat jemand einen Tip für mich was ich falsch mache?

Danke!

von Swen W. (swen_w)


Lesenswert?

Ok, Problem gefunden:

Es liegt daran, dass
MOSI = DI auf PA6
MISO = DO auf PA5

liegt.

Das verstehe ich zwar nicht ganz, denn eingentlich ist ja 
MasterOutSlaveIn der Ausgang des Masters, müsste also DataOut sein, ist 
aber als DataIn verschaltet.

Komisch....

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Wenn Du die Beschaltung vom Programmer aus getrachtest, ist MOSI am µC 
der IN, da der µC hier der Slave ist.

MfG

von Swen W. (swen_w)


Lesenswert?

Aha, ja das macht es dann wieder verständlich.

Danke.

von Stefan F. (Gast)


Lesenswert?

> Dachte mir wenn ich nun eine Brücke zwischen MOSI und MISO stecke dass
> ich im result den Wert von data habe, bleibt aber auf 0.

> Es liegt daran, dass
> MOSI = DI auf PA6
> MISO = DO auf PA5

Aber der Brücke ist doch die Signal-Richtung egal! Was war der wirkliche 
Grund für die Fehlfunktion?

von S. Landolt (Gast)


Lesenswert?

> der wirkliche Grund
DDR: In <-> Out?

von Stefan F. (Gast)


Lesenswert?

Soweit ich von AVR's gewohnt bin, spielt das DDR Register keine Rolle, 
sobald für einen I/O Pin eine Special-Function aktiviert ist.

von S. Landolt (Gast)


Lesenswert?

Ehrlich gesagt, ich habe es, entgegen meiner sonstigen Gewohnheit, nicht 
ausprobiert. Aber im Datenblatt steht: "The code example assumes that 
the DO and USCK pins have been enabled as outputs in DDRA."

von c-hater (Gast)


Lesenswert?

Stefan U. schrieb:

> Soweit ich von AVR's gewohnt bin, spielt das DDR Register keine Rolle,
> sobald für einen I/O Pin eine Special-Function aktiviert ist.

Das ist längst nicht bei allen SpecialFunctions so. Das fängt schon bei 
den OCR-Ausgängen der Timer an, die auch bei Aktivierung sehr wohl noch 
der Kontrolle durch das DDR-Register unterliegen.

Und auch im Falle des USI der Tinys ist es nicht so, wie du schreibst, 
ganz sicher jedenfalls nicht im Betrieb als TWI(I2C)-Interface. Der 
Beweis dafür findet sich (wer hätte das gedacht...) im DB, und das auch 
noch genau im zuständigen Abschnitt (was leider nicht immer so ist, 
weswegen ich in diesen Fällen Verständnis für Nichtwissen aufbringe, 
aber eben NUR in diesen Fällen, denn alles andere ist schlicht nur 
eins: Faulheit)...

However: Zitat aus dem entsprechenden Abschnitt des DB für Tiny25..85:

"Note that the Data Direction Register bit must be set to one
for the output to be enabled". (Seite 133)

von Stefan F. (Gast)


Lesenswert?

Danke für den Hinweis bezüglich I2C.

Für SPI Gilt das allerdings nicht. Ich zittiere aus dem Datenblatt des 
ATtiny24 Kapitel 10.2.1:

"MISO: Master Data input, Slave Data output pin for SPI channel. When 
the SPI is enabled as a Master, this pin is configured as an input 
regardless of the setting of DDA5. When the SPI is enabled as a Slave, 
the data direction of this pin is controlled by DDA5."

"MOSI: Master Data output, Slave Data input for SPI channel. When the 
SPI is enabled as a Slave, this pin is configured as an input regardless 
of the setting of DDA6. When the SPI is enabled as a Master, the data 
direction of this pin is controlled by DDA6."

von Stefan F. (Gast)


Lesenswert?

Meine Frage an Swen W, was denn nun der wirkliche Grund für den Fehler 
war, ist noch offen. Es wäre nett, wenn sich der Swen mal dazu äußern 
würde.

Man verschwindet nicht einfach so, sobald man keine Hilfe mehr braucht. 
Zumindest nicht, wenn man demnächst nochmal Hilfe bekommen möchte.

Wir sollten ihm genug Zeit geben, zu antworten.

von Paul H. (powl)


Angehängte Dateien:

Lesenswert?

Der Thread ist zwar schon etwas älter aber ich hatte gerade auch einen 
Moment der Verwirrung mit dem USI bzw. der Terminologie. Ich dachte 
immer d

Stefanus F. schrieb:
> "MISO: Master Data input, Slave Data output pin for SPI channel. [...]"

Allerdings steht im Datenblatt ganz klar, dass MISO der DO = Data Out 
ist, sieht man auch im Schaubild. Daher frage ich mich, was "When the 
SPI is enabled as a Master, this pin is configured as an input 
regardless of the setting of DDA5." zu bedeuten hat. Das stimmt dann 
halt einfach nicht, wenn man mal das Schaubild im Anhang betrachtet, 
welches ich direkt aus dem USI-Kapitel des Datenblatts vom ATtiny24A 
rausgesnapped habe.

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.