[elektro] STM32F103 SPI1 vs SPI2

uprogc . uprogc at gmail.com
Mon Jan 15 16:09:03 CET 2018


En ugyan nem olvastam vegig a kodot, de megfeleloen be van allitva az
orajele az adott SPInek ?

2018-01-15 15:56 GMT+02:00 Peter Peterb <peterb.list at gmail.com>:

> Sziasztok,
>
> Hátha van itt valaki, aki benne van a témában és szemet szúr neki
> valami, ami nekem már végképp nem. Az alábbi teszt kód szerint az SPI2
> működik ahogy kell, az SPI1 viszont rögtön végtelen ciklusba kerül a
> TXE flag vizsgálatán. Ennek a reset utáni alapállapota 1, de a
> debugger szerint az SPI1_SR=0, azaz a TXE bit is 0, mintha már lenne a
> TX bufferben valami.
> Ha ezt a vizsgálatot kihagyom, vagy ha a ...TXE == RESET helyett
> ...BSY == SET van, akkor ugyan átmegy rajta, de akkor se csinál
> semmit, a CLK és MOSI folyamatosan 0-n van. Sima GPIO-nak konfigurálva
> piszkálhatók a lábak, tehát a chip kifelé rendben van.
>
> Üdv,
> Péter
>
> #include "stm32f10x.h"
> #include "stm32f10x_rcc.h"
> #include "stm32f10x_gpio.h"
> #include "stm32f10x.h"
> #include "delay.h"
>
> //-----------------------------------------------------------------
> #define TEST_SPI        1
> //-----------------------------------------------------------------
>
> #if (TEST_SPI == 1)
> #define SPIy            SPI1
> #define SPIy_CLK        RCC_APB2Periph_SPI1
> #define SPIy_GPIO       GPIOA
> #define SPIy_GPIO_CLK   RCC_APB2Periph_GPIOA
> #define SPIy_PIN_NSS    GPIO_Pin_4
> #define SPIy_PIN_SCK    GPIO_Pin_5
> #define SPIy_PIN_MISO   GPIO_Pin_6
> #define SPIy_PIN_MOSI   GPIO_Pin_7
>
> #elif (TEST_SPI == 2)
> #define SPIy            SPI2
> #define SPIy_CLK        RCC_APB1Periph_SPI2
> #define SPIy_GPIO       GPIOB
> #define SPIy_GPIO_CLK   RCC_APB2Periph_GPIOB
> #define SPIy_PIN_NSS    GPIO_Pin_12
> #define SPIy_PIN_SCK    GPIO_Pin_13
> #define SPIy_PIN_MISO   GPIO_Pin_14
> #define SPIy_PIN_MOSI   GPIO_Pin_15
>
> #else
> #error Not a valid SPI port number!
> #endif
>
> int main(void)
> {
>     SPI_InitTypeDef     SPI_InitStructure;
>     GPIO_InitTypeDef    GPIO_InitStructure;
>
>     //-----------------------------------------------------------------
>     // System clocks configuration
>     // First set flash latency:
>     //  0...24 MHz ---> 0
>     // 24...48 MHz ---> 1
>     // 48...72 MHz ---> 2
>     FLASH_SetLatency(FLASH_Latency_1);
>
>     RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_9); // HSI, 36 MHz
>     RCC_PLLCmd(ENABLE); // Enable PLL
>     while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {} // Wait till
> PLL stable
>     RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
>
>     RCC_HCLKConfig(RCC_SYSCLK_Div1);
>     RCC_PCLK1Config(RCC_HCLK_Div2);
>     RCC_PCLK2Config(RCC_HCLK_Div2);
>
>     RCC_APB2PeriphClockCmd(SPIy_GPIO_CLK | RCC_APB2Periph_AFIO,
> ENABLE); // Enable GPIO clock for SPIy
>     RCC_APB1PeriphClockCmd(SPIy_CLK, ENABLE); // Enable SPIy Periph clock
>
>     //-----------------------------------------------------------------
>     // GPIO configuration
>     GPIO_InitStructure.GPIO_Pin = SPIy_PIN_SCK | SPIy_PIN_MOSI;
>     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
>     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
>     GPIO_Init(SPIy_GPIO, &GPIO_InitStructure);
>
>     GPIO_InitStructure.GPIO_Pin = SPIy_PIN_MISO;
>     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
>     GPIO_Init(SPIy_GPIO, &GPIO_InitStructure);
>
>     GPIO_InitStructure.GPIO_Pin = SPIy_PIN_NSS;
>     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
>     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
>     GPIO_Init(SPIy_GPIO, &GPIO_InitStructure);
>
>     //-----------------------------------------------------------------
>     // SPIy configuration
>
>     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_64;
>     SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
>     SPI_InitStructure.SPI_CRCPolynomial = 7;
>     SPI_Init(SPIy, &SPI_InitStructure);
>
>     // Enable SPIy
>     SPI_Cmd(SPIy, ENABLE);
>
>     //-----------------------------------------------------------------
>     while (1)
>     {
>         GPIO_WriteBit(SPIy_GPIO, SPIy_PIN_NSS, 0);
>
>         while (SPI_I2S_GetFlagStatus(SPIy, SPI_I2S_FLAG_TXE) ==
> RESET); // Wait for SPIy Tx buffer empty
>         //while (SPI_I2S_GetFlagStatus(SPIy, SPI_I2S_FLAG_BSY) ==
> SET); // Wait for SPIy ready
>         SPI_I2S_SendData(SPIy, 0x82);   // Send SPIy test databyte
>
>         GPIO_WriteBit(SPIy_GPIO, SPIy_PIN_NSS, 1);
>         Delay_ms(100);
>     }
> }
>
> -----------------------------------------
>           elektro[-flame|-etc]


More information about the Elektro mailing list