stm32 nrf905中对nrf初始化之后检测不到nrf是什么人原因

SPI_Cmd(SPI2,DISABLE);//;GPIO_InitStructure.GPIO_;GPIO_InitStructure.GPIO_;GPIO_InitStructure.GPIO_;GPIO_Init(GPIOB,&GPI;GPIO_InitStructure.GPIO_;GPIO_InitStructure.GPIO_;GPIO_
SPI_Cmd(SPI2, DISABLE); //这里还是说一下为什么要先失能SPI2,原因是你不关它在工作就不听你的话了,说的好别扭哦,就像电机在高速运转时你不可能不关电源就云调整它的皮带盘吧,那样以我能想到的结果可能你会被搞出血吧!嘻嘻!
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;//这里的GPIO_InitStructure就用上面调USART时的那个声明就好了因为它的值可以变,是个结构变量,包括下面的。
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);//到此SPI2要用到的I/O已初始化完了;速率50MHZ,作为输出的用的是复用推换输出(PIN13-15),输入的I/O用的是GPIO_Mode_IN_FLOATING(浮空输入)。
SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullD//从这点开始开初初始化SPI,SPI_InitStructure要在之前声名。
SPI_InitStructure.SPI_Mode = SPI_Mode_M
SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
SPI_InitStructure.SPI_CPOL = SPI_CPOL_L
SPI_InitStructure.SPI_CPHA = SPI_CPHA_1E
SPI_InitStructure.SPI_NSS = SPI_NSS_S
SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_256;
SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
SPI_Init(SPI2, &SPI_InitStructure);
SPI_NSSInternalSoftwareConfig(SPI2,SPI_NSSInternalSoft_Set);//到此SPI2的初始化进程完成,主机模式,每帧8位,闲时为低电平,第一个上升沿就采样,片选用软件,波特率预分频256调试时尽量让频率低点只要你赖烦,数据高位先发,
SPI_Cmd(SPI2, ENABLE);//然后打开SPI2开始工作了哦
到底工作没有我说了不能算(调个SPI1都调3、4天的人),让事实说话,我们先用SPI读数据的涵数来读个我们可以控制的数来看对不;
uchar SPI_RW(uchar value)//这个涵数是写数据的但是同时可以读回一个数
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2,value);
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
return SPI_I2S_ReceiveData(SPI2);//这个就是读涵数了是库里面的所以你工程要包涵这些用到的库哟 }
也单独调一下;
Int main(void)
SPI2_AllInit();//刚才写的初始化涵数加到这用一下
USART_SendData(USART1,SPI_RW(0XFF));//这参数0XFF可以是任何8位数据主要是让
SPI_I2S_SendData(SPI2,value);这涵数可以成立也好让SPI产生时钟方便SPI读入数据,SPI_I2S_ReceiveData(SPI2);这个涵数就不会产生时钟用试波器看看吧所以不能单独用它直接收到数据。 }
编译下载后我们打开串口然后把SPI2的MISO连接到3.3V和GND看看分别收到的是什么数,是不是接3.3V时收到的是0XFF,接GND时是不是0X00呀!用SPI1和SPI2对发数据当然更直观了只是我的SPI1用不了了呀!好!到此我们的准备工作算是全部做完了
好我们开始根据NRF2401+的工作流程写驱动吧,之前初始化时用的是SPI_InitStructure.SPI_NSS = SPI_NSS_Soft所以先写个软件驱动I/O呐!片选不能像用51那样CNS=SBIT P0^*了,所以我用涵数来实现吧!
void CSN(uchar value)//不用反回什么值,用个参数来设置I/O为高或低实际可以为BIT变量的 {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//我们用GPIOB的8脚做CSN所以初始化一下该脚
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);//完成初始化
if(value==1)//如果我们赋的是1就执行下面的置1涵数也是库涵数哦
GPIO_SetBits(GPIOB,GPIO_Pin_8);
else//如果我们赋的是0就执行下面的复位涵数也是库涵数哦
GPIO_ResetBits(GPIOB, GPIO_Pin_8);
}//这个涵数我得夸一下我写的好!
再写NRF2041的CE和IRQ(预计用的时间可能不够了)既然CSN的写法好我们再用这方法来写 void CE(uchar value)//表示高低电平的变量,涵数体内部的初始化过程说了好几次了不用说了吧 {
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
if(value==1)
GPIO_SetBits(GPIOB,GPIO_Pin_7);
GPIO_ResetBits(GPIOB, GPIO_Pin_7);
uchar Read_IRQ()//这个要说一下IRQ是NRF2401的中断I/O,为低时表示有数据要处理了所以我们可以用中断涵数来做处理,也可以通过查寻方式来处理它这这里我们让它反回一个值方便用查寻方式来处理
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
readdata=GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_9);
其它的NRF2401的I/O都可以连接到STM32F103C8T6的硬件上,所以不需再做处理(如果再把其它的I/O都做单独处理那你不要用硬件SPI了用51 I/O模拟吧)。
写单个字节进NRF2401寄存器涵数
uchar SPI_RW(uchar value)//要写的值value
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
SPI_I2S_SendData(SPI2,value);
while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET);
return SPI_I2S_ReceiveData(SPI2);
void SPI_RW_REG(uchar reg,uchar value)//这涵数是往指定的NRF2401(uchar reg)里写设定值(uchar value)
delayms(20);//这里的延时涵数大家自已写个吧目的只要是能让I/O反应过来就行(主要是NRF2401
三亿文库包含各类专业文献、幼儿教育、小学教育、中学教育、各类资格考试、行业资料、应用写作文书、高等教育、关于使用STM32硬件SPI驱动NRF24L01_图文72等内容。 
 NRF24L01详细教程_计算机硬件及网络_IT/计算机_专业...2、 发送 32 个字节的数据,接收方接收到正确数据...系列的单片机那么您可以使用硬件的 SPI,将会更加的...  SPI_NRF_Init(),跟踪这个函数的内容,我们可以发现这函数 主要是进行 SPI 的有关配置与 NRF24L01 引脚接入 STM32 GPIO 的有关配置;有关 SPI 配置内容,读者...  NRF24L01_学习笔记_计算机硬件及网络_IT/计算机_...似 乎在单片机四排 IO 口中数 P0 的驱动能力和...使能 AUTO ACK EN_AA SPI_RW_Reg(WRITE_REG +...  nrf24L01配置_计算机硬件及网络_IT/计算机_专业资料。CE CSN SCK MOSI MISO IRQ...SPI指令, F340 无线传 32 字节,是 8 位一组,4 组, STM32F103 一个 8 ...  STM32F103VET6 有俩 SPI 接口,选择用 SPI1 来驱动 NRF24L01. 1.配置 STM32 的 SPI1 接口: 1)开启 GPIOA,AFIO 时钟 2)配置 GPIOA 对应 Pin 为 SPI1 ...  LED 显示 二 nRF2401 无线通信系统的硬件设计本次设计使用的硬件主要是 STM32 ...nRF24L01的控制电路与STM32 控制器的SPI口相连接, 以串行方式进行通信以交换...  stm32spi配置_计算机硬件及网络_IT/计算机_专业资料...(使用 SSI 位)管理 SPI_InitStructure.SPI_...访问 SD Card/W25X16/24L01/JF24C ***...  SPI 口写入 nRF24L01 缓存区,TX_PLD 必须在 CSN...增强其驱动能力(如下图:。若) 使用其它单片机与 ...32:32 个字节 默认为 00 数据通道 1 接收数据...  NRF24L01无线发射简易教程_电子/电路_工程科技_专业...系列的单片机那么您可以使用硬件的 SPI,将会更加的...定义如下: 注意 TX_PLOAD_WIDTH 最大为 32 字节...502 Bad Gateway
