Wenn ich nur SPI2_Init() aufrufe, funktioniert der SPI Bus ohne
Probleme.
Wenn aber SPI2_Init() und I2C_init() nacheinander aufgerufen wird, (egal
in welcher Reihenfolge), dann Streikt der SPI Bus.
Ich habe auch schon zuerst SPI_init() aufgerufen, und in der I2C_init()
Methode das GPIB clock enable auskommentiert,
das hat aber auch nichts genützt.
Hat jemand ne Idee?
Gruß
Sylvia
Die I2C-Ports einzuschalten nachdem I2C initialisiert ist, das ist
sinnvoll. Aber I2C erst mit Takt versorgen, nachdem man versuchte es zu
initialisieren, das nicht.
> Wann verwend ich Port A?
Dann schärf mal die Augen, putz die Brille und lies SPI_Init nochmal.
Notfalls laut der Katze vorlesen.
Sylvia H. schrieb:> /* Enable SPI2 and GPIOB clocks */> RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);> RCC_APB2PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);
Entschuldige, ich stehe auf dem Schlauch, wo ist im Text Port A ?
ok, alles verbesert, SPI2 liegt jetzt ganz in Port B,
I2C bekommt seinen Takt am Anfang der Initialisierung,
aber trotzdem laufen SPI und I2C nicht gemeinsam.
Woran könnts liegen?
(Natürlich ziehe ich vorher den NSS auf 0, und gebe ihn nach den Senden
wieder frei)
Wenn ich die Methode SPI2_Init() aufrufe, und danach dann die 0x05
losschicke, kann ich auf dem Oszi schön die 0x05 beobachten wie sie auf
die Reise geht (am MOSI Pin).
Rufe ich nun zusätzlich die I2C_init() Methode auf, ist sofort tote Hose
am MOSI Pin, der SPI schickt nichts mehr los.
Seltsamerweise, ist da noch ein Phänomen:
Wenn ich die SPI2_Init() Methode auskommentiere, und nur die I2C_init()
Methode aufrufe, kann ich trotzdem die 0x05 am MOSI Pin mit meinem Oszi
ablesen.....
versteh ich auch nicht so richtig......
Sylvia H. schrieb:> Seltsamerweise, ist da noch ein Phänomen:> Wenn ich die SPI2_Init() Methode auskommentiere, und nur die I2C_init()> Methode aufrufe, kann ich trotzdem die 0x05 am MOSI Pin mit meinem Oszi> ablesen.....> versteh ich auch nicht so richtig......
Kommando zurück,
wenn die SPI Init Methode auskommentiert ist, wird auch nichts aus MOSI
rausgeschickt.
War ein Irrtum von mir.
Aber nichts desdo trotz:
Warum sendet MOSI nichts, wenn die Methoden so aufgerufen werden:
Hallo Sylvia,
wo hast Du denn "I2C_InitStructure2" deklariert ?
In Deinen Code-Fragmenten habe ich es nicht entdeckt.
Ich hatte mal ein ähnliches Problem und ich habe es glaube ich gelöst
bekommen indem ich "SPI_InitStructure","GPIO_InitStructure" etc.
global definiert habe.
Gruß, Klaus
Klaus Skibowski schrieb:> wo hast Du denn "I2C_InitStructure2" deklariert ?
mein Cod ist nicht ganz komplett, ich inititalisiere in der I2C_init
Methode auch noch I2C1, das habe ich aber der Übersicht halber
weggelassen. Dabei habe ich auch vergessen, die I2C_InitStructure2 mit
in mein Codfragement zu kopieren.....
Die Structure wird aber am Anfang der Methode deklariert.
Ich habe noch was rausgefunden, vielleicht kann jemand was damit
anfangen (vielleicht auch jemand, der nichts mit der StdPeriphLib am Hut
hat ;):
Während der Initialisierung des I2C Busses springt das Programm jedesmal
in diese Infiniteloop routine :
1
/**
2
* @brief This is the code that gets called when the processor receives an
3
* unexpected interrupt. This simply enters an infinite loop, preserving
4
* the system state for examination by a debugger.
5
*
6
* @param None
7
* @retval : None
8
*/
9
.section.text.Default_Handler,"ax",%progbits
10
Default_Handler:
11
Infinite_Loop:
12
bInfinite_Loop
13
.sizeDefault_Handler,.-Default_Handler
Nämlich bei der Abfrage
1
/* Get PCLK2 prescaler */
2
tmp=RCC->CFGR&CFGR_PPRE2_Set_Mask;
in der Methode RCC_GetClocksFreq() aus der Lib stm3sf10x_rcc.c
Kann da jemand was mit anfangen?
Sylvia H. schrieb:> Während der Initialisierung des I2C Busses springt das Programm jedesmal> in diese Infiniteloop routine :
Diese Schleife steht für alle nicht explizit definierten Interrupt- und
Exception-Handler. Bei einfachem Code ohne Pfriemelei an Priority-Levels
und ohne Interrupts ist das meistens der HardError, ausgelöst durch
Zugriff auf nicht existierende Adressen, Call/Return in den Wald und
sowas in der Art.
> Nämlich bei der Abfrage> tmp = RCC->CFGR & CFGR_PPRE2_Set_Mask;
Wenn es wirklich exakt diese Zeile ist, und nicht eine davor oder so
(kann bei Exceptions leicht passieren), dann hiesse es, dass der Pointer
RCC in den Wald zeigt.
Interrupt Handler richtig geschrieben ?
Ich denke er löst eher in dieser Programmzeile aus weil dann dein I2C so
weit ist und ein Ready als Interrupt Routine sendet.
Bei solchen Problemen bietet es sich immer an das komplette
Programm(natürliche nicht die StdPeriphlib) zu posten. Wo ist denn dein
NVIC ?
mfg Jan
Jan schrieb:> Interrupt Handler richtig geschrieben ?
ich habe gar keinen NIVC geschrieben, da ich keinen Interrupt benutze
sondern alles gepollt von statten gehen muß.
Sylvia H. schrieb:> // Configure I2C2 pins: SCL and SDA for the administrative bus> GPIO_InitStructure2.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;> GPIO_InitStructure2.GPIO_Speed = GPIO_Speed_50MHz;> GPIO_InitStructure2.GPIO_Mode = GPIO_Mode_AF_OD;> GPIO_Init(GPIOB, &GPIO_InitStructure2);
Das würde ich vor der IC2 Konfiguration und Freigabe machen.
In der I2C Initialisierung wird er wohl rauskriegen müssen, mit welchem
Takt der Controller arbeitet, um den I2C-Takt entsprechend zu
programmieren. Und dies scheint nicht zu funktionieren. Dazu müsste man
wohl mal in die entsprechende Routine reinsehen, das ist wohl mit der
Exception, um festzustallen, woran sie scheitert. So könnte auch eine
Division durch 0 die Exception auslösen.
Matthias K. schrieb:> Das würde ich vor der IC2 Konfiguration und Freigabe machen.
Und ich würde das eben nicht davor machen, weil ich mich exakt mit
dieser Frage ein Zeitlang rumärgern durfte.
Es führt nämlich dazu, dass die beiden I2C-Pins erst einmal aktiv eine 0
ausgeben, bevor die Initialisierung des I2C-Moduls sie dann deaktiviert.
Nicht jede I2C-Peripherie ist darüber glücklich.
Hi Leute,
das klingt jetzt vielleicht ein bischen komisch,
aber auf einmal gehts.....
Ich habe nicht den ganzen Code gepostet, weil das zu unübersichtlich
wird. Das ganze läuft unter FreeRTOS, und CAN spielt auch noch eine
Rolle.
Da ich dachte, ich brauche nur SPI und I2C für mein Project, hatte ich
die CAN initialisierung nicht berücksichtigt. Aber dort steht wohl noch
etwas wichtiges, was mein Project auch beeinflusst. Wenn ich die CAN
initialisierung einkommentiere, dann läuft alles, ich muss nur noch
herausfinden, was genau das ist.....
Vielen Dank für eure Unterstützung, das hat mir sehr geholfen. Ich war
kurz vor dem Verzweifeln, da ist es gut, wenn ein paar Kollegen einem
unter die Arme greifen und mithelfen.
Bei euch kann man noch viel Lernen!
Gruß
Sylvia