娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年08月26日(星期一)

正在發生

2021年08月26日 | STM32 SPI NRF24L01復習整理

發布者:CuriousTraveler 來源: eefocus關鍵字:STM32  SPI  NRF24L01 手機看文章 掃描二維碼
隨時隨地手機看文章

/********** mySpi.h****************/


#ifndef __MY_SPI_H

#define __MY_SPI_H


#include "stm32f10x.h"

#include


#define SPI1_CSN_HIGH() GPIO_SetBits(GPIOA,GPIO_Pin_1);

#define SPI1_CSN_LOW() GPIO_ResetBits(GPIOA,GPIO_Pin_1);


#define SPI2_CSN_HIGH() GPIO_SetBits(GPIOB,GPIO_Pin_12);

#define SPI2_CSN_LOW() GPIO_ResetBits(GPIOB,GPIO_Pin_12);


void mySpi1Config(void);

u8 mySpi1SendByte(u8 byte);

void mySpi2Config(void);

u8 mySpi2SendByte(u8 byte);


#endif


/**********mySpi.c************/


#include "mySpi.h"


void mySpi1Config(void)


{


  SPI_InitTypeDef  SPI_InitStructure;


  GPIO_InitTypeDef GPIO_InitStructure;


  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);


  //SCK,MISO,MOSI  GPIOA^5,GPIOA^6,GPIOA^7 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用功能

  GPIO_Init(GPIOA, &GPIO_InitStructure);  


  //CSN   GPIOA^1

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOA, &GPIO_InitStructure);


  SPI1_CSN_HIGH(); 


  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_Low; //時鐘空閑時為低

 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第一個邊沿有效

  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由軟件產生

  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;  //8分頻=9MHz

  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;   //高位在前

  SPI_InitStructure.SPI_CRCPolynomial = 7;

  SPI_Init(SPI1, &SPI_InitStructure);


  SPI_Cmd(SPI1, ENABLE);

}


void mySpi2Config(void)

{


  SPI_InitTypeDef  SPI_InitStructure;


  GPIO_InitTypeDef GPIO_InitStructure;


 

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

  RCC_APB1PeriphClockCmd(RCC_APB2Periph_SPI2, ENABLE);


  //SCK,MISO,MOSI  GPIOB^13,GPIOB^14 GPIOB^15 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復用功能

  GPIO_Init(GPIOB, &GPIO_InitStructure);  


  //CSN   GPIOB^12

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOB, &GPIO_InitStructure);


  SPI2_CSN_HIGH(); 


  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_Low; //時鐘空閑時為低

 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; //第一個邊沿有效

  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; //NSS信號由軟件產生

  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;  //8分頻=9MHz

  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;   //高位在前

  SPI_InitStructure.SPI_CRCPolynomial = 7;

  SPI_Init(SPI2, &SPI_InitStructure);


  SPI_Cmd(SPI2, ENABLE);

}


u8 mySpi1SendByte(u8 byte)

{   

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);// 當SPI發送緩存不為空

  SPI_I2S_SendData(SPI1, byte);//通過SPI發送數據

  while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET); //當SPI接收緩存不為空


  return SPI_I2S_ReceiveData(SPI1);  //讀取緩存數據

}


u8 mySpi2SendByte(u8 byte)

{   

  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) == RESET);// 當SPI發送緩存不為空

  SPI_I2S_SendData(SPI2, byte);//通過SPI發送數據

  while (SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_RXNE) == RESET); //當SPI接收緩存不為空


  return SPI_I2S_ReceiveData(SPI2);  //讀取緩存數據

}




/***********myNRF24L01.h********************/


#ifndef __MY_NRF24L01_H

#define __MY_NRF24L01_H


#include "stm32f10x.h"

#include


/**********  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  // 空操作-用于讀狀態寄存器


/**********  NRF24L01寄存器地址   *************/

#define CONFIG          0x00  // 配置寄存器地址      

#define EN_AA           0x01  // 使能自動應答功能

#define EN_RXADDR       0x02  //接收地址允許

#define SETUP_AW        0x03  // 設置地址寬度

#define SETUP_RETR      0x04  //建立自動重發

#define RF_CH           0x05  //RF通道

