[elektro] STM32F103 SPI1 vs SPI2
elight
elight at gmail.hu
Mon Jan 15 16:42:53 CET 2018
Pointosabban mindenhol
"SPIy" ahol y = 1 vagy 2 ...
Üdv István
2018-01-15 16:26 keltezéssel, uprogc . írta:
> *SPI1
>
> 2018-01-15 17:26 GMT+02:00 uprogc . <uprogc at gmail.com>:
>
>> Talan SPI eseten:
>>
>> RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);
>>
>>
>>
>>
>>
>> 2018-01-15 17:09 GMT+02:00 uprogc . <uprogc at gmail.com>:
>>
>>> 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]
>>>
>>>
> -----------------------------------------
> elektro[-flame|-etc]
More information about the Elektro
mailing list