Hi,
ich versuche mit einem STM32F103 einen SPI FRAM „FM25H20“ anzusprechen.
Meine Versuche blieben bisher erfolglos.
Ich habe leider keine Ahnung was fehlt bzw. falsch ist. Meine erste
Vermutung ist, dass der Takt bzw. die Frequenz für den SPI2 Bus nicht
richtig initialisiert wurde. Oder aber dass die SPI Initialisierung
unvollständig ist. Vielleicht aber auch eine fehlerhafte Verwendung der
„SPI-Routinen“.
Der FRAM verlangt den SPI Mode 0 oder 3 (CPOL=0, CPHA=0 oder
CPOL=1,CPHA=1).
Mit einem Atmega 2560 kann ich diesen FRAM-Typ erfolgreich via SPI
ansprechen - nur leider kann der C-Code nicht 1zu1 importiert werden…:(
Vielleicht kann mir jemand weiter helfen und sieht wo es klemmt. Ich
muss noch dazu sagen, dass ich erst seit 1er Woche mit einem STM32F103
zu tun habe und keine Erfahrung habe.
meine main() mit RCC_Configuration():
1
intmain(void){
2
3
// System Clocks Configuration
4
RCC_Configuration();
5
6
// I2C is using for test/debugging
7
I2C_Addr_configuration();
8
I2C1_Configuration();
9
10
spi2_init();// initialize SPI
11
test_fram();// Test Routine
12
13
NVIC_Configuration();
14
init_control_unit();
15
16
while(1){
17
//....
18
}
19
}
20
21
voidRCC_Configuration(void){
22
23
/* RCC system reset(for debug purpose) */
24
RCC_DeInit();
25
26
/* Enable HSE */
27
RCC_HSEConfig(RCC_HSE_ON);
28
29
/* Wait till HSE is ready */
30
HSEStartUpStatus=RCC_WaitForHSEStartUp();
31
32
if(HSEStartUpStatus==SUCCESS)
33
{
34
/* HCLK = SYSCLK */
35
RCC_HCLKConfig(RCC_SYSCLK_Div1);
36
37
/* PCLK2 = HCLK */
38
RCC_PCLK2Config(RCC_HCLK_Div1);
39
40
/* PCLK1 = HCLK/2 */
41
RCC_PCLK1Config(RCC_HCLK_Div2);
42
43
/* Flash 2 wait state: required at operation of 72MHz */
Es gibt ja einige Beispielprojekte in denen SPI verwendet wird - mal
findet man MISO als Input und mal als GPIO_Mode_AF_PP. Scheint ja beides
zu funktionieren??!
in der Funktion fram_spi_read_byte() habe ich jetzt auch das richtige
Register-Flag "RXNE" eingesetzt
also auch kein USART3 kann hier Einfluss nehmen....
Hat jemand eine Idee was noch fehlerhaft ist? Die Funktionen
fram_spi_write_byte() , fram_spi_read_byte() und
test_fram() habe ich so auch beim ATMEGA umgesetzt, bis auf die
Anpassungen auf den STM MC:
while (SPI_I2S_GetFlagStatus(SPI2, xxxx)==RESET);
SPI_I2S_SendData(SPI2, xxx);
und da läuft es... --aber ausschließen kann ich das natürlich auch
nicht.
Gibt es einen Unterschied bzw. wo liegt der Unterschied bei der
Verwendung von
Ich habe jetzt versucht das Statusregister vom FRAM auszulesen und das
hat auch nicht funktioniert.
Bei allen Lese-Versuchen bekomme ich immer 255 zurück.
Habe auch schon testweise CPOL und CHPA geändert?
Hat jemand SPI Beispiele oder kann mir bei meinen Code weiterhelfen?
hi,
ob das dummyread wirklich sein muss, weiß ich nicht, dass müsste man mal
nachlesen falls es stört. werden überhaupt die richtigen pins
konfiguriert, sind die spi pins nicht pa4-pa7 ?
gruß steffen
>Muss beim "STM32" beim Lesen auch ein DummyByte austakten???
Wie soll das Datenbyte sonst vom Slave zum Master kommen?
Der Master gibt den Takt vor. Das kann er nur wenn er
Dummybytes sendet.
Bevor man den ARM verstanden hat kommentiert man natürlich
erst mal alles wichtige weg was man nicht versteht.
SPI_I2S_SendData(SPI2, data_byte);
>>>> //while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);
/* terminate spi data transfer */
GPIO_WriteBit(GPIOB, GPIO_Pin_12, 1);
CS wieder hochziehen bevor das Byte raus ist, ist keine
gute Idee.
Moin Moin,
auch wenn dieser Thread alt ist, dann schreibe ich doch hier einen
kleinen Hinweis. Die Code-Zeile von fliflop beinhaltet einen Fehler in
der TX Funktion:
In den obigen Code wird zwar das byte/word richtig gesendet, allerdings
wird nicht auf die Empfangsdaten gewartet. Bei einer sequentiellen SPI
Übermittlung hat man dann immer einen zu alten Wert.
Richtig müsste sein: