新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > MSP430+nRF24L01程序

        MSP430+nRF24L01程序

        作者: 時間:2016-11-30 來源:網絡 收藏

        /**************************************************/
        /**************************************************
        函數:SPI_Write_Buf()
        描述:
        把pBuf緩存中的數據寫入到nRF24L01,通常用來寫入發
        射通道數據或接收/發送地址
        /**************************************************/
        uchar SPI_Write_Buf(uchar reg, uchar * pBuf, uchar bytes)
        {
        uchar status, i;
        CSN = 0; // CSN置低,開始傳輸數據
        status = SPI_RW(reg); // 選擇寄存器,同時返回狀態字
        for(i=0; i SPI_RW(pBuf[i]); // 逐個字節寫入nRF24L01
        CSN = 1; // CSN拉高,結束數據傳輸
        return(status); // 返回狀態寄存器
        }
        /**************************************************/
        /**************************************************
        函數:RX_Mode()
        描述:
        這個函數設置nRF24L01為接收模式,等待接收發送設備的數據包
        /**************************************************/
        void RX_Mode(void)
        {
        CE = 0;
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 接收設備接收通道0使用和發送設備相同的發送地址
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動應答
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
        SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 選擇射頻通道0x40
        SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH); // 接收通道0選擇和發送通道相同有效數據寬度
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f); // CRC使能,16位CRC校驗,上電,接收模式
        CE = 1; // 拉高CE啟動接收設備
        }
        /**************************************************/
        /**************************************************
        函數:TX_Mode()
        描述:
        這個函數設置nRF24L01為發送模式,(CE=1持續至少10us),
        130us后啟動發射,數據發送結束后,發送模塊自動轉入接收
        模式等待應答信號。
        /**************************************************/
        void TX_Mode(uchar * BUF)
        {
        CE = 0;
        SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH); // 寫入發送地址
        SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH); // 為了應答接收設備,接收通道0地址和發送地址相同
        SPI_Write_Buf(WR_TX_PLOAD, BUF, TX_PLOAD_WIDTH); // 寫數據包到TX FIFO
        SPI_RW_Reg(WRITE_REG + EN_AA, 0x01); // 使能接收通道0自動應答
        SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01); // 使能接收通道0
        SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x0a); // 自動重發延時等待250us+86us,自動重發10次
        SPI_RW_Reg(WRITE_REG + RF_CH, 40); // 選擇射頻通道0x40
        SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x07); //數據傳輸率1Mbps,發射功率0dBm,低噪聲放大器增益
        SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e); // CRC使能,16位CRC校驗,上電
        CE = 1;
        }
        /**************************************************/
        /**************************************************
        函數:Check_ACK()
        描述:
        檢查接收設備有無接收到數據包,設定沒有收到應答信
        號是否重發
        /**************************************************/
        uchar Check_ACK(bit clear)
        {
        while(IRQ);
        sta = SPI_RW(NOP); // 返回狀態寄存器
        if(MAX_RT)
        if(clear) // 是否清除TX FIFO,沒有清除在復位MAX_RT中斷標志后重發
        SPI_RW(FLUSH_TX);
        SPI_RW_Reg(WRITE_REG + STATUS,sta); // 清除TX_DS或MAX_RT中斷標志
        IRQ = 1;
        if(TX_DS)
        return(0x00);
        else
        return(0xff);
        }
        /**************************************************/
        /**************************************************
        函數:CheckButtons()
        描述:
        檢查按鍵是否按下,按下則發送一字節數據
        /**************************************************/
        void CheckButtons()
        {
        P3 |= 0x00;
        if(!(P3 & 0x01)) // 讀取P3^0狀態
        {
        delay_ms(20);
        if(!(P3 & 0x01)) // 讀取P3^0狀態
        {
        TX_BUF[0] = ~DATA; // 數據送到緩存
        TX_Mode(TX_BUF); // 把nRF24L01設置為發送模式并發送數據
        LED = ~DATA; // 數據送到LED顯示
        Check_ACK(1); // 等待發送完畢,清除TX FIFO
        delay_ms(250);
        delay_ms(250);
        LED = 0xff; // 關閉LED
        RX_Mode(); // 設置為接收模式
        while(!(P3 & 0x01));
        DATA <<= 1;
        if(!DATA)
        DATA = 0x01;
        }
        }
        }
        /**************************************************/
        /**************************************************
        函數:main()
        描述:
        主函數
        /**************************************************/
        void main(void)
        {
        init_io(); // 初始化IO
        RX_Mode(); // 設置為接收模式
        while(1)
        {
        CheckButtons(); // 按鍵掃描
        sta = SPI_Read(STATUS); // 讀狀態寄存器
        if(RX_DR) // 判斷是否接受到數據
        {
        SPI_Read_Buf(RD_RX_PLOAD, RX_BUF, TX_PLOAD_WIDTH); // 從RX FIFO讀出數據
        flag = 1;
        }
        SPI_RW_Reg(WRITE_REG + STATUS,sta); // 清除RX_DS中斷標志
        if(flag) // 接受完成
        {
        flag= 0; // 清標志
        LED = RX_BUF[0]; // 數據送到LED顯示
        delay_ms(250);
        delay_ms(250);
        LED = 0xff; // 關閉LED
        }
        }
        }
        /**************************************************/

        上一頁 1 2 下一頁

        關鍵詞: MSP430nRF24L0

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 监利县| 桓仁| 双峰县| 崇文区| 新和县| 桐城市| 新疆| 自治县| 大悟县| 民丰县| 和静县| 塔城市| 阳江市| 腾冲县| 扎囊县| 健康| 保靖县| 承德县| 惠安县| 梁山县| 咸宁市| 上虞市| 开平市| 达拉特旗| 阜平县| 长沙市| 迭部县| 湛江市| 安达市| 云霄县| 闵行区| 新晃| 安国市| 昭平县| 老河口市| 定兴县| 太白县| 石河子市| 福清市| 林州市| 临潭县|