Ich hab ein Problem mit der Funktion SPI->format().
Verwendeter Mikrocontroller: Nucleo F411RE
Funktionsbeschreibung:
1
voidformat
2
(intbits,
3
intmode=0
4
)
5
6
Configurethedatatransmissionformat.
7
8
Parameters:
9
bitsNumberofbitsperSPIframe(4-16)
10
modeClockpolarityandphasemode(0-3)
11
12
13
14
mode|POLPHA
15
-----+--------
16
0|00
17
1|01
18
2|10
19
3|11
Das Beispielprogramm:
1
#include"mbed.h"
2
3
SPIdevice(SPI_MOSI,SPI_MISO,SPI_SCK);
4
5
intmain(){
6
inti=0;
7
intj=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.
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.
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?
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.
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
SPIspi(p5,p6,p7);// mosi, miso, sclk
4
DigitalOutcs(p8);
5
6
intmain(){
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?
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?
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 :-(
> 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.
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.
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.
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.
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ß!