[AVR] Mode2+3 SPI und aktuelle AVRs

Gast #4799063
Lesenswert?
• ▲
▼
Guten Abend,

beim ATTiny84 hab ich festgestellt, dass das ehemalige SPI-Interface zur 
USI umgebaut wurde. Dummerweise kann man die Clock-Polarität jetzt nicht 
mehr ändern, weshalb Mode2+3 weg fallen.

Die Frage die sich mir jetzt stellt: Muss man extern den Clock 
invertieren für Mode2+3-Peripherie wie die 128x64 COG-Displays?

Clock per Software stelle ich mehr unangenehm ineffizient vor ...

Viele Grüße
Blubber1
Gast #4799338
Lesenswert?
• ▲
▼
Blubber1 schrieb:

> beim ATTiny84 hab ich festgestellt, dass das ehemalige SPI-Interface zur
> USI umgebaut wurde.

Das ist Bullshit, der dich als Mann ohne Überblick outet.

Bei den ollen Tinys gab es noch nie ein Hardware-SPI, sondern immer nur 
USI. Wenn es denn überhaupt irgendeine Hardwareunterstützung für 
seriellen Zauber gab, etliche Devices haben nichtmal das USI...

Bei einigen wenigen neueren Tinys ist das allerdings anders. Z.B. ATtiny 
441/841. Die haben nicht nur das klassische Hardware-SPI, was du (wohl 
von den ATmegas) kennst, sondern auch SPI-Master-fähige USARTs, wie es 
sie ebenfalls bei den (neueren) ATmegas gibt. Damit kann man schon was 
anfangen...

> Dummerweise kann man die Clock-Polarität jetzt nicht
> mehr ändern, weshalb Mode2+3 weg fallen.

Du hast das USI und seine Möglichkeiten ganz offensichtlich nicht 
wirklich verstanden. Lies' am besten nochmal das Datenblatt!
Gast #4799558
Lesenswert?
• ▲
▼
c-hater schrieb:
> Bei einigen wenigen neueren Tinys ist das allerdings anders. Z.B. ATtiny
> 441/841. Die haben nicht nur das klassische Hardware-SPI, was du (wohl
> von den ATmegas) kennst, sondern auch SPI-Master-fähige USARTs, wie es
> sie ebenfalls bei den (neueren) ATmegas gibt. Damit kann man schon was
> anfangen...


Naja, sicherlich kann man darüber streiten, was "neuer" heißt, aber ich 
denke, die Mehrheit würde z.B. einen 10 Jahre alten ATmega644P nicht als 
neuer bezeichnen, auch wenn er neuer als ein ATmega8515 ist...
Gast #4799560
Lesenswert?
• ▲
▼
c-hater schrieb:
>> Dummerweise kann man die Clock-Polarität jetzt nicht
>> mehr ändern, weshalb Mode2+3 weg fallen.
>
> Du hast das USI und seine Möglichkeiten ganz offensichtlich nicht
> wirklich verstanden. Lies' am besten nochmal das Datenblatt!

Hab ich ... Es gibt keinen Bit, das äquivalent zu CPOL ist, wie es die 
AVRs mit SPI-Peripherie hatten ...

Über Erleuchtung würde ich mich freuen :)
Gast #4799718
Lesenswert?
• ▲
▼
Blubber1 wrote:
> Das war ein kurzes Lesevergnügen ... Seite 1: "Supports SPI Mode 0 and
> 1"

Vielleicht schaffst Du es ja irgendwann einmal bis Seite 5.
Die Datei avr319.zip enthält im Übrigen ein Codebeispiel.
Gast #4799962
Lesenswert?
• ▲
▼
Pappnase schrieb:
> Vielleicht schaffst Du es ja irgendwann einmal bis Seite 5.
> Die Datei avr319.zip enthält im Übrigen ein Codebeispiel.

Hör bitte auf, meine Zeit damit zu verschwenden ... Auf Seite 5 stehen 
die SPI-Modes, die allgemein bekannt sind - mir auch.

Die USIs des Tinys HABEN KEIN CPOL BIT!

Von Seite 6:"The USI Three-wire mode is compliant with the Serial 
Peripheral Interface (SPI) Mode 0 and 1, "


Wenn du keine Ahnung hast, dann brauchst du auch nicht antworten ...
Gast #4799967
Lesenswert?
• ▲
▼
Auch dein hochgelobtes Code-Beispiel unterstützt nur Mode 0 und 1:
1
/* Test application for the SPI-via-USI-driver. */
2

3
#include "spi_via_usi_driver.c"
4

5

6

7
#define SPIMODE 0  // Sample on leading _rising_ edge, setup on trailing _falling_ edge.
8
//#define SPIMODE 1  // Sample on leading _falling_ edge, setup on trailing _rising_ edge.
9

10

11

12
void main()
13
{
14
  unsigned char val = 0;    // Temp value to send.
15
  DDRB = 0xFF;      // Set PORTB to all output.
16
//  spiX_initmaster(SPIMODE);  // Init SPI driver as master.
17
  spiX_initslave(SPIMODE);  // Init SPI driver as slave.
18
  __enable_interrupt();    // Must do this to make driver work.
19
  do {
20
    spiX_put( val++ );  // Send temp value to SPI and increment,
21
    spiX_wait();    // wait for transmission to finish
22
    PORTB = spiX_get();  // and finally put result on PORTB.
23
  } while(1);      // Loop forever...
24
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren