Forum: Mikrocontroller und Digitale Elektronik SPI: Clock ist in Idle-Status Low - Warum?


von stepri (Gast)


Angehängte Dateien:

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
}

von stepri (Gast)


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....

von Jim M. (turboj)


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.

von Walter T. (nicolas)


Lesenswert?

Sicher, dass er nicht hochohmig ist? Bei den STM32F10x und den STM32F4XX 
wird der SPI im abgeschalteten Zustand leider hochohmig.

: Bearbeitet durch User
von stepri (Gast)


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)??

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.