502 Bad GatewaySTM32 驱动无线NRF24L01 完成串口数据传输
> STM32 驱动无线NRF24L01 完成串口数据传输
STM32 驱动无线NRF24L01 完成串口数据传输
2401 一个简单的SPI 接口的 2.4G 射频模块 淘宝价20¥,DIY 的17¥ ,算是廉价。这个版本的稳定修正http://ntn314./blog/static//接口CMOS电平3.3V STM32 可直接连接。接受完成 发送完成 出错 都有IRQ 低电平中断产生。程序中 我将其连接至一IO口在外部中断中处里各类事件 但也发现这种处理方式并不是特别灵活,或许直接判断更加灵活。NRF20L01一次可以传输 1~32个字节比较灵活。最初我是根据字符串长来不停的转换每次传输的长度,这样做十分麻烦最后用截取有效串长的方法实现效果很好。程序修修改过 总算稳定了 不过在传输大于32个字节的信息时出错的概率很大,原因暂时不清楚,不过能自动恢复过来。另外在带有硬件的在线仿真调试的时候一定要运行前断开外部硬件的电源再重新连接,保证外部器件的正常初始化。/***********************s****************************/u8 tran=0; //中断标志u8 //定义一个可位寻址的变量stauc8 TX_ADDRESS[TX_ADR_WIDTH] = {0x34,0x43,0x10,0x10,0x01};char RX_BUF[256];uchar TX_BUF[256];/**************************************************/void RF_SPI_Config(void){SPI_InitTypeDef SPI_InitS GPIO_InitTypeDef GPIO_InitSEXTI_InitTypeDef EXTI_InitSRCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);/* PB15-MOSI2,PB13-SCK2*/ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14 | GPIO_Pin_15; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);//IRQGPIO_SetBits(GPIOB, GPIO_Pin_0);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(GPIOB, &GPIO_InitStructure);GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);/* 配置中断线0为下降触发*/EXTI_InitStructure.EXTI_Line = EXTI_Line0;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_IEXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_FEXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure); /*PB2-CS*/GPIO_SetBits(GPIOB, GPIO_Pin_2);//预置为高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure);/*PC4-A0*/GPIO_SetBits(GPIOC, GPIO_Pin_4);//预置为高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOC, &GPIO_InitStructure);/*LED*/GPIO_SetBits(GPIOB, GPIO_Pin_12);//预置为高 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOB, &GPIO_InitStructure); /* SPI2 configuration */SPI_Cmd(SPI2, DISABLE); //必须先禁能,才能改变MODE SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullD//两线全双工 SPI_InitStructure.SPI_Mode = SPI_Mode_M//主 SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;//8位 SPI_InitStructure.SPI_CPOL = SPI_CPOL_L//CPOL=0 时钟悬空低 SPI_InitStructure.SPI_CPHA = SPI_CPHA_1E//CPHA=0 数据捕获第1个 SPI_InitStructure.SPI_NSS = SPI_NSS_S//软件NSS SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_64 ;//64分频 SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;//高位在前 SPI_InitStructure.SPI_CRCPolynomial = 7;//CRC7SPI_Init(SPI2, &SPI_InitStructure); SPI_Cmd(SPI2, ENABLE);}/**************************************************************但切记不可忽略SPI的硬件接收,因为读SPI_DR才能清除RXEN***************************************************************/u8 SPI_RW(u8 byte){/*等待发送寄存器空*/while((SPI2->SR & SPI_I2S_FLAG_TXE)==RESET); /*发送一个字节*/SPI2->DR =/* 等待接收寄存器有效*/while((SPI2->SR & SPI_I2S_FLAG_RXNE)==RESET);return(SPI2->DR);}/**************************************************函数:SPI_RW_Reg()描述:写数据value到reg寄存器*************************************************/u8 SPI_RW_Reg(u8 reg, u8 value){u8 CSN_L; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 SPI_RW(value); // 然后写数据到该寄存器 CSN_H; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器}/**************************************************函数: init_io()描述:初始化IO*************************************************/void RX_Mode(void);void init_io(void){CE_L; // 待机CSN_H; // SPI禁止LED1;// 关闭指示灯RX_Mode();//接收}/**************************************************函数:SPI_Read()描述:从reg寄存器读一字节*************************************************/u8 SPI_Read(u8 reg){u8 reg_ CSN_L; // CSN置低,开始传输数据 SPI_RW(reg); // 选择寄存器 reg_val = SPI_RW(0); // 然后从该寄存器读数据 CSN_H; // CSN拉高,结束数据传输 return(reg_val); // 返回寄存器数据}/**************************************************函数:SPI_Read_Buf()描述:从reg寄存器读出bytes个字节,通常用来读取接收通道 数据或接收/发送地址*************************************************/uchar SPI_Read_Buf(uchar reg, char * pBuf, uchar bytes){uchar status, CSN_L; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 for(i=0; i< i++) pBuf[i] = SPI_RW(0); // 逐个字节从nRF24L01读出 CSN_H; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器}/**************************************************函数:SPI_Write_Buf()描述:把pBuf缓存中的数据写入到nRF24L01,通常用来写入发 射通道数据或接收/发送地址*************************************************/uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes){uchar status, CSN_L; // CSN置低,开始传输数据 status = SPI_RW(reg); // 选择寄存器,同时返回状态字 for(i=0; i< i++) SPI_RW(pBuf[i]); // 逐个字节写入nRF24L01 CSN_H; // CSN拉高,结束数据传输 return(status); // 返回状态寄存器}/**************************************************函数:RX_Mode()描述:这个函数设置nRF24L01为接收模式,等待接收发送设备的数据包*************************************************/void RX_Mode(void){CE_L; SPI_Write_Buf(RF_WRITE_REG + RX_ADDR_P0, (u8*)TX_ADDRESS, TX_ADR_WIDTH); // 接收设备接收通道0使用和发送设备相同的发送地址 SPI_RW_Reg(RF_WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(RF_WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(RF_WRITE_REG + RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(RF_WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0选择和发送通道相同有效数据宽度 SPI_RW_Reg(RF_WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(RF_WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校验,上电,接收模式 CE_H; // 拉高CE启动接收设备}/**************************************************函数:TX_Mode()描述: 这个函数设置nRF24L01为发送模式,(CE=1持续至少10us),130us后启动发射,数据发送结束后,发送模块自动转入接收模式等待应答信号。*************************************************/void TX_Mode(uchar * BUF){CE_L; SPI_Write_Buf(RF_WRITE_REG + TX_ADDR, (u8*)TX_ADDRESS, TX_ADR_WIDTH); // 写入发送地址 SPI_Write_Buf(RF_WRITE_REG + RX_ADDR_P0, (u8*)TX_ADDRESS, TX_ADR_WIDTH); // 为了应答接收设备,接收通道0地址和发送地址相同 SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 写数据包到TX FIFO SPI_RW_Reg(RF_WRITE_REG + EN_AA, 0x01); // 使能接收通道0自动应答 SPI_RW_Reg(RF_WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0 SPI_RW_Reg(RF_WRITE_REG + SETUP_RETR, 0x0a); // 自动重发延时等待250us+86us,自动重发10次 SPI_RW_Reg(RF_WRITE_REG + RF_CH, 40); // 选择射频通道0x40 SPI_RW_Reg(RF_WRITE_REG + RF_SETUP, 0x07); // 数据传输率1Mbps,发射功率0dBm,低噪声放大器增益 SPI_RW_Reg(RF_WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校验,上电CE_H;CE_H;delay_ms(1);}/**************************************************函数:Check_ACK()描述: 检查接收设备有无接收到数据包,设定没有收到应答信号是否重发***************************************************/uchar Check_ACK(u8 clear){while(IRQ);sta = SPI_RW(NOP); // 返回状态寄存器if(MAX_RT)if(clear) // 是否清除TX FIFO,若没有清除在清除MAX_RT中断标志后重发SPI_RW(FLUSH_TX);SPI_RW_Reg(RF_WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志IRQ_H;if(TX_DS)return(0x00);elsereturn(0xff);}void sent_data(u8* fp,u16 flong){u16 i=65535;TX_Mode((u8*)&flong); //传送长度while(!tran&&i>1)i--; //等待完成tran=0;flong=flong/33+1;for(i=0;i<20000;i++);//130uS*2延时while(flong){if(MAX_RT)//无应答返回TX_Mode(fp); //传送数据while(!tran&&i>1)i--; //等待完成tran=0;for(i=0;i<20000;i++);//130uS*2延时fp+=32;flong--;}}extern u8 RX_NU;void test (void){if (Uart2_Get_Flag!=0&&Timer2==0){ sent_data(TX_BUF,(u16)Uart2_Get_Flag); Uart2_Get_Flag=0;}if(Timer2==0&&RX_NU==2){RX_NU=1;USART2_Puts("传输错误 ");USART2_Puts("\r\n");}}两个中断 串口 和 外部中断/******************************************************************************** Function Name : EXTI0_IRQHandler* Description : This function handles External interrupt Line 0 request.* Input : None* Output : None* Return : None*******************************************************************************/extern u8extern char RX_BUF[256];extern uchar TX_BUF[256];extern u8 SPI_RW_Reg(u8 reg, u8 value);extern void RX_Mode(void);extern uchar SPI_Read_Buf(uchar reg, char * pBuf, uchar bytes);u8 RX_NU=1;//1接收长度 2接收数据u16 rectnu, //接收串长,接收次数char* PRX_BUF=RX_BUF;void EXTI0_IRQHandler(void){ EXTI_ClearITPendingBit(EXTI_Line0);tran=1;CSN_L;sta=SPI_RW(NOP); // 返回状态寄存器CSN_H;if(MAX_RT){USART2_Puts("对方无应答 ");CSN_L;SPI_RW(FLUSH_TX); // 清除TX FIFO,若没有清除在清除MAX_RT中断标志后重发CSN_H;SPI_RW_Reg(RF_WRITE_REG + STATUS, sta);} if(TX_DS){ SPI_RW_Reg(RF_WRITE_REG + STATUS, sta); // 清除TX_DS或MAX_RT中断标志} if(RX_DR)
// 判断是否接受到数据{if(RX_NU==1){ CE_L; SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH); // 从RX FIFO读出数据 SPI_RW_Reg(RF_WRITE_REG + STATUS, sta); // 清除RX_DS中断标志 rectnu=RX_BUF[0];rectnu|=RX_BUF[1]<<8; //接收串长 onerc=rectnu/33+1; //计算接收次数 RX_NU=2;RX_Mode();Timer2=500;/*超时时间*/}if(RX_NU==2){
CE_L; SPI_Read_Buf(RD_RX_PLOAD, PRX_BUF, TX_PLOAD_WIDTH); // 从RX FIFO读出数据 SPI_RW_Reg(RF_WRITE_REG + STATUS, sta); // 清除RX_DS中断标志 onerc--;PRX_BUF+=32; //接收计数 接收指针移动if(!onerc){ RX_BUF[rectnu]=\0; //截取有效串长 USART2_Puts(RX_BUF); //串口发送接收到的字符 USART2_Puts("\r\n"); PRX_BUF=RX_BUF; //恢复指针 RX_NU=1;} RX_Mode();Timer2=200;/*超时时间*/} } LED; RX_Mode();}/******************************************************************************** Function Name : USART2_IRQHandler* Description : This function handles USART2 global interrupt request.* Input : None* Output : None* Return : None*******************************************************************************/extern u16 Uart2_Get_Fextern u8 Uart2_Get_Dextern u8 TX_BUF[256];void USART2_IRQHandler(void){//接收中断if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET){Timer2=500;//500MS后nfr2401发送USART_ClearITPendingBit(USART2,USART_IT_RXNE);TX_BUF[Uart2_Get_Flag]=USART_ReceiveData(USART2);Uart2_Get_Flag++;//USART2_Puts(TX_BUF);}//溢出-如果发生溢出需要先读SR,再读DR寄存器 则可清除不断入中断的问题if(USART_GetFlagStatus(USART2,USART_FLAG_ORE)==SET){USART_ClearFlag(USART2,USART_FLAG_ORE);//读SRUSART_ReceiveData(USART2);//读DR}}本文引用地址:在 外部中断中 可以一次传输最少要两次 第一次RX_NU==1 用来接收此次传输的数据长度 用来截取有效串长,第二次RX_NU==2 就收数据放到数组里 若是数据长于32个字节就分多次传输。其中引入 超时机制 若是200/500 MS 后传输还没完成(RX_NU再次 等于1)就放弃接收数据 直接接收再次新的串长度。这个机制很重要但还有待完善。串口中也一样500MS 还没新的数据进来就说明串口接收完成 之后就发送数据。Uart2_Get_Flag 当然就是串长了。NRF24L01 可以参考其数据手册 都是中文好说好说~~这里就不提了。#ifndef _API_DEF_#define _API_DEF_// Define interface to nRF24L01//* Define SPI pins/*sbit CE = P1^0; // Chip Enable pin signal (output)sbit CSN = P1^1; // Slave Select pin, (output to CSN, nRF24L01)sbit IRQ = P1^3; // Interrupt signal, from nRF24L01 (input)sbit MISO = P1^4; // Master In, Slave Out pin (input)sbit MOSI = P1^5; // Serial Clock pin, (output)sbit SCK = P1^7; // Master Out, Slave In pin (output)*/// SPI(nRF24L01) commands#define RF_READ_REG 0x00 // Define read command to register#define RF_WRITE_REG 0x20 // Define write command to register#define RD_RX_PLOAD 0x61 // Define RX payload register address#define WR_TX_PLOAD 0xA0 // Define TX payload register address#define FLUSH_TX 0xE1 // Define flush TX register command#define FLUSH_RX 0xE2 // Define flush RX register command#define REUSE_TX_PL 0xE3 // Define reuse TX payload register command#define NOP 0xFF // Define No Operation, might be used to read status register// SPI(nRF24L01) registers(addresses)#define CONFIG 0x00 // Config register address#define EN_AA 0x01 // Enable Auto Acknowledgment register address#define EN_RXADDR 0x02 // Enabled RX addresses register address#define SETUP_AW 0x03 // Setup address width register address#define SETUP_RETR 0x04 // Setup Auto. Retrans register address#define RF_CH 0x05 // RF channel register address#define RF_SETUP 0x06 // RF setup register address#define STATUS 0x07 // Status register address#define OBSERVE_TX 0x08 // Observe TX register address#define CD 0x09 // Carrier Detect register address#define RX_ADDR_P0 0x0A // RX address pipe0 register address#define RX_ADDR_P1 0x0B // RX address pipe1 register address#define RX_ADDR_P2 0x0C // RX address pipe2 register address#define RX_ADDR_P3 0x0D // RX address pipe3 register address#define RX_ADDR_P4 0x0E // RX address pipe4 register address#define RX_ADDR_P5 0x0F // RX address pipe5 register address#define TX_ADDR 0x10 // TX address register address#define RX_PW_P0 0x11 // RX payload width, pipe0 register address#define RX_PW_P1 0x12 // RX payload width, pipe1 register address#define RX_PW_P2 0x13 // RX payload width, pipe2 register address#define RX_PW_P3 0x14 // RX payload width, pipe3 register address#define RX_PW_P4 0x15 // RX payload width, pipe4 register address#define RX_PW_P5 0x16 // RX payload width, pipe5 register address#define FIFO_STATUS 0x17 // FIFO Status Register register address#endif /* _API_DEF_ */#ifndef HAL_H#define HAL_H//硬件初始化extern void ChipHalInit(void);extern void ChipOutHalInit(void);extern void delay_ms(u16 dly_ms);extern void USART_Configuration(void);extern void RF_SPI_Config(void);extern volatile u16 Timer1,Timer2;//RF_2401extern void init_io(void);extern void test (void);extern u8//中断进入标志extern u8 SPI_Read(u8 reg);extern u8 SPI_RW(u8 byte);#define TX_ADR_WIDTH 5 // 5字节宽度的发送/接收地址#define TX_PLOAD_WIDTH 32 // 接收字节数32个字#define uchar u8/*控制引脚*/#define CE_HGPIOC->BSRR=GPIO_Pin_4#define CE_LGPIOC->BRR=GPIO_Pin_4#define CSN_HGPIOB->BSRR=GPIO_Pin_2#define CSN_LGPIOB->BRR=GPIO_Pin_2#define IRQ(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0))#define IRQ_HGPIOB->BSRR=GPIO_Pin_0#define LED1GPIOB->BSRR=GPIO_Pin_12#define LED0GPIOB->BRR=GPIO_Pin_12#define LED GPIOB->ODR=((GPIOD->ODR)^GPIO_Pin_12)#define RX_DR ((sta>>6)&0X01)#define TX_DS ((sta>>5)&0X01)#define MAX_RT ((sta>>4)&0X01)//USARTextern void USART2_Putc(unsigned char c);extern void USART2_Puts(char * str);extern u16 Uart2_Get_F//串口2接收到数据长度extern u8 Uart2_Get_D//串口2接收的数据#endif中断用前注意优先级的设置#include "STM32Lib\\stm32f10x.h"void NVIC_Configuration(void){NVIC_InitTypeDef NVIC_InitS/* 配置中断使用组合1*/NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/* EXTI0*/NVIC_InitStructure.NVIC_IRQChannel =EXTI0_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure); /* Configure one bit for preemption priority */NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);/*UART2*/NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);}
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一}

我要回帖

更多关于 stm32 nrf24l01 adc 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信