Hallo,
ich versuche mit einem STM32F3Discovery zwei SN74HC165 Shiftregister mit
dem SPI Peripheral anzusprechen. Dazu möchte ich 16bit Daten über den
MISO-Pin einlesen, MOSI ist unbeschaltet.
Diese Funktionen habe ich dazu geschrieben:
1
//init spi gpio for digital input shift register
2
voiddig_in_init(){
3
gpio_pin_config(CS_PORT,CS_PIN,OUT|PP|MHZ_50);//chip select, connected to clk_inhibit, always low
not_used=SPI2->DR;//dummy read values from data register to reset interrupt
39
SH_LD_PORT->BSRR=(1<<SH_LD_PIN);//shift/load to shift
40
SPI2->DR=0x0F0F;//put dummy bytes into data register to start communication
41
dig_in_sr_state=STATE_SHIFT;
42
}
43
elseif(dig_in_sr_state==STATE_SHIFT){
44
digital_values=SPI2->DR;//read values from data register (resets interrupt)
45
SH_LD_PORT->BRR=(1<<SH_LD_PIN);//shift/load to load
46
SPI2->DR=0xF0F0;//put dummy bytes into data register to start communication
47
dig_in_sr_state=STATE_LOAD;
48
}
49
}
dig_in_init wird in Main aufgerufen und soll den SPI initialisieren und
eine Übertragung starten. Wenn die Übertragung beendet ist soll in der
ISR wieder eine Übertragung gestartet werden, sodass das ganze im
Hintergrund weiterläut und immer wieder Daten aus den Shiftregistern
ausließt und in der Variable digital_values speichert.
Jedoch werden scheinbar nie daten empfangen und es wird daher nie ein
Interrupt ausgelöst.
Woran könnte das liegen?
liebe Grüße
Franky
Nein, keine Takte auf der Clockleitung.
Das könnte natürlich an meiner gpio_pin_config Funktion liegen, die den
Pin nicht richtig auf Alternate Function setzt aber selbst wenn sie
nicht Funktioniert sollte der SPI doch nach 16 Flanken (die dann hald
nicht bis zum Pin kommen) den Interrupt auslösen, oder?
Der einzige Grund ist eigentlich dass ich es so gewohnt bin (habe vorher
AVR verwendet) und es "zwingt" mich, mich mehr mit der Funktionsweise
des Controllers zu beschäftigen.
Die vorher gepostete Zeile sollte eigentlich so aussehen:
Hast du denn die Taktversorgung für die GPIO's und den SPI aktiviert?
Bei dem Umstieg von AVR zu STM vergisst man leicht, dass die einzelnen
Komponenten generell nicht versorgt werden.
Ich kenne die einzelnen Register des STM32f3 zwar nicht, sieht aber
jedenfalls nicht falsch aus. Um sicher zu gehen, könntest du einen Blick
in FW-Lib werfen.
Wenn du keinen Takt am SPI_CLK hast, kann es eigentlich nurnoch eine
Fehlgescheschlagene Initialisierung bzw. Start haben.
Was mir auffällt ist:
1
SPI2->CR1&=~(SPI_CR1_BIDIMODE|SPI_CR1_RXONLY);//2-line mode, full duplex
Solltest du nicht noch in dem Register das Senden aktivieren, oder habe
ich das übersehen?
Das Senden sollte im 2-Line Full-Duplex-Mode, den ich verwende, aktiv
sein. Für den Half-Duplex-Mode kann man das Senden Deaktivieren um in
den Empfangsmodus zu wechseln.
Den Software Slave select habe ich jetzt aktiviert (das war vorher
falsch, denke ich), das Problem bleibt aber:
Besteht denn das Problem noch, dass du kein SPI_CLOCK bekommst? Wenn das
so ist, hast du glaube ich noch Konfigurationsprobleme mit deinem SPI.
Kommst du mit dem Oszi an die MOSI-Leitung? Dann könntest du zur
Funktionsprüfung Daten senden. Wenn du dann nichts siehst, liegt der
Fehler in der Konf.
So, jetzt funktioniert alles!
Das software slave select management muss aktiviert sein, wie in meinem
letzten Post schon vermutet. Zusätzlich muss man folgendes Bit setzen:
Scheinbar wird nichts gesendet, wenn nicht irgendwo der Slave aktiviert
wird.
der Init-Code sieht jetzt so aus (CPOL und CPHA hab ich noch an den
Slave angepasst):
1
voiddig_in_init(){
2
gpio_pin_config(CS_PORT,CS_PIN,OUT|PP|MHZ_50);//chip select, connected to clk_inhibit, always low