SPI: Clock ist in Idle-Status Low - Warum?

Gast #6139552
Lesenswert?
• ▲
▼
Liebes Forum,

ich konfiguriere gerade die SPI-Schnittstelle.
Verwendeter uC: STM32F303
SPI Mode: CPOL = 1 bzw. CPHA = 1
Das bedeutet, dass im Idle-Status der Clock HIGH sein sollte.
Hier fängt schon das Problem an: Der Clock bleibt nach dem Einschalten 
der SPI LOW.
In einer while-Schleife sende ich zum testen die Adresse 0x6 (SPI1->DR = 
0x6;)
Im Oszilloskop (siehe im Anhang ein Bild davon), sieht man, wie die 
Clock-Leitung (gelb) LOW bleibt bzw. zum Zeitpunkt des Sendens der 
Adresse 0x6 geht sie kurzfristig HIGH (für ca. 200ns), dann gleich 
wieder auf LOW...
Auf der MISO-Leitung (grün) tut sich jedoch nichts...
Kann mir jemand sagen, ob ich in der Konfiguration der SPI etwas 
vergessen habe?
Zum Probieren der SPI-Schnittstelle habe ich noch keinen Slave 
angeschlossen, daher werden die CS-Leitungen noch nicht berücksichtigt. 
Dies sollte jedoch keinen Einfluss auf die Clock- bzw. MISO-Leitung 
haben, oder?

Hier der Code (ich verwende die stm32_library):
1
void Init_GPIOA()
2
{
3
    // enable peripheral clock for GPIOA
4
    RCC->AHBENR |= RCC_AHBPeriph_GPIOA;
5
 
6
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource5, GPIO_AF_5);   // set alternative Funktion f. SPI1 (I_SCLK)
7
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_5);   // set alternative Funktion f. SPI1 (I_MISO)
8
        GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_5);   // set alternative Funktion f. SPI1 (I_MOSI)
9

10
        pGPIOx_InitStruct->GPIO_Pin   = (uint32_t)(GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);   // SCLK, MISO, MOSI
11
        pGPIOx_InitStruct->GPIO_Mode  = GPIO_Mode_AF;
12
        pGPIOx_InitStruct->GPIO_Speed = GPIO_Speed_Level_1;                         // high speed (50MHz)
13
        pGPIOx_InitStruct->GPIO_OType = GPIO_OType_PP;                              // push-pull
14
        pGPIOx_InitStruct->GPIO_PuPd  = GPIO_PuPd_NOPULL ;
15

16
        GPIO_Init(GPIOA, pGPIOx_InitStruct);                                        // set pins
17

18
        pGPIOx_InitStruct->GPIO_Pin   = (uint32_t)(GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4);  //Chip-Select: CS1, CS2, CS3, CS4
19
        pGPIOx_InitStruct->GPIO_Mode  = GPIO_Mode_OUT;
20
        pGPIOx_InitStruct->GPIO_Speed = GPIO_Speed_Level_3;                         // high speed (50MHz)
21
        pGPIOx_InitStruct->GPIO_OType = GPIO_OType_PP;                              // push-pull
22
        pGPIOx_InitStruct->GPIO_PuPd  = GPIO_PuPd_NOPULL ;
23

24
        GPIO_Init(GPIOA, pGPIOx_InitStruct);
25
}
26

27
void Init_SPI1(void)
28
{
29
    // Enable peripheral clock
30
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
31

32
    SPI_I2S_DeInit(SPI1);
33

34
    SPI_InitTypeDef SPI_InitStructure;
35

36
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
37
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
38
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
39
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;         // CPOL is set -> SCK pin has a high-level idle state
40
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;        // second edge on the SCK pin captures the first data bit transacted (rising edge because the CPOL bit is set)
41
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
42
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;
43
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
44

45

46
    SPI_Init(SPI1,&SPI_InitStructure);
47
    SPI_CalculateCRC(SPI1, DISABLE);
48
    SPI_SSOutputCmd(SPI1, ENABLE);
49
    SPI_Cmd(SPI1, ENABLE);
50

51
    while(true)
52
    {
53
        SPI1->DR = 0x6;
54
//        SPI_SendData8(SPI1,0x6);
55
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_TXE)==RESET);
56
        while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == 1);
57
        delay_1us(10);
58
    }
59
}
Angehängte Dateien:
Gast #6139558
Lesenswert?
• ▲
▼
stepri schrieb:
> Auf der MISO-Leitung (grün) tut sich jedoch nichts...
> Kann mir jemand sagen, ob ich in der Konfiguration der SPI etwas
> vergessen habe?
> Zum Probieren der SPI-Schnittstelle habe ich noch keinen Slave
> angeschlossen, daher werden die CS-Leitungen noch nicht berücksichtigt.
> Dies sollte jedoch keinen Einfluss auf die Clock- bzw. MISO-Leitung
> haben, oder?

Ich meinte in dem Absatz die MOSI-Leitung (nicht MISO)!!!!
Sry....
#6139638
Lesenswert?
• ▲
▼
stepri schrieb:
> Im Oszilloskop (siehe im Anhang ein Bild davon), sieht man, wie die
> Clock-Leitung (gelb) LOW bleibt

Der gelbe Kanal ist AC-gekoppelt. Da sieht man den DC Pegel genau gar 
nicht.

IMO sieht man hier eher das Umschalten des IO Pins in den AF Mode.

SPI geht vermutlich wegen fehlender Clock Settings nicht - schau mal ins 
RM ob da nicht noch weitere Bits nötig sind oder nutze die entsprechende 
HAL Funktion.
Gast #6140143
Lesenswert?
• ▲
▼
hab mir die Register angesehen. Im SPI control register (SPIx_CR1) 
werden die entsprechenden Bits gesetzt.
Allerdings habe ich festgestellt, dass sobald ich das SPI einschalten 
möchte, das Bit 6 (SPI enable) auf 0 bleibt...
Hat jemand eine Idee, warum sich das SPI nicht einschalten lässt (obwohl 
das Setzen der anderen Bits im gleichen Register möglich ist)??

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.