微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > stm32 NRF24L01+USART搞定有线和无线通信

stm32 NRF24L01+USART搞定有线和无线通信

时间:11-19 来源:互联网 点击:

个data之后要监听是否发送完成才能进行下次发送~

1 void USART_SendChar(USART_TypeDef* USARTx,uint8_t data){2     USART_SendData(USARTx,data);3     while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)==RESET);4 }

接下来进入while循环,不断进行监听看是否有串口接收标志位置1或者无线模块接收标志位置1,如果有表明相应的有数据从该通道传送过来。当是从串口传来的数据表明数据是从上位机发送来的数据,并且想把该数据通过2.4G发送出去,所以这里调用:NRF_Send_Data(TxBufferRF,sizeof(TxBufferRF));将数据发送出去;当数据是从2.4G通道中传过来的,表明数据是从下位机传送过来的想给上位机,于是调用串口发送函数将数据发送给上位机:USART_SendChar(USART1,TxBufferUSART[i]);

看了上图适配器端的数据交换过程就明白了串口中断和无线中断大致要干的事了,这里我就不多介绍,看看下面的代码就明白了(在stm32f10x_it.c中),要再次提醒的是无论是串口还是无线其接收都是采用中断,而发送采用循环直接发送,他们的中断和中断向量有关并要在stm32f10x_it.c里实现相应的中断子程序~



1 /******************************************************************************/2 /*            STM32F10x Peripherals Interrupt Handlers                        */3 /******************************************************************************/4 5 /**6   * @brief  This function handles USART1 global interrupt request.7   * @param  None8   * @retval : None9   */10 void USART1_IRQHandler(void)      //串口1 中断服务程序11 {12   unsigned int i;13   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)       //判断读寄存器是否非空14   {    15     16     RxBufferUSART[RxCounter1++] = USART_ReceiveData(USART1);   //将读寄存器的数据缓存到接收缓冲区里17     18     if(RxBufferUSART[RxCounter1-2]==0x0d&&RxBufferUSART[RxCounter1-1]==0x0a)     //判断结束标志是否是0x0d 0x0a19     {20       for(i=0; i< RxCounter1; i++) TxBufferRF[i] = RxBufferUSART[i];          //将接收缓冲器的数据转到发送缓冲区,准备转发21       usart_rec_flag=1;                                                             //接收成功标志22       TxBufferRF[RxCounter1]=0;                                             //发送缓冲区结束符    23       TxCounter1=RxCounter1;24       RxCounter1=0;25     }26   }27   28   if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)                   //这段是为了避免STM32 USART 第一个字节发不出去的BUG 29   { 30      USART_ITConfig(USART1, USART_IT_TXE, DISABLE);                         //禁止发缓冲器空中断, 31   }    32 }  33 /*******************************************************************************34 * Function Name  : EXTI0 中断函数35 * Description    : NRF24L01中断服务程序36 * Input          : None37 * Output         : None38 * Return         : None39 *******************************************************************************/40 void EXTI0_IRQHandler(void){41     u8 i=0;42      u8 status;    43     if(EXTI_GetITStatus(EXTI_Line0) != RESET)            //判断是否产生了EXTI0中断44       {45         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0){ //判断是否是PA0线变低            46             status=SPI_Read(READ_REG1+STATUS);            // 读取状态寄存其来判断数据接收状况    47             if(status & 0x40)                            // 判断是否接收到数据                   48             {            49                 //GPIO_ResetBits(GPIOB, GPIO_Pin_5);   50                  SPI_Read_Buf(RD_RX_PLOAD,rx_buf,TX_PLOAD_WIDTH);  //从接收缓冲区里读出数据51                 for(i=0; i<32; i++)TxBufferUSART[i] = rx_buf[i];  //向USB 端点1的缓冲区里放置数据      52                 rf_rec_flag=1;53             }54             else if((status &0x10)>0){                     //发射达到最大复发次数                55                 SPI_RW_Reg(0xe1,0);                          //清除发送缓冲区                  56                 RX_Mode();                                 //进入接收模式                   57             }58             else if((status &0x20)>0){                     //发射后收到应答 59                 GPIO_SetBits(GPIOB, GPIO_Pin_5);   60                 SPI_RW_Reg(0xe1,0);                         //清除发送缓冲区              61                 RX_Mode();                                 //进入接收模式                   62             }63             SPI_RW_Reg(WRITE_REG1+STATUS, status);         //清除07寄存器标志64         }        65         EXTI_ClearITPendingBit(EXTI_Line0);             //清除EXTI0上的中断标志              66     } 67 }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top