2016-08-06 34 views
0

Ich bin neu zu stm32f103c8t6. Jetzt versuche ich die SPI-Funktion zu lernen und beende den Code von der RCC zur SPI-Initialisierung. Ich benutzte das Oszilloskop, um das SPI1 SCK-Signal aufgrund der Beschränkung der Testausrüstung zu messen. Tatsächlich ist das Taktsignal aber viel niedriger als meine RCC-Konfiguration. Ich habe versucht, den Grund zu suchen, aber immer noch versagt. Also darf ich fragen, ob jemand die Antwort kennt.Die Uhr von Stm32f103 SPI unterscheidet sich von der theoretischen Berechnung nach der Initialisierung

RCC_DeInit(); 
RCC_HSEConfig(RCC_HSE_ON); 
Errsts = RCC_WaitForHSEStartUp(); 

if (Errsts == SUCCESS) 
{ 
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 
    RCC_PLLConfig(RCC_PLLSource_HSE_Div2, RCC_PLLMul_9); 
    RCC_PLLCmd(ENABLE); 


    while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY == RESET)) 
    { 
    } 
    FLASH_SetLatency(FLASH_Latency_1); 
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); 
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
    RCC_PCLK1Config(RCC_HCLK_Div2); 
    RCC_PCLK2Config(RCC_HCLK_Div1); 
    while (RCC_GetSYSCLKSource() != 0x08) 
    { 
    } 
} 

Der obige Code meine Konfiguration über RCC zeigt, verwendet als I HSE-Takt und die Endfrequenz ist 8Mhz/2 * 9 = 36 MHz. Unten ist mein SPI und GPIO Initialisierung:

SPI_InitTypeDef SPI_InitStructure; 
GPIO_InitTypeDef GPIO_InitStructure; 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
GPIO_Init(GPIOA, &GPIO_InitStructure); 

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
GPIO_Init(GPIOA, &GPIO_InitStructure); 

GPIO_WriteBit(GPIOA, GPIO_Pin_4,Bit_SET); 

SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; 
SPI_InitStructure.SPI_Mode = SPI_Mode_Master; 
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; 
SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; 
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; 
SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; 
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; 
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; 
SPI_InitStructure.SPI_CRCPolynomial = 7; 
SPI_Init(SPI1, &SPI_InitStructure); 
/* Enable SPI2 */ 
SPI_Cmd(SPI1, ENABLE); 

So SPI_BaudRatePrescaler = 4 bedeutet, meine SPI Takt 36MHz/4 = 9 MHz ist, aber tatsächlich das Oszilloskop zeigt die frequecy um 200 kHz ist, ist es viel niedriger die die Erwartung. Auch ich habe versucht, SPI_BaudRatePrescaler mit anderen Wert zu konfigurieren, es scheint, dass das Ergebnis nicht linear ist.

Daher würde ich gerne fragen, ob jemand die Antwort kennt. Danke vielmals!

Antwort

0

Überprüfen Sie Ihren Prescaler-Wert in Ihrer Konfiguration. Gemäß der reference manual ergibt ein Wert von 4 in dem Baudratenfeld einen Teiler von 32. Um zu einem Takt von ungefähr 200 kHz zu gelangen, benötigen Sie einen Wert in diesem Register von 6 oder 7, was zu einem Teiler von ergibt 128 oder 256 (281 kHz oder 140 kHz). Wenn Sie einen Teiler von 4 möchten, müssen Sie den Wert 1 eingeben. Überprüfen Sie, ob SPI_BaudRatePrescaler_4 einen Wert von 4 im Register oder einen Wert von 1 ergibt.

Das Ergebnis ist nicht linear, da sie es als Exponent von 2 verwenden. Ein Wert von 0 ist 2^(0+1), während 1 ist 2^(1+1), usw., usw.