新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > CC1101接口與STM32

        CC1101接口與STM32

        作者: 時間:2016-11-11 來源:網絡 收藏
        【目的】

        移植原來TI對于CC1101與MSP430接口庫到STM32平臺,參考原TI庫應用筆記“ MSP430 Interface to
        CC1100/2500 Code Library”,做到盡量保持所有函數名不改變,以方便以前基于MSP430的程序向STM32移植。
        【要求】
        1.編程要求:改寫原來基于MSP430的程序,使用于STM32,盡量保持所有函數名不改變,以方便以前基于MSP430的程序向STM32移植。
        2.實現功能:STM32與CC1101通過SPI接口正常傳輸數據,不同節點的CC1101可以正常傳輸數據。
        3.實驗現象:STM32與CC1101連接后,可以與另一個節點通信,節點初始在隨機時間發送一個數據,任一節點收到數據后LED閃一下,并把數據回傳,如此循環,會看到LED不停閃爍。

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

        【硬件電路】

        【原理】
        CC1101是TI公司一款高性價比的單片UHF收發器,為低功耗無線電應用而設計。它是CC1100器件的加強升級版,靈敏度更高,功耗更小,帶寬更大。CC1101可滿足多個領域中的低功耗無線應用要求,如警報與安全、自動抄表、工業監控以及家庭和樓宇自動化等。CC1101理想適用于工業、科學及醫藥設備(ISM)以及316、433、868及916MHz短距裝置(SRD)頻帶。但是,該器件也可方便編程,以支持其它頻率,如300-348MHz、387-467MHz及779-928MHz等。出色的頻帶與調制格式支持使其能與目前的RF終端設備相兼容。


        圖1 CC1101 的外引腳圖(俯視)
        CC1100通過4線SPI兼容接口 (SI,SO,SCLK和 CSn)配置。這個接口同時用作寫和讀緩存數據。SPI
        接口上所有的處理都同一個包含一個讀/寫位,一個突發訪問位和一個 6 位地址的頭字節一起作用。在地址和數據轉換期間, CSn 腳
        (芯片選擇,低電平有效)必須保持為低電平。如果在過程中 CSn 變為高電平,則轉換取消。當 CSn 變低, 在開始轉換頭字節之前,
        MCU必須等待,直到 SO腳變低。這表明電壓調制器已經穩定,晶體正在運作中。除非芯片處在 SLEEP 或 XOFF 狀態,SO 腳在
        CSn變低之后總會立即變低。關于CC1101對配置寄存器寫和讀操作如圖2所示。
        芯片狀態位
        當頭字節在 SPI 接口上被寫入時,芯片狀態字節在 SO 腳上被 CC1100 寫入。狀態字節包含關鍵狀態信號,對MCU是有用的。第一位
        s7,是CHIP_RDYn 信號。在 SCLK的在第一個正邊緣之前,這個信號必須變低。CHIP_RDYn
        信號表明晶體正處于工作中,調節數字供給電壓是穩定的。6,5 和4 位由狀態值組成。這個值反映了芯片的狀態。 當使 XOSC
        空閑并使數字中心的能量開啟,所有其他模塊處于低功耗狀態時。只有芯片處于此狀態時,頻率和信道配置才能被更新。當芯片處于接收模式時,
        RX狀態是活動的。同樣地,當芯片處于發送模式時,TX狀態是活動的。狀態字節中的后四位( 3
        :0)包含FIFO_BYTES_AVAILABLE。為了進行讀操作,這個區域包含可從 RX FIFO
        讀取的字節數。為了進行寫操作,這個區域包含可寫入 TX FIFO 的 字節數。
        寄存器訪問
        CC1100配置寄存器位于SPI地址從0x00到0x2F之間。所有的配置寄存器均能讀和寫。當對寄存器寫時,每當一個待寫入的數據字節傳輸到
        SI腳時,狀態字節將被送至 SO腳。
        通過在地址頭設置突發位,連續地址的寄存器能高效地被訪問。這個地址在內部計數器內設置起始地址。每增加一個新的字節計數器值增加 1。
        突發訪問,不管是讀訪問還是寫訪問,必須通過設置CSn 為高來終止。對 0x30-0x3D間的地址來說,
        突發位用以在狀態寄存器和命令濾波之間選擇。狀態寄存器只讀。突發讀取對狀態寄存器是不可取的,故它們每次只能被讀一個。
        命令濾波
        命令濾波可被視為 CC1100
        的單字節指令。通過命令濾波寄存器的選址,內部序列被啟動。這些命令用來關閉晶體振蕩器,開啟傳輸模式和電磁波激活等。命令濾波寄存器的訪問和一個寄存器的寫操作一樣,但沒有數據被傳輸。就是說,只
        有 R/W 位(置為 0) ,突發訪問(置為 0)和六個地址位(0x30和0x3D之間)被寫。一個命令濾波可能在任何其他 SPI
        訪問之后,而不需要將 CSn 拉至高電平。命令濾波立即被執行,當 CSn 高時 SPWD和 SXOFF濾波是例外。
        FIFO訪問
        64 字節 TX FIFO 和 64 字節 RX FIFO 通過0x3F 被訪問。當讀/寫位為 0 時,TX FIFO被訪問,當讀/寫位為 1
        時,RX FIFO 被訪問。 TX FIFO是只寫的,而 RX FIFO是只讀的。突發位用來決定 FIFO
        訪問是單字節還是突發訪問。單字節訪問方式期望地址的突發位為 0 及1
        數據字節。在數據字節之后等待一個新的地址,因此,CSn繼續保持低。突發訪問方式允許一地址字節,然后是連續的數據字節,直到通過設置 CSn
        為高來關斷訪問。 當對 TX FIFO寫時,狀態字節對每個 SO腳上的新數據字節是輸出量,如圖 6 所示。這個狀態位能用來偵測對 TX FIFO
        寫數據時的下溢。注意,狀態字節包含在寫入字節到 TX FIFO 的過程前空閑的字節數。當最后一個適合 TX FIFO的字節被傳送至 SI 腳后, 被
        SO腳接收的狀態位會表明在 TX FIFO中只有一個字節是空閑的。
        傳輸 FIFO 可能會通過發布一個 SFTX 命令濾波而被淹沒。相似地,一個 SFRX命令濾波會淹沒接收 FIFO。當進入休眠狀態時, 兩個
        FIFO都被清空。PATABLE 訪問
        0x3E 地址用來訪問 PATABLE。PATABLE用來選擇 PA 能量控制設置。在接收此地址之后,SPI 等待至少 8
        個字節。通過控制PATABLE,能實現可控的 PA能量上升和下降,減少的帶寬的 ASK 調制整型也如此PATABLE 是一個 8 字節表, 定義了
        PA控制 設置, 為 8 個 PA 功率值(由FRENDO.PA_POWER 的 3
        個位的值所選擇)的每一個所使用。這個表從最低位到最高位可讀和寫,一此一位。一個索引計數器用來控制對這個表的訪問。每讀出或寫入表中的一個字節,計數器就加
        1。當 CSn 為高時,計數值置為最小值。當達到最大值時,計數器由零重新開始計數。
        PATABLE 訪問
        對 PATABLE
        的訪問是單字節或者突發訪問,由突發位決定。當使用突發訪問時,索引計數器的值增加;達到7時重新從0開始。讀/寫位控制訪問是寫訪問(R/W=0)或者讀訪問(R/W=1)。
        如果一字節被寫入 PATABLE,且這個值將要被讀出,那么,為了設置索引計數器的值重為 0,CSn必須在讀訪問之前置為高。 注意,當 PATABLE
        進入休眠狀態時,所存儲的內容會丟失,特別是第一個字節。

        圖2 配置寄存器寫和讀操作
        STM32的串行外設接口(SPI)
        STM32的串行外設接口(SPI)有如下特性:
        ● 3線全雙工同步傳輸
        ● 帶或不帶第三根雙向數據線的雙線單工同步傳輸
        ● 8或16位傳輸幀格式選擇
        ● 主或從操作
        ● 支持多主模式
        ● 8個主模式波特率預分頻系數(最大為fPCLK/2)
        ● 從模式頻率 (最大為fPCLK/2)
        ● 主模式和從模式的快速通信
        ● 主模式和從模式下均可以由軟件或硬件進行NSS管理:主/從操作模式的動態改變
        可編程的時鐘極性和相位
        ● 可編程的數據順序,MSB在前或LSB在前
        ● 可觸發中斷的專用發送和接收標志
        ● SPI總線忙狀態標志
        ● 支持可靠通信的硬件CRC
        ─ 在發送模式下,CRC值可以被作為最后一個字節發送
        ─ 在全雙工模式中對接收到的最后一個字節自動進行CRC校驗
        ● 可觸發中斷的主模式故障、過載以及CRC錯誤標志
        ● 支持DMA功能的1字節發送和接收緩沖器:產生發送和接受請求
        通常SPI通過4個引腳與外部器件相連: MISO:主設備輸入/從設備輸出引腳。該引腳在從模式下發送數據,在主模式下接收數據。
        MOSI:主設備輸出/從設備輸入引腳。該引腳在主模式下發送數據,在從模式下接收數據。 SCK:串口時鐘,作為主設備的輸出,從設備的輸入
        NSS:從設備選擇。這是一個可選的引腳,用來選擇主/從設備。它的功能是用來作為“片
        選引腳”,本實驗中沒有使用。SPI的方框圖如圖3所示。

        圖3 SPI內部框圖

        圖4 數據幀格式圖
        【實驗步驟】
        1.學習STM32串行外設接口(SPI)相關知識,熟悉所調用的庫函數,學習CC1101相關知識,熟悉CC1101的配置方法,研究TI關于CC1101與MSP430的接口程序庫,熟悉庫的實現方法。
        2.連接電路。
        3.編寫程序,借助邏輯分析儀工具,調試程序。
        【程序代碼結構】
        所有與CC1101相關的代碼均放于CCxxxx文件夾,源文件用途分類說明如表2所示。對于應用分層框圖如圖5所示。因為程序較大,僅把與硬件相關、改動較大的TI_CC_spi.c放在附錄中。
        表2 源文件用途分類說明
        類型文件名功能
        硬件定義文件TI_CC_CC1100-CC2500.h對CC1101內部寄存器的定義
        TI_CC_STM32.h對使用的STM32相關SPI引腳進行定義
        TI_CC_hardware_board.h對使用的STM32通用數據引腳進行定義
        SPI接口文件TI_CC_spi.c通過SPI訪問CC1101寄存器的功能實現文件。
        TI_CC_spi.h對TI_CC_spi.c的函數進行聲明
        與應用層接口文件CC1100-CC2500.c對CC1101的使用的功能文件,包括初始化、發送數據包、接收數據包
        CC1100-CC2500.h對CC1100-CC2500.c的函數進行聲明
        include.h高層包含文件,包含所有.h文件

        應用層
        CC1100-CC2500.c
        TI_CC_spi.c
        TI_CC_hardware_board.h
        TI_CC_STM32.h
        TI_CC_CC1100-CC2500.h
        TI_CC_STM32.h
        SPI應用
        硬件定義

        main.c

        圖5 庫文件程序分層框圖
        【實驗總結】
        CC1101是在上升沿讀入數據,即上升沿有效,一般時鐘線默認是高電平,配置此功能的寄存器時CPOL(時鐘極性
        )和CPHA(時鐘相位)當CPOL=0時,空閑狀態時,SCK保持低電平,CPOL=1時,空閑狀態時,SCK保持高電平。CPHA
        =0時數據采樣從第一個時鐘邊沿開始,CPHA =1時數據采樣從第二個時鐘邊沿開始。在CC1101的配置中,這兩個控制配置為CPOL=1,CPHA
        =1。
        在改寫原來TI的程序時,為了保持好的移植性,因此對所有的函數名均未做改變,文件名也盡量不改變,僅將TI_CC_MSP430.h改為TI_CC_STM32.h,當然因為是應用于兩種截然不同的MCU,所以與硬件相關的宏定義有較大改變。
        STM32與CC1101的通信的邏輯分析儀截圖如圖6-圖8所示,其中圖6是啟動CC1101時的邏輯波形,圖7是寫配置寄存器時的邏輯波形,圖8讀寄存器時的邏輯波形。

        6 啟動CC1101時的邏輯波形

        圖 寫配置寄存器時的邏輯波形

        圖8 讀寄存器時的邏輯波形
        附錄:
        ////////////////////////////////////////////////////////////////////////////////
        // 文件名: TI_CC_spi.c
        // 工作環境: IAR for ARM 5.41 Kickstart,基于STM32F103ZE-EK
        // 作者: 程家陽
        // 生成日期: 2010.03.15
        // 功能: STM32與CCxxxx進行通信的SPI底層函數,完成初始化STM32的SPI口用于連接
        // CCxxxx,讀寫CCxxxx寄存器。
        //注意:
        //
        //
        // 相關文件:
        // 修改日志:
        ////////////////////////////////////////////////////////////////////////////////
        #include "include.h"
        #include "TI_CC_spi.h"
        ////////////////////////////////////////////////////////////////////////////////
        // 程序名 : void TI_CC_Wait(unsigned int cycles)
        // 作用 : 延時
        // 輸入參數:無
        // 輸出參數:無
        // 說明: uS級延時
        //
        ////////////////////////////////////////////////////////////////////////////////
        void TI_CC_Wait(unsigned int cycles)
        {
        while(cycles>15) // 15 cycles consumed by overhead
        cycles = cycles - 6; // 6 cycles consumed each iteration
        }
        ////////////////////////////////////////////////////////////////////////////////
        // 程序名 : void TI_CC_SPISetup(void)
        // 作用 : 初始化配置SPI
        // 輸入參數:無
        // 輸出參數:無
        // 說明:
        //
        ////////////////////////////////////////////////////////////////////////////////
        void TI_CC_SPISetup(void)
        {
        SPI_InitTypeDef SPI_SST_Init_Structure;//定義SPI配置結構體
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET);//CS disable
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 ,ENABLE);//時鐘使能
        //配置為雙線雙工模式
        SPI_SST_Init_Structure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
        //主器件
        SPI_SST_Init_Structure.SPI_Mode=SPI_Mode_Master;
        //8bit數據幀
        SPI_SST_Init_Structure.SPI_DataSize=SPI_DataSize_8b;
        //時鐘線默認高
        SPI_SST_Init_Structure.SPI_CPOL=SPI_CPOL_High ;
        //數據捕獲于第二個時鐘沿,這兩個其實配置了時鐘極性和相位
        SPI_SST_Init_Structure.SPI_CPHA=SPI_CPHA_2Edge;
        //NSS模式選擇
        SPI_SST_Init_Structure.SPI_NSS=SPI_NSS_Soft;
        //波特率預分頻值為 64
        SPI_SST_Init_Structure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;
        //數據傳輸從 MSB 位開始
        SPI_SST_Init_Structure.SPI_FirstBit=SPI_FirstBit_MSB;
        SPI_Init(SPI1, &SPI_SST_Init_Structure); //操作
        SPI_Cmd(SPI1,ENABLE); //使能
        //下面的幾句,具體作用不太清楚,需了解
        //TI_CC_SPI_USCIA0_PxSEL |= TI_CC_SPI_USCIA0_SIMO | TI_CC_SPI_USCIA0_SOMI
        | TI_CC_SPI_USCIA0_UCLK;
        // SPI option select
        //TI_CC_SPI_USCIA0_PxDIR |= TI_CC_SPI_USCIA0_SIMO | TI_CC_SPI_USCIA0_UCLK;
        // SPI TXD out direction
        }
        ////////////////////////////////////////////////////////////////////////////////
        // 程序名 : void TI_CC_SPIWriteReg(char addr, char value)
        // 作用 : 向一個"addr"指向的寄存器中寫入值"value"
        // 輸入參數:char addr :指向的地址
        // char value :要寫入的值
        // 輸出參數:無
        // 說明:
        //
        ////////////////////////////////////////////////////////////////////////////////
        void TI_CC_SPIWriteReg(char addr, char value)
        {
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); //CS enable
        // Wait for CCxxxx ready
        while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO,
        TI_CC_SPI_USCIA0_SOMI)!= RESET)
        {
        ;
        }
        SPI_I2S_SendData(SPI1, (uint16_t)addr);// Send address
        // Wait for TX to finish$$
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        SPI_I2S_SendData(SPI1, (uint16_t)value);//發送數據通過SPI1
        // Wait for TX to finish
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable
        }
        ////////////////////////////////////////////////////////////////////////////////
        // 程序名 : void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
        // 作用 : 向一個"addr"指向的寄存器中寫入值"value"
        // 輸入參數:char addr :指向的地址
        // char value :要寫入的值
        // 輸出參數:無
        // 說明:
        //
        ////////////////////////////////////////////////////////////////////////////////
        void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
        {
        unsigned int i;
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); // /CS enable
        // Wait for CCxxxx ready
        while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO,
        TI_CC_SPI_USCIA0_SOMI)!= RESET)
        {
        ;
        }
        // Send address
        SPI_I2S_SendData(SPI1, (uint16_t)(addr | TI_CCxxx0_WRITE_BURST));
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        for (i = 0; i < count; i++)
        {
        // Send data
        SPI_I2S_SendData(SPI1, (uint16_t)buffer[i]);//發送數據通過SPI1
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        }
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable
        }
        ////////////////////////////////////////////////////////////////////////////////
        // 程序名 : char TI_CC_SPIReadReg(char addr)
        // 作用 : 從一個單一的配置寄存器中讀數,寄存器地址:"addr"
        // 輸入參數:char addr :指向的地址
        // 輸出參數:char :返回的寄存器值
        // 說明:
        //
        ////////////////////////////////////////////////////////////////////////////////
        char TI_CC_SPIReadReg(char addr)
        {
        char x;
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); // /CS enable
        // Wait for TX to finish
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        // Send address
        SPI_I2S_SendData(SPI1, (uint16_t)(addr | TI_CCxxx0_READ_SINGLE));
        // Wait for TX to finish
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        //虛擬的接收數據,用來清空接收寄存器
        x = SPI_I2S_ReceiveData(SPI1);//接收數據通過SPI1
        // Dummy write so we can read data
        SPI_I2S_SendData(SPI1, (uint16_t)0xff);
        // Address is now being TXed, with dummy byte waiting in TXBUF...
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待$$$$
        {
        ;
        }
        // Dummy byte RXed during addr TX now in RXBUF
        // Clear flag//這個在stm32中是硬件清除
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        // Data byte RXed during dummy byte write is now in RXBUF
        x = SPI_I2S_ReceiveData(SPI1);//接收數據通過SPI1
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // /CS disable
        return x;
        }
        ////////////////////////////////////////////////////////////////////////////////
        // 程序名 : void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
        // 作用 : 從多個寄存器中讀數,第一個寄存器地址:"addr",讀出的數據存放于"buffer"
        // 為起始地址的存儲空間,總共讀"count"個寄存器。
        // 輸入參數:char addr :指向的地址
        // char *buffer:存放的存儲空間的起始地址
        // char count:要讀的寄存器的數量
        // 輸出參數:無
        // 說明:
        //
        ////////////////////////////////////////////////////////////////////////////////
        void TI_CC_SPIReadBurstReg(char addr, char *buffer, char count)
        {
        char i;
        char x;
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); // /CS enable
        // Wait for CCxxxx ready
        while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO,
        TI_CC_SPI_USCIA0_SOMI)!= RESET)
        {
        ;
        }
        // Send address
        SPI_I2S_SendData(SPI1, (uint16_t)(addr | TI_CCxxx0_READ_BURST));
        // Wait for TXBUF ready
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        //虛擬的接收數據,用來清空接收寄存器
        x = SPI_I2S_ReceiveData(SPI1);//接收數據通過SPI1
        // Dummy write to read 1st data byte
        SPI_I2S_SendData(SPI1, (uint16_t)0xff);//發送數據通過SPI1
        // Addr byte is now being TXed, with dummy byte to follow immediately
        after
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        x = SPI_I2S_ReceiveData(SPI1);//接收數據通過SPI1
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        // First data byte now in RXBUF
        for (i = 0; i < (count-1); i++)
        {
        //UCA0TXBUF = 0; //Initiate next data RX, meanwhile.&$$$$$.
        SPI_I2S_SendData(SPI1, (uint16_t)0);//發送數據通過SPI1
        // Store data from last data RX
        buffer[i] = SPI_I2S_ReceiveData(SPI1);//接收數據通過SPI1
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        }
        // Store last RX byte in buffer
        buffer[count-1]= SPI_I2S_ReceiveData(SPI1);//接收數據通過SPI1
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable
        }
        ////////////////////////////////////////////////////////////////////////////////
        // 程序名 : char TI_CC_SPIReadStatus(char addr)
        // 作用 : 從狀態寄存器中讀數,寄存器地址:"addr"
        // 輸入參數:char addr :指向的狀態寄存器地址
        // 輸出參數:char :狀態寄存器的值
        // 說明:
        //
        ////////////////////////////////////////////////////////////////////////////////
        char TI_CC_SPIReadStatus(char addr)
        {
        char x;
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); // /CS enable
        //Wait for CCxxxx ready
        while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO,
        TI_CC_SPI_USCIA0_SOMI)!= RESET)
        {
        ;
        }
        // Send address
        SPI_I2S_SendData(SPI1, (uint16_t)(addr |
        TI_CCxxx0_READ_BURST));//發送數據通過SPI1
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        // Dummy write so we can read data
        x = SPI_I2S_ReceiveData(SPI1);//接收數據通過SPI1
        SPI_I2S_SendData(SPI1, (uint16_t)0xff);//發送數據通過SPI1
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        // Read data
        x = SPI_I2S_ReceiveData(SPI1);//接收數據通過SPI1
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable
        return x;
        }
        ////////////////////////////////////////////////////////////////////////////////
        // 程序名 : void TI_CC_SPIStrobe(char strobe)
        // 作用 : 向命令寄存器寫數,寫入的值"strobe"
        // 輸入參數:char strobe :要寫入的值
        // 輸出參數:無
        // 說明:
        //
        ////////////////////////////////////////////////////////////////////////////////
        void TI_CC_SPIStrobe(char strobe)
        {
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); //CS enable
        // Wait for CCxxxx ready
        while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO,
        TI_CC_SPI_USCIA0_SOMI)!= RESET)
        {
        ;
        }
        // Send strobe
        SPI_I2S_SendData(SPI1, (uint16_t)strobe);//發送數據通過SPI1
        // Strobe addr is now being TXed
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable
        }
        ////////////////////////////////////////////////////////////////////////////////
        // 程序名 : void TI_CC_PowerupResetCCxxxx(void)
        // 作用 : 硬復位CC芯片
        // 輸入參數:無
        // 輸出參數:無
        // 說明:
        //
        ////////////////////////////////////////////////////////////////////////////////
        void TI_CC_PowerupResetCCxxxx(void)
        {
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable
        TI_CC_Wait(30);
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); //CS enable
        TI_CC_Wait(30);
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable
        TI_CC_Wait(45);
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_RESET); //CS enable
        // Wait for CCxxxx ready
        while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO,
        TI_CC_SPI_USCIA0_SOMI)!= RESET)
        {
        ;
        }
        // Send strobe
        SPI_I2S_SendData(SPI1, (uint16_t)TI_CCxxx0_SRES);//發送數據通過SPI1
        // Strobe addr is now being TXed
        while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線路忙則等待
        {
        ;
        }
        // Wait for CCxxxx ready
        while(GPIO_ReadInputDataBit(TI_CC_SPI_USCIA0_GPIO,
        TI_CC_SPI_USCIA0_SOMI)!= RESET)
        {
        ;
        }
        GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable
        }



        關鍵詞: CC1101接口STM3

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 阳新县| 曲水县| 阿拉尔市| 丹巴县| 望江县| 成安县| 福贡县| 连江县| 田阳县| 元朗区| 和林格尔县| 青川县| 陆河县| 泗洪县| 都江堰市| 兰坪| 灵宝市| 呼和浩特市| 乌拉特前旗| 德化县| 龙岩市| 河间市| 清原| 龙川县| 太湖县| 迁安市| 丹寨县| 湄潭县| 广东省| 塘沽区| 台东市| 上蔡县| 台北县| 新民市| 广州市| 安宁市| 沙湾县| 牙克石市| 汶川县| 阿拉尔市| 东丽区|