#define RF_SETUP        0x06  // RF寄存器

#define STATUS          0x07  //狀態寄存器

#define OBSERVE_TX      0x08  //發送檢測寄存器

#define CD              0x09  // 載波檢測寄存器

#define RX_ADDR_P0      0x0A  //數據通道0接收地址

#define RX_ADDR_P1      0x0B  // 數據通道1接收地址

#define RX_ADDR_P2      0x0C  // 數據通道2接收地址

#define RX_ADDR_P3      0x0D  //數據通道3接收地址

#define RX_ADDR_P4      0x0E  //數據通道4接收地址

#define RX_ADDR_P5      0x0F  //數據通道5接收地址

#define TX_ADDR         0x10  // 發送地址寄存器

#define RX_PW_P0        0x11  // 接收數據通道0有效數據寬度(1~32字節) 

#define RX_PW_P1        0x12  // 接收數據通道1有效數據寬度(1~32字節) 

#define RX_PW_P2        0x13  // 接收數據通道2有效數據寬度(1~32字節) 

#define RX_PW_P3        0x14  // 接收數據通道3有效數據寬度(1~32字節) 

#define RX_PW_P4        0x15  // 接收數據通道4有效數據寬度(1~32字節) 

#define RX_PW_P5        0x16  // 接收數據通道5有效數據寬度(1~32字節) 

#define FIFO_STATUS     0x17  // FIFO狀態寄存器


/******   STATUS寄存器BIT位定義     *******/

#define MAX_TX   0x10     //達到最大發送次數中斷

#define TX_OK    0x20     //TX發送完成中斷

#define RX_OK    0x40     //接收到數據中斷


void myNrfConfig(void);

u8 myNrfWriteReg(u8 reg,u8 dat);

u8 myNrfReadReg(u8 reg);

u8 myNrfWriteBuf(u8 reg,u8 *pBuf,u8 byte);

u8 myNrfReadBuf(u8 reg,u8 *pBuf,u8 byte);

u8 myNrfCheck(void);

void myNrfRxMode(void);

void myNrfTxMode(void);

u8 myNrfTxDat(u8 *txbuf);

u8 myNrfRxDat(u8 *rxbuf);


#endif


/*******************myNRF24L01.c*********************/


#include "myNRF24L01.h"

#include "mySpi.h"


#define NRF_CE_HIGH()  GPIO_SetBits(GPIOA,GPIO_Pin_2);

#define NRF_CE_LOW()   GPIO_ResetBits(GPIOA,GPIO_Pin_2);

#define NRF_READ_IRQ() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_3)  //IRQ


#define myNrfSpiConfig   mySpi1Config   //替換NRF的SPI配置函數

#define myNrfSpiSendByte mySpi1SendByte //替換NRF的SPI讀寫函數

#define NRF_CSN_LOW  SPI1_CSN_LOW //替換NRF的SPI的CSN宏定義

#define NRF_CSN_HIGH SPI1_CSN_HIGH 


#define CHANAL 0 //頻道選擇


#define TX_ADR_WIDTH    5     //5字節地址寬度

#define RX_ADR_WIDTH    5     //5字節地址寬度

#define TX_PLOAD_WIDTH  32    //32字節有效數據寬度


#define RX_PLOAD_WIDTH  32    //32字節有效數據寬度


 u8 RX_BUF[RX_PLOAD_WIDTH]; //接收數據緩存

 u8 TX_BUF[TX_PLOAD_WIDTH]; //發送數據緩存

 u8 TX_ADDRESS[TX_ADR_WIDTH] = {0xFF,0xFF,0xFF,0xFF,0xFF};  //靜態地址

 u8 RX_ADDRESS[RX_ADR_WIDTH] = {0xFF,0xFF,0xFF,0xFF,0xFF};


void myNrfConfig(void)

{

  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

 

  //NRF CE

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

  GPIO_Init(GPIOA, &GPIO_InitStructure);


 //NRF IRQ 

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU ;  //上拉輸入

  GPIO_Init(GPIOA, &GPIO_InitStructure); 

 

 //NRF SPI配置

 myNrfSpiConfig();

}


//指定寄存器寫入指定數據

u8 myNrfWriteReg(u8 reg,u8 dat)

{

  u8 status;

 

  NRF_CE_LOW();

  NRF_CSN_LOW();

 

  status = myNrfSpiSendByte(reg);//

  myNrfSpiSendByte(dat); //

   

  NRF_CSN_HIGH(); 

  return(status);

}



//從指定寄存器讀取數據


u8 myNrfReadReg(u8 reg)

{

  u8 reg_val;


 NRF_CE_LOW();

  NRF_CSN_LOW();

 

 myNrfSpiSendByte(reg); //

 reg_val = myNrfSpiSendByte(NOP); //


 NRF_CSN_HIGH(); 

    

 return reg_val;


//從指定寄存器讀取一串數據

u8 myNrfReadBuf(u8 reg,u8 *pBuf,u8 bytes)

{

  u8 status, byte_cnt;


 NRF_CE_LOW();

 NRF_CSN_LOW();

  

 status = myNrfSpiSendByte(reg); //


 for(byte_cnt=0;byte_cnt {

 pBuf[byte_cnt] = myNrfSpiSendByte(NOP); //

 }


 NRF_CSN_HIGH(); 

 

  return status; //

}


//向指定寄存器寫入一串數據

u8 myNrfWriteBuf(u8 reg ,u8 *pBuf,u8 bytes)

{

  u8 status,byte_cnt;

 

 NRF_CE_LOW();

 NRF_CSN_LOW(); 


 status = myNrfSpiSendByte(reg); 


 for(byte_cnt=0;byte_cnt {

 myNrfSpiSendByte(*pBuf++); //

 }  


 NRF_CSN_HIGH(); 

[1] [2]
關鍵字:STM32  SPI  NRF24L01 引用地址:STM32 SPI NRF24L01復習整理

上一篇:STM32 SysTick 精準延時 簡單分析
下一篇:STM32自帶溫度傳感器

推薦閱讀

有時候我們需要知道自己單片機平臺使用的主頻是多少,因為很多外設都要根據主頻去分配自己的時鐘系統。    RCC_ClocksTypeDef     RCC_Clocks;    RCC_GetClocksFreq(&RCC_Clocks);    系統調試信息: 根據此調試信息,我們可以清楚看到系統分配的時鐘頻率。
智能手機的普及,讓相機成為了人們隨身攜帶的物品。我承認,在智能手機出現之前,無論在什么情況下,我都沒有隨身攜帶過相機,即使是在和妻子約會的時候、在度假的時候(有些是讓我至今仍記憶猶新的地方),或者當孩子在嬉戲的時候。因為我不想只是為了能拍出一些模糊甚至是有紅眼的照片,就要承擔隨身攜帶相機所帶來的一堆事情,這些都不是我想要的。 隨...
// Author : Ma Kai// Date : 2011/05/14// Function : CCP1模塊產生規定占空比的PWM波形// MCU : PIC16F877A// C Compiler : PICC 9.60// IDE : MPLAB IDE v8.10 #include<pic.h>__CONFIG(0x1832);void main(){ T2CON=0X04; //打開定時器2 PR2=0X30; ...
首先按照步驟修改相關信息之后執行make zImage出現了不少錯誤: 其中有代表性的錯誤如下: arch/arm/mach-s3c2440/mach-mini2440.c:189: error: array type has incomplete element type arch/arm/mach-s3c2440/mach-mini2440.c:190: error: array index in non-array initializer arch/arm/mach-s3c2440/mach-mini2440.c:190: error: (ne...

史海拾趣

小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 承德县| 井陉县| 华蓥市| 通州市| 贞丰县| 琼海市| 洛川县| 岚皋县| 广安市| 揭阳市| 莆田市| 通道| 马公市| 昭觉县| 陆良县| 周口市| 左权县| 古蔺县| 云霄县| 灵台县| 齐齐哈尔市| 苏州市| 桐梓县| 通许县| 剑河县| 云南省| 子洲县| 临汾市| 高淳县| 上思县| 西乌| 嘉义县| 张家口市| 邓州市| 屏山县| 永州市| 桐梓县| 贡觉县| 德江县| 新安县| 奉化市|