新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > STM32F4 SPI2初始化及收發(fā)數(shù)據(jù)使用庫(kù)函數(shù)

        STM32F4 SPI2初始化及收發(fā)數(shù)據(jù)使用庫(kù)函數(shù)

        作者: 時(shí)間:2016-11-19 來(lái)源:網(wǎng)絡(luò) 收藏
        我的STM32F4 Discovery上邊有一個(gè)加速度傳感器LIS302DL。在演示工程中,ST的工程師使用這個(gè)傳感器做了個(gè)很令人羨慕的東西:解算開發(fā)板的姿態(tài)。當(dāng)開發(fā)板傾斜時(shí)候,處于最上邊的LED點(diǎn)亮,其他LED不亮。同時(shí),用MicroUSB數(shù)據(jù)線將開發(fā)板連接電腦時(shí),開發(fā)板就會(huì)虛擬成一個(gè)鼠標(biāo)。傾斜開發(fā)板時(shí),鼠標(biāo)指針會(huì)向傾斜的方向移動(dòng)。歸根結(jié)底,就是牛B的ST工程師用加速度傳感器完成了姿態(tài)解算。

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

        本文引用地址:http://www.104case.com/article/201611/318273.htm

        引腳:將PB13、PB14、PB15三個(gè)引腳的復(fù)用功能,分別對(duì)應(yīng)于SPI2SCK、SPI2MISO、SPI2MOSI。

        引腳初始化:

        void SPI_GPIOConfig(void)
        {
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //開啟時(shí)鐘

        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); //打開引腳的復(fù)用功能
        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); //時(shí)鐘

        SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //全雙工模式
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //作為主機(jī)使用
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //數(shù)據(jù)長(zhǎng)度8
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //軟件設(shè)置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);
        }

        之后就可以收發(fā)數(shù)據(jù)了:

        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);
        }



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 德格县| 诸城市| 大同县| 南京市| 辽宁省| 贵阳市| 镇平县| 稷山县| 射洪县| 四川省| 皋兰县| 拜泉县| 安远县| 东平县| 兖州市| 嵩明县| 铜川市| 佛冈县| 泌阳县| 利津县| 磐石市| 六安市| 应用必备| 河北省| 子长县| 兰考县| 平山县| 澄迈县| 通化市| 张家界市| 邵武市| 玉树县| 溧阳市| 石屏县| 涿鹿县| 池州市| 新田县| 杂多县| 西乌| 陵川县| 乌海市|