Forum: Mikrocontroller und Digitale Elektronik variable Bitbreite für SPI-Bus


von Hannes Jenschka (Gast)


Lesenswert?

Ich hab ein Problem mit der Funktion SPI->format().

Verwendeter Mikrocontroller: Nucleo F411RE


Funktionsbeschreibung:
1
void format   
2
(   int    bits,
3
        int    mode = 0 
4
)     
5
6
Configure the data transmission format.
7
8
Parameters:
9
    bits  Number of bits per SPI frame (4 - 16)
10
    mode  Clock polarity and phase mode (0 - 3)
11
12
  
13
14
mode | POL PHA
15
-----+--------
16
  0  |  0   0
17
  1  |  0   1
18
  2  |  1   0
19
  3  |  1   1




Das Beispielprogramm:

1
#include "mbed.h"
2
 
3
SPI device(SPI_MOSI, SPI_MISO, SPI_SCK);
4
 
5
int main() {
6
    int i = 0;
7
    int j = 0;
8
    device.frequency(10);
9
    device.format (12,0);
10
    while(1) {
11
        for (j=0; j<100; j++)
12
        {
13
            device.write(3);
14
            wait_us(100000);
15
16
        }
17
    }
18
}

Ich habe die Funktion .format so verstanden, dass ich mit "bits" angeben 
kann, wie viel Bit pro Lese/Schreibzyklus übertragen werden sollen. Ich 
kann den Paramter zw. 4-16 einstellen, Std. ist 8.

Ich habe mein Oszi an SCLK und an MOSI hängen. SCLK bringt konstant 8 
Signale. Das hätte ich ja verstanden, wenn die Anzahl von Bits auch 8 
ist. Verändere ich aber die Anzahl, dann verändert sich nicht das Bild 
im Oszi. Normalerweise müssten die Impulse bei SCLK doch entsprechend 
länger oder kürzer werden, aber es bleibt stur bei 8bit und das verstehe 
ich nicht.

von Franz F. (franzman)


Lesenswert?

Hannes Jenschka schrieb:
> void format
> (   int    bits,
>         int    mode = 0
> )

Das was du uns zeigst ist aber nicht die komplette Funktion, falls du 
der Meinung bist das dieser Teil die Bitanzahl beim SPI änder sollte.

Entweder du postest den gesamten code, falls es dein gesamter code ist, 
solltest du dein Programm mal grundsätzlich überarbeiten.

von Hannes Jenschka (Gast)


Lesenswert?

Franz F. schrieb:
> Das was du uns zeigst ist aber nicht die komplette Funktion, falls du
> der Meinung bist das dieser Teil die Bitanzahl beim SPI änder sollte


Doch, das ist das gesamte Programm:

Hannes Jenschka schrieb:
> #include "mbed.h"
>
> SPI device(SPI_MOSI, SPI_MISO, SPI_SCK);
>
> int main() {
>     int i = 0;
>     int j = 0;
>     device.frequency(10);
>     device.format (12,0);
>     while(1) {
>         for (j=0; j<100; j++)
>         {
>             device.write(3);
>             wait_us(100000);
>
>         }
>     }
> }


Aus mehr Quelltext besteht das Programm nicht. Dieses hier:

Hannes Jenschka schrieb:
> Funktionsbeschreibung:void format
> (   int    bits,
>         int    mode = 0
> )
>
> Configure the data transmission format.

ist eine Funktionsbeschreibung aus der Funktion device.format(..)

Franz F. schrieb:
> Entweder du postest den gesamten code,

Das ist der gesamte Code

Franz F. schrieb:
> falls es dein gesamter code ist,
> solltest du dein Programm mal grundsätzlich überarbeiten.

Was soll ich denn an dem Programm "grundsätzlich" überarbeiten? Muss die 
SPI-Schnittstelle an einer anderen Stelle initialisiert werden?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und wo ist der Quelltext dieser "format"-Funktion?

von Purzel H. (hacky)


Lesenswert?

Was auch immer dieser Controller ist und kann... SPI ist in der Regel 
mit 8 Bit aufs mal.
Es kann durchaus vorkommen, dass das Hardware SPI nicht das kann, was 
das Datenblatt verlangt.

von Hannes Jenschka (Gast)


Lesenswert?

Rufus Τ. Firefly schrieb:
> Und wo ist der Quelltext dieser "format"-Funktion?

Keine Ahnung, wo der genau steckt. Wahrscheinlich in einer der 
Headerdateien, die automatisch mit eingebunden werden.

Das Problem ist auch, dass es schon fertige .o-Dateien sind - also schon 
vorcompiliert und nur noch später zusammengelinkt werden.

Hier ist auch noch mal ein Beispiel aus dem Internet:

http://developer.mbed.org/handbook/SPI
1
#include "mbed.h"
2
 
3
SPI spi(p5, p6, p7); // mosi, miso, sclk
4
DigitalOut cs(p8);
5
 
6
int main() {
7
    // Chip must be deselected
8
    cs = 1;
9
 
10
    // Setup the spi for 8 bit data, high steady state clock,
11
    // second edge capture, with a 1MHz clock rate
12
    spi.format(8,3);
13
    spi.frequency(1000000);
14
15
...

Dort wird auch mit .format(8,3) gesagt, dass es 8bit breit sein soll. 
Ich will aber 12bit haben, was ja auch laut Definition:

Hannes Jenschka schrieb:
> void format
> (   int    bits,
>         int    mode = 0
> )
>
> Configure the data transmission format.
>
> Parameters:
>     bits  Number of bits per SPI frame (4 - 16)
>     mode  Clock polarity and phase mode (0 - 3)
>
>
>
> mode | POL PHA
> -----+--------
>   0  |  0   0
>   1  |  0   1
>   2  |  1   0
>   3  |  1   1

gehen soll (dass stand so bei der Funktion .format mit dabei, dass ich 
da zwischen 4-16 wählen kann. Aber warum geht das nicht,sondern warum 
bleibt es const. bei 8bit?

von Hannes Jenschka (Gast)


Lesenswert?

Was soll ich denn machen, wenn ich ein Signal empfangen muss, was 12bit 
breit ist (weil es ein Slave so sendet)? Muss ich mir dann selber ein 
SPI-Interface basteln, was dann 12bit empfangen kann?

von Hannes Jenschka (Gast)


Lesenswert?

Siebzehn Für Fuenfzehn schrieb:
> Es kann durchaus vorkommen, dass das Hardware SPI nicht das kann, was
> das Datenblatt verlangt.

Woran erkenne ich denn das dann? Muss ich mir dann selber erst noch 
einen Software-SPI basteln, damit es dann klkappt? Wozu gibt es dann 
fertige Bibliotheken, wenn sie dann nicht richtig funktionieren :-(

von Purzel H. (hacky)


Lesenswert?

> Was soll ich denn machen, wenn ich ein Signal empfangen muss, was 12bit
breit ist (weil es ein Slave so sendet)? Muss ich mir dann selber ein
SPI-Interface basteln, was dann 12bit empfangen kann?

Allenfalls geht's auch mit 16 bit. Wenn nicht, ja. Mit Pin wackeln 
geht's dann.

von Rudi (Gast)


Lesenswert?

Hannes Jenschka schrieb:
> Muss ich mir dann selber erst noch
> einen Software-SPI basteln, damit es dann klkappt?

Wenn ich mir Deinen Quellcode so anschaue, denke ich nicht, dass Du ein 
richtiges C-Programm programmieren kannst. Lern erstmal die Grundlagen.

von isidor (Gast)


Lesenswert?

Hannes Jenschka schrieb:
> Was soll ich denn machen, wenn ich ein Signal empfangen muss, was 12bit
> breit ist (weil es ein Slave so sendet)? Muss ich mir dann selber ein
> SPI-Interface basteln, was dann 12bit empfangen kann?

Ist doch ganz einfach: Du liest 16 Bit und wertest nur die ersten
12 Bit aus. Dazu gibt es notfalls Shift-Operationen.

Oder du schreibst ein Soft-SPI auf deine Anforderungen zugeschnitten,
das ist noch einfacher als eine I2C Library.

von Peter D. (peda)


Lesenswert?

Hannes Jenschka schrieb:
> Was soll ich denn machen, wenn ich ein Signal empfangen muss, was 12bit
> breit ist (weil es ein Slave so sendet)?

Schau mal ins Datenblatt des Slave.
Mir ist bisher noch kein Slave untergekommen, der nicht vielfaches von 
8Bit versteht.
Bei 12Bit werden eben noch 4 Füllbits angehangen.

von Klaus B. (Gast)


Lesenswert?

Hallo,

die HW der STM32 kann nur 8 bzw. 16 Bit Frames:

20.2.1 SPI features
• Full-duplex synchronous transfers on three lines
• Simplex synchronous transfers on two lines with or without a 
bidirectional data line
• 8- or 16-bit transfer frame format selection

Libaries sind aber meistens generisch geschrieben, damit sie auch andere 
SPI-Controller unterstützen können.

Ich kann Peter Danneger's Antwort nur unterstreichen. Es sollte kein 
Problem darstellen, die 12 Bit mit einem 16Bit Transfer auszulesen. 2x 
8Bit wird vermtl. nicht funktionieren, da dazwischen der SPI Controller 
den Slaveselect deaktiviert und der Slavecontroller beim nächsten 
aktvien Slaveselect wieder von vorne zu übertragen beginnt.

Um welchen Slave handelt es sich denn eigentlich ?

Gruß!

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.