STM32F4 SPI2初始化及收發數據【使用庫函數】


     我的STM32F4 Discovery上邊有一個加速度傳感器LIS302DL。在演示工程中,ST的工程師使用這個傳感器做了個很令人羡慕的東西:解算開發板的姿態。當開發板傾斜時候,處於最上邊的LED點亮,其他LED不亮。同時,用MicroUSB數據線將開發板連接電腦時,開發板就會虛擬成一個鼠標。傾斜開發板時,鼠標指針會向傾斜的方向移動。歸根結底,就是牛B的ST工程師用加速度傳感器完成了姿態解算。

    在開發板上,加速度傳感器使用了SPI方式用STM32F4芯片進行通信。STM32F4的SPI1 作為主機,與LIS302Dl進行通信,讀取或者寫入數據。由於我沒有使用過STM32的SPI口,因此在板子的空余資源中找到了SPI2接口來做實驗。實驗是這樣的:將SPI的MISO和MOSI腳相連。這樣SPI發送了什么數據,就能接收到什么數據。不需要額外的器件就能試驗。

    引腳:將PB13、PB14、PB15三個引腳的復用功能,分別對應於SPI2SCK、SPI2MISO、SPI2MOSI。

     引腳初始化:

void SPI_GPIOConfig(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);  //開啟時鍾
   
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  //引腳初始化
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
   
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource13,GPIO_AF_SPI2);  //打開引腳的復用功能
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_SPI2);
}

SPI2功能初始化:

void SPI_Config(void)
{
    SPI_GPIOConfig();
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);  //時鍾
   
    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;  //全雙工模式
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;   //作為主機使用
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;   //數據長度8
    SPI_InitStructure.SPI_CPOL  = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;   //軟件設置NSS功能
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(SPI2,&SPI_InitStructure);
    SPI_Cmd(SPI2,ENABLE);
}

之后就可以收發數據了:

void MySPI_SendData(char da)
{
    while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
    SPI_SendData(SPI2,da);
}

uint8_t MySPI_ReceiveData(void)
{
    while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
    return SPI_ReceiveData(SPI2);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM