新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STM32 驅動無線NRF24L01 的穩定修正

        STM32 驅動無線NRF24L01 的穩定修正

        作者: 時間:2016-12-03 來源:網絡 收藏
        修正處

        void sent_data(u8* fp,u16 flong)
        {
        u16 i;
        TX_Mode((u8*)&flong); //傳送長度
        while(!tran); //等待完成
        tran=0;
        flong=flong/33+1;
        while(flong)
        {
        for(i=0;i<20000;i++);//這個延時的非常必要 大約2MS 左右
        if(MAX_RT) return;//無應答返回
        TX_Mode(fp); //傳送數據
        while(!tran); //等待完成
        tran=0;
        fp+=32;flong--;
        }

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

        }

        更加合理的延時寫法 ,發送分兩部分 首先發送內容長度 然后發送內容

        修正處

        if(RX_NU==2&&Timer2==0)

        {
        USART2_Puts("傳輸錯誤 ");
        USART2_Puts("rn");
        RX_NU=1;

        }

        貌似這個if的進入是不可能的 但是由于在中斷里更新了 Timter2 所以產生了不可預計的后果。

        修正處

        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; //計算接收次數
        Timer2=50;RX_NU=2;///*超時時間*/
        PRX_BUF=RX_BUF; //恢復指針
        RX_Mode();return;

        }

        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_NU=1;
        RX_BUF[rectnu]=

        主站蜘蛛池模板: 渭源县| 图木舒克市| 南漳县| 南投县| 景泰县| 疏勒县| 丰顺县| 皮山县| 大洼县| 松滋市| 沙坪坝区| 富平县| 三原县| 奎屯市| 称多县| 蓬安县| 武陟县| 望奎县| 涿鹿县| 奎屯市| 江陵县| 容城县| 日喀则市| 龙岩市| 临沂市| 视频| 永宁县| 赣榆县| 汶川县| 车致| 开封市| 麦盖提县| 淮安市| 天门市| 乌拉特中旗| 宁陵县| 乃东县| 雷山县| 青河县| 彝良县| 康马县|