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

Gast #6139552
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
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....
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
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.