STM32使用SPI通信驱动2.4G无线射频模块发送数据
生活随笔
收集整理的這篇文章主要介紹了
STM32使用SPI通信驱动2.4G无线射频模块发送数据
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
- SPI介紹
- SPI接口原理
- SPI工作原理
- SPI特征
- 引腳配置
- 結構體
- 庫函數
- SPI配置過程
- SPI.h
- SPI.c
- NRF24L01無線射頻模塊
- NRF24L01廠家驅動代碼移植
- NRF24L01.h
- NRF24L01.c
- main.c
- 串口打印調試
SPI介紹
SPI接口原理
SPI工作原理
SPI特征
引腳配置
結構體
庫函數
SPI配置過程
SPI.h
#ifndef __SPI_H__ #define __SPI_H__#include "stm32f10x.h"void SPI2_Init(void) ;//SPI2初始化 主模式 u8 SPI2_ReadWriteByte(u8 dat); void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler);#endifSPI.c
#include "SPI.h" #include "stm32f10x.h"void SPI2_Init(void)//SPI2初始化 主模式 {GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure;/* Enable SPI2 and GPIOB clocks */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);/* Configure SPI2 pins: SCK, MISO and MOSI (NSS由軟件配置,無需引腳)*/GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;//SCK MOSI GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//復用推挽輸出 前面有講到 GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_SetBits(GPIOB,GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15);//起始拉高(CPOL為1)/* SPI2 configuration */ SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI2設置為兩線全雙工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //設置SPI2為主模式SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //SPI發送接收8位幀結構SPI_InitStructure.SPI_CPOL = SPI_CPOL_High; //CPOL極性位:串行時鐘在不操作(空閑)時,時鐘為高電平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge; //CPHA位:第二個時鐘沿開始采樣數據(此處為上升沿采集數據)SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS片選信號由軟件模式(使用SSI位)管理,無需實際引腳接線節省一個引腳SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; //定義波特率預分頻的值:波特率預分頻值為8,分頻后為9MHZSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //數據傳輸從MSB位開始 即高位先行SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC校驗位值計算的多項式(一般選這個就好了)SPI_Init(SPI2, &SPI_InitStructure);/* Enable SPI2 */SPI_Cmd(SPI2, ENABLE); //使能SPI1外設 }//SPIx 讀寫一個字節(全雙工同時進行) //返回值:讀取到的字節 //#define SPI_RW SPI1_ReadWriteByte //代替函數名,以便適用于后面函數 u8 SPI2_ReadWriteByte(u8 dat) {u8 t; //獲取標志位狀態 等待發送位為空 才發送數據while( SPI_I2S_GetFlagStatus( SPI2, SPI_I2S_FLAG_TXE) == RESET ){t ++;if(t >= 200){return 0;}}SPI_I2S_SendData(SPI2,dat);//接收位為空的話 等待接收while( SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET ){t ++;if(t >= 200){return 0;}} return SPI_I2S_ReceiveData(SPI2); }//設置SPI2速度(幾分頻) 前面結構體不是已經配置了嗎? void SPI2_SetSpeed(u8 SPI_BaudRatePrescaler) {assert_param(IS_SPI_BAUDRATE_PRESCALER(SPI_BaudRatePrescaler)); SPI2->CR1 &=0XFFC7 ; //寄存器CR1[3:5]位清0 (也叫波特率控制位BR)SPI2->CR1 |= SPI_BaudRatePrescaler ; //設置SPI2速度SPI_Cmd(SPI2,ENABLE); }NRF24L01無線射頻模塊
詳細參照模塊操作手冊
NRF24L01廠家驅動代碼移植
NRF24L01.h
#ifndef _nrf24l01_H #define _nrf24l01_H#include "SPI.h" #include "stm32f10x.h"//24L01操作線 一共8根線,其中兩根電源線 以下為其余六根線做如下封裝 #define NRF24L01_Port GPIOB #define NRF24L01_CE GPIO_Pin_8 //24L01片選信號 #define NRF24L01_CSN GPIO_Pin_9 //SPI片選信號 #define NRF24L01_IRQ GPIO_Pin_6 //IRQ主機數據輸入//默認三根線跟SPI硬件有關#define NRF24L01_CSN_L GPIO_ResetBits(NRF24L01_Port,NRF24L01_CSN) #define NRF24L01_CSN_H GPIO_SetBits(NRF24L01_Port,NRF24L01_CSN) #define NRF24L01_CE_L GPIO_ResetBits(NRF24L01_Port,NRF24L01_CE) #define NRF24L01_CE_H GPIO_SetBits(NRF24L01_Port,NRF24L01_CE) #define NRF24L01_IRQ_L GPIO_ResetBits(NRF24L01_Port,NRF24L01_IRQ) #define NRF24L01_IRQ_H GPIO_SetBits(NRF24L01_Port,NRF24L01_IRQ) //24L01發送接收數據寬度定義 #define TX_ADR_WIDTH 5 //5字節的地址寬度 #define RX_ADR_WIDTH 5 //5字節的地址寬度 #define TX_PLOAD_WIDTH 32 //32字節的用戶數據寬度 #define RX_PLOAD_WIDTH 32 //32字節的用戶數據寬度//NRF24L01寄存器操作命令 #define NRF_READ_REG 0x00 //讀配置寄存器,低5位為寄存器地址 #define NRF_WRITE_REG 0x20 //寫配置寄存器,低5位為寄存器地址 #define RD_RX_PLOAD 0x61 //讀RX有效數據,1~32字節 #define WR_TX_PLOAD 0xA0 //寫TX有效數據,1~32字節 #define FLUSH_TX 0xE1 //清除TX FIFO寄存器.發射模式下用 #define FLUSH_RX 0xE2 //清除RX FIFO寄存器.接收模式下用 #define REUSE_TX_PL 0xE3 //重新使用上一包數據,CE為高,數據包被不斷發送. #define NOP 0xFF //空操作,可以用來讀狀態寄存器 //SPI(NRF24L01)寄存器地址 #define CONFIG 0x00 //配置寄存器地址;bit0:1接收模式,0發射模式;bit1:電選擇;bit2:CRC模式;bit3:CRC使能;//bit4:中斷MAX_RT(達到最大重發次數中斷)使能;bit5:中斷TX_DS使能;bit6:中斷RX_DR使能 #define EN_AA 0x01 //使能自動應答功能 bit0~5,對應通道0~5 #define EN_RXADDR 0x02 //接收地址允許,bit0~5,對應通道0~5 #define SETUP_AW 0x03 //設置地址寬度(所有數據通道):bit1,0:00,3字節;01,4字節;02,5字節; #define SETUP_RETR 0x04 //建立自動重發;bit3:0,自動重發計數器;bit7:4,自動重發延時 250*x+86us #define RF_CH 0x05 //RF通道,bit6:0,工作通道頻率; #define RF_SETUP 0x06 //RF寄存器;bit3:傳輸速率(0:1Mbps,1:2Mbps);bit2:1,發射功率;bit0:低噪聲放大器增益 #define STATUS 0x07 //狀態寄存器;bit0:TX FIFO滿標志;bit3:1,接收數據通道號(最大:6);bit4,達到最多次重發//bit5:數據發送完成中斷;bit6:接收數據中斷; #define MAX_TX 0x10 //達到最大發送次數中斷 #define TX_OK 0x20 //TX發送完成中斷 #define RX_OK 0x40 //接收到數據中斷#define OBSERVE_TX 0x08 //發送檢測寄存器,bit7:4,數據包丟失計數器;bit3:0,重發計數器 #define CD 0x09 //載波檢測寄存器,bit0,載波檢測; #define RX_ADDR_P0 0x0A //數據通道0接收地址,最大長度5個字節,低字節在前 #define RX_ADDR_P1 0x0B //數據通道1接收地址,最大長度5個字節,低字節在前 #define RX_ADDR_P2 0x0C //數據通道2接收地址,最低字節可設置,高字節,必須同RX_ADDR_P1[39:8]相等; #define RX_ADDR_P3 0x0D //數據通道3接收地址,最低字節可設置,高字節,必須同RX_ADDR_P1[39:8]相等; #define RX_ADDR_P4 0x0E //數據通道4接收地址,最低字節可設置,高字節,必須同RX_ADDR_P1[39:8]相等; #define RX_ADDR_P5 0x0F //數據通道5接收地址,最低字節可設置,高字節,必須同RX_ADDR_P1[39:8]相等; #define TX_ADDR 0x10 //發送地址(低字節在前),ShockBurstTM模式下,RX_ADDR_P0與此地址相等 #define RX_PW_P0 0x11 //接收數據通道0有效數據寬度(1~32字節),設置為0則非法 #define RX_PW_P1 0x12 //接收數據通道1有效數據寬度(1~32字節),設置為0則非法 #define RX_PW_P2 0x13 //接收數據通道2有效數據寬度(1~32字節),設置為0則非法 #define RX_PW_P3 0x14 //接收數據通道3有效數據寬度(1~32字節),設置為0則非法 #define RX_PW_P4 0x15 //接收數據通道4有效數據寬度(1~32字節),設置為0則非法 #define RX_PW_P5 0x16 //接收數據通道5有效數據寬度(1~32字節),設置為0則非法 #define NRF_FIFO_STATUS 0x17 //FIFO狀態寄存器;bit0,RX FIFO寄存器空標志;bit1,RX FIFO滿標志;bit2,3,保留//bit4,TX FIFO空標志;bit5,TX FIFO滿標志;bit6,1,循環發送上一數據包.0,不循環; // void NRF24L01_Init(void); //初始化 void NRF24L01_RX_Mode(void); //配置為接收模式 void NRF24L01_TX_Mode(void); //配置為發送模式 u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 u8s);//寫數據區 u8 NRF24L01_Read_Buf(u8 reg, u8 *pBuf, u8 u8s); //讀數據區 u8 NRF24L01_Read_Reg(u8 reg); //讀寄存器 u8 NRF24L01_Write_Reg(u8 reg, u8 value); //寫寄存器 u8 NRF24L01_Check(void); //檢查24L01是否存在 u8 NRF24L01_TxPacket(u8 *txbuf); //發送一個包的數據 u8 NRF24L01_RxPacket(u8 *rxbuf); //接收一個包的數據#endifNRF24L01.c
#include "NRF24L01.h" #include "stm32f10x.h"u8 tx_buf[33]="哞哞 "; u8 rx_buf[33]={0};const u8 TX_ADDRESS[TX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01}; //發送地址 const u8 RX_ADDRESS[RX_ADR_WIDTH]={0x34,0x43,0x10,0x10,0x01};//初始化24L01的IO口 void NRF24L01_Init(void) { GPIO_InitTypeDef GPIO_InitStructure;SPI_InitTypeDef SPI_InitStructure; //使能PB,F,D端口時鐘 //PF8-CE PF9-CSN PD3-IRQRCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //PG13上拉 防止EN25X的干擾GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOG, &GPIO_InitStructure); //初始化指定IOGPIO_SetBits(GPIOG,GPIO_Pin_13);//上拉GPIO_InitStructure.GPIO_Pin = NRF24L01_CSN|NRF24L01_CE; //PF8 9 推挽 GPIO_Init(NRF24L01_Port, &GPIO_InitStructure);//初始化指定IOGPIO_ResetBits(NRF24L01_Port,NRF24L01_CSN|NRF24L01_CE);//PF6,7,8下拉GPIO_InitStructure.GPIO_Pin = NRF24L01_IRQ; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //PD3 輸入 GPIO_Init(NRF24L01_Port, &GPIO_InitStructure);GPIO_ResetBits(NRF24L01_Port,NRF24L01_IRQ);//PD3下拉SPI2_Init(); //初始化SPI SPI_Cmd(SPI2, DISABLE); // SPI外設不使能SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; //SPI設置為雙線雙向全雙工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //SPI主機SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; //發送接收8位幀結構SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; //時鐘懸空低SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //數據捕獲于第1個時鐘沿SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由軟件控制SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; //定義波特率預分頻的值:波特率預分頻值為16SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //數據傳輸從MSB位開始SPI_InitStructure.SPI_CRCPolynomial = 7; //CRC值計算的多項式SPI_Init(SPI2, &SPI_InitStructure); //根據SPI_InitStruct中指定的參數初始化外設SPIx寄存器SPI_Cmd(SPI2, ENABLE); //使能SPI外設NRF24L01_CE_L; //使能24L01NRF24L01_CSN_H; //SPI片選取消 }//檢測24L01是否存在 //返回值:0,成功;1,失敗 u8 NRF24L01_Check(void) {u8 buf[5]={0XA5,0XA5,0XA5,0XA5,0XA5};u8 i;SPI2_SetSpeed(SPI_BaudRatePrescaler_4); //spi速度為9Mhz(24L01的最大SPI時鐘為10Mhz) NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,buf,5);//寫入5個字節的地址. NRF24L01_Read_Buf(TX_ADDR,buf,5); //讀出寫入的地址 for(i=0;i<5;i++)if(buf[i]!=0XA5)break; if(i!=5)return 1;//檢測24L01錯誤 return 0; //檢測到24L01 }//SPI寫寄存器 //reg:指定寄存器地址 //value:寫入的值 u8 NRF24L01_Write_Reg(u8 reg,u8 value) {u8 status; NRF24L01_CSN_L; //使能SPI傳輸status =SPI2_ReadWriteByte(reg);//發送寄存器號 SPI2_ReadWriteByte(value); //寫入寄存器的值NRF24L01_CSN_H; //禁止SPI傳輸 return(status); //返回狀態值 }//讀取SPI寄存器值 //reg:要讀的寄存器 u8 NRF24L01_Read_Reg(u8 reg) {u8 reg_val; NRF24L01_CSN_L; //使能SPI傳輸 SPI2_ReadWriteByte(reg); //發送寄存器號reg_val=SPI2_ReadWriteByte(0XFF);//讀取寄存器內容NRF24L01_CSN_H; //禁止SPI傳輸 return(reg_val); //返回狀態值 } //在指定位置讀出指定長度的數據 //reg:寄存器(位置) //*pBuf:數據指針 //len:數據長度 //返回值,此次讀到的狀態寄存器值 u8 NRF24L01_Read_Buf(u8 reg,u8 *pBuf,u8 len) {u8 status,u8_ctr; NRF24L01_CSN_L; //使能SPI傳輸status=SPI2_ReadWriteByte(reg);//發送寄存器值(位置),并讀取狀態值 for(u8_ctr=0;u8_ctr<len;u8_ctr++)pBuf[u8_ctr]=SPI2_ReadWriteByte(0XFF);//讀出數據NRF24L01_CSN_H; //關閉SPI傳輸return status; //返回讀到的狀態值 }//在指定位置寫指定長度的數據 //reg:寄存器(位置) //*pBuf:數據指針 //len:數據長度 //返回值,此次讀到的狀態寄存器值 u8 NRF24L01_Write_Buf(u8 reg, u8 *pBuf, u8 len) {u8 status,u8_ctr; NRF24L01_CSN_L; //使能SPI傳輸status = SPI2_ReadWriteByte(reg);//發送寄存器值(位置),并讀取狀態值for(u8_ctr=0; u8_ctr<len; u8_ctr++)SPI2_ReadWriteByte(*pBuf++); //寫入數據 NRF24L01_CSN_H; //關閉SPI傳輸return status; //返回讀到的狀態值 } //啟動NRF24L01發送一次數據 //txbuf:待發送數據首地址 //返回值:發送完成狀況 u8 NRF24L01_TxPacket(u8 *txbuf) {u8 sta;SPI2_SetSpeed(SPI_BaudRatePrescaler_4);//spi速度為9Mhz(24L01的最大SPI時鐘為10Mhz) NRF24L01_CE_L;NRF24L01_Write_Buf(WR_TX_PLOAD,txbuf,TX_PLOAD_WIDTH);//寫數據到TX BUF 32個字節NRF24L01_CE_H;//啟動發送 while(GPIO_ReadOutputDataBit(NRF24L01_Port,NRF24L01_IRQ)!=0);//等待發送完成sta = NRF24L01_Read_Reg(STATUS); //讀取狀態寄存器的值 NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標志if(sta&MAX_TX)//達到最大重發次數{NRF24L01_Write_Reg(FLUSH_TX,0xff);//清除TX FIFO寄存器 return MAX_TX; }if(sta&TX_OK)//發送完成{return TX_OK;}return 0xff;//其他原因發送失敗 }//啟動NRF24L01發送一次數據 //txbuf:待發送數據首地址 //返回值:0,接收完成;其他,錯誤代碼 u8 NRF24L01_RxPacket(u8 *rxbuf) {u8 sta; SPI2_SetSpeed(SPI_BaudRatePrescaler_8); //spi速度為9Mhz(24L01的最大SPI時鐘為10Mhz) sta=NRF24L01_Read_Reg(STATUS); //讀取狀態寄存器的值 NRF24L01_Write_Reg(NRF_WRITE_REG+STATUS,sta); //清除TX_DS或MAX_RT中斷標志if(sta&RX_OK)//接收到數據{NRF24L01_Read_Buf(RD_RX_PLOAD,rxbuf,RX_PLOAD_WIDTH);//讀取數據NRF24L01_Write_Reg(FLUSH_RX,0xff);//清除RX FIFO寄存器 return 0; } return 1;//沒收到任何數據 } //該函數初始化NRF24L01到RX模式 //設置RX地址,寫RX數據寬度,選擇RF頻道,波特率和LNA HCURR //當CE變高后,即進入RX模式,并可以接收數據了 void NRF24L01_RX_Mode(void) {NRF24L01_CE_L; NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH);//寫RX節點地址NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自動應答 NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01);//使能通道0的接收地址 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //設置RF通信頻率 NRF24L01_Write_Reg(NRF_WRITE_REG+RX_PW_P0,RX_PLOAD_WIDTH);//選擇通道0的有效數據寬度 NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f);//設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟 NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG, 0x0f);//配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式 NRF24L01_CE_H; //CE為高,進入接收模式 } //該函數初始化NRF24L01到TX模式 //設置TX地址,寫TX數據寬度,設置RX自動應答的地址,填充TX發送數據,選擇RF頻道,波特率和LNA HCURR //PWR_UP,CRC使能 //當CE變高后,即進入RX模式,并可以接收數據了 //CE為高大于10us,則啟動發送. void NRF24L01_TX_Mode(void) { NRF24L01_CE_L; NRF24L01_Write_Buf(NRF_WRITE_REG+TX_ADDR,(u8*)TX_ADDRESS,TX_ADR_WIDTH);//寫TX節點地址 NRF24L01_Write_Buf(NRF_WRITE_REG+RX_ADDR_P0,(u8*)RX_ADDRESS,RX_ADR_WIDTH); //設置TX節點地址,主要為了使能ACK NRF24L01_Write_Reg(NRF_WRITE_REG+EN_AA,0x01); //使能通道0的自動應答 NRF24L01_Write_Reg(NRF_WRITE_REG+EN_RXADDR,0x01); //使能通道0的接收地址 NRF24L01_Write_Reg(NRF_WRITE_REG+SETUP_RETR,0x1a);//設置自動重發間隔時間:500us + 86us;最大自動重發次數:10次NRF24L01_Write_Reg(NRF_WRITE_REG+RF_CH,40); //設置RF通道為40NRF24L01_Write_Reg(NRF_WRITE_REG+RF_SETUP,0x0f); //設置TX發射參數,0db增益,2Mbps,低噪聲增益開啟 NRF24L01_Write_Reg(NRF_WRITE_REG+CONFIG,0x0e); //配置基本工作模式的參數;PWR_UP,EN_CRC,16BIT_CRC,接收模式,開啟所有中斷NRF24L01_CE_H;//CE為高,10us后啟動發送 }main.c
#include "stm32f10x.h" #include "main.h" #include "delay.h" #include "sys.h" #include "USART.h" #include "NRF24L01.h"extern u8 tx_buf[33];//外部變量 頭文件定義了 extern u8 rx_buf[33];int main(void) {initSysTick();USART_init();//串口初始化 串口重定向printf打印調試使用NRF24L01_Init();while(NRF24L01_Check()) //檢測NRF24L01是否存在{printf("Error \n "); }printf("Success \n "); NRF24L01_TX_Mode(); //發送模式while(1){ //發送函數 無線射頻發送出去if(NRF24L01_TxPacket(tx_buf) == MAX_TX){printf("發送成功 數據為 %s \n",tx_buf); }} }串口打印調試
USART.h
USART.c
#include "USART.h"int fputc(int ch,FILE *p) //函數默認的,在使用printf函數時自動調用 {USART_SendData(USART1,(u8)ch); while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);return ch; }/******************************************************************************* * 函 數 名 : printf_init * 函數功能 : IO端口及串口1,時鐘初始化函數 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void USART_init() //printf初始化 {GPIO_InitTypeDef GPIO_InitStructure; //聲明一個結構體變量,用來初始化GPIONVIC_InitTypeDef NVIC_InitStructure; //中斷結構體定義USART_InitTypeDef USART_InitStructure; //串口結構體定義RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TXGPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RXGPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);USART_InitStructure.USART_BaudRate=9600; //波特率設置為9600USART_InitStructure.USART_WordLength=USART_WordLength_8b;USART_InitStructure.USART_StopBits=USART_StopBits_1;USART_InitStructure.USART_Parity=USART_Parity_No;USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;USART_Init(USART1,&USART_InitStructure);USART_Cmd(USART1, ENABLE);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//使能或者失能指定的USART中斷 接收中斷USART_ClearFlag(USART1,USART_FLAG_TC);//清除USARTx的待處理標志位 }總結
以上是生活随笔為你收集整理的STM32使用SPI通信驱动2.4G无线射频模块发送数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP.NET(c#)实现重定向的三种方
- 下一篇: websocket + node.js聊