在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            CC1101接口與STM32

            作者: 時(shí)間:2016-11-11 來(lái)源:網(wǎng)絡(luò) 收藏
            【目的】

            移植原來(lái)TI對(duì)于CC1101與MSP430接口庫(kù)到STM32平臺(tái),參考原TI庫(kù)應(yīng)用筆記“ MSP430 Interface to
            CC1100/2500 Code Library”,做到盡量保持所有函數(shù)名不改變,以方便以前基于MSP430的程序向STM32移植。
            【要求】
            1.編程要求:改寫(xiě)原來(lái)基于MSP430的程序,使用于STM32,盡量保持所有函數(shù)名不改變,以方便以前基于MSP430的程序向STM32移植。
            2.實(shí)現(xiàn)功能:STM32與CC1101通過(guò)SPI接口正常傳輸數(shù)據(jù),不同節(jié)點(diǎn)的CC1101可以正常傳輸數(shù)據(jù)。
            3.實(shí)驗(yàn)現(xiàn)象:STM32與CC1101連接后,可以與另一個(gè)節(jié)點(diǎn)通信,節(jié)點(diǎn)初始在隨機(jī)時(shí)間發(fā)送一個(gè)數(shù)據(jù),任一節(jié)點(diǎn)收到數(shù)據(jù)后LED閃一下,并把數(shù)據(jù)回傳,如此循環(huán),會(huì)看到LED不停閃爍。

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

            【硬件電路】

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


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

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

            圖3 SPI內(nèi)部框圖

            圖4 數(shù)據(jù)幀格式圖
            【實(shí)驗(yàn)步驟】
            1.學(xué)習(xí)STM32串行外設(shè)接口(SPI)相關(guān)知識(shí),熟悉所調(diào)用的庫(kù)函數(shù),學(xué)習(xí)CC1101相關(guān)知識(shí),熟悉CC1101的配置方法,研究TI關(guān)于CC1101與MSP430的接口程序庫(kù),熟悉庫(kù)的實(shí)現(xiàn)方法。
            2.連接電路。
            3.編寫(xiě)程序,借助邏輯分析儀工具,調(diào)試程序。
            【程序代碼結(jié)構(gòu)】
            所有與CC1101相關(guān)的代碼均放于CCxxxx文件夾,源文件用途分類(lèi)說(shuō)明如表2所示。對(duì)于應(yīng)用分層框圖如圖5所示。因?yàn)槌绦蜉^大,僅把與硬件相關(guān)、改動(dòng)較大的TI_CC_spi.c放在附錄中。
            表2 源文件用途分類(lèi)說(shuō)明
            類(lèi)型文件名功能
            硬件定義文件TI_CC_CC1100-CC2500.h對(duì)CC1101內(nèi)部寄存器的定義
            TI_CC_STM32.h對(duì)使用的STM32相關(guān)SPI引腳進(jìn)行定義
            TI_CC_hardware_board.h對(duì)使用的STM32通用數(shù)據(jù)引腳進(jìn)行定義
            SPI接口文件TI_CC_spi.c通過(guò)SPI訪問(wèn)CC1101寄存器的功能實(shí)現(xiàn)文件。
            TI_CC_spi.h對(duì)TI_CC_spi.c的函數(shù)進(jìn)行聲明
            與應(yīng)用層接口文件CC1100-CC2500.c對(duì)CC1101的使用的功能文件,包括初始化、發(fā)送數(shù)據(jù)包、接收數(shù)據(jù)包
            CC1100-CC2500.h對(duì)CC1100-CC2500.c的函數(shù)進(jìn)行聲明
            include.h高層包含文件,包含所有.h文件

            應(yīng)用層
            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應(yīng)用
            硬件定義

            main.c

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

            6 啟動(dòng)CC1101時(shí)的邏輯波形

            圖 寫(xiě)配置寄存器時(shí)的邏輯波形

            圖8 讀寄存器時(shí)的邏輯波形
            附錄:
            ////////////////////////////////////////////////////////////////////////////////
            // 文件名: TI_CC_spi.c
            // 工作環(huán)境: IAR for ARM 5.41 Kickstart,基于STM32F103ZE-EK
            // 作者: 程家陽(yáng)
            // 生成日期: 2010.03.15
            // 功能: STM32與CCxxxx進(jìn)行通信的SPI底層函數(shù),完成初始化STM32的SPI口用于連接
            // CCxxxx,讀寫(xiě)CCxxxx寄存器。
            //注意:
            //
            //
            // 相關(guān)文件:
            // 修改日志:
            ////////////////////////////////////////////////////////////////////////////////
            #include "include.h"
            #include "TI_CC_spi.h"
            ////////////////////////////////////////////////////////////////////////////////
            // 程序名 : void TI_CC_Wait(unsigned int cycles)
            // 作用 : 延時(shí)
            // 輸入?yún)?shù):無(wú)
            // 輸出參數(shù):無(wú)
            // 說(shuō)明: uS級(jí)延時(shí)
            //
            ////////////////////////////////////////////////////////////////////////////////
            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
            // 輸入?yún)?shù):無(wú)
            // 輸出參數(shù):無(wú)
            // 說(shuō)明:
            //
            ////////////////////////////////////////////////////////////////////////////////
            void TI_CC_SPISetup(void)
            {
            SPI_InitTypeDef SPI_SST_Init_Structure;//定義SPI配置結(jié)構(gòu)體
            GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET);//CS disable
            RCC_APB2PeriphClockCmd( RCC_APB2Periph_SPI1 ,ENABLE);//時(shí)鐘使能
            //配置為雙線(xiàn)雙工模式
            SPI_SST_Init_Structure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;
            //主器件
            SPI_SST_Init_Structure.SPI_Mode=SPI_Mode_Master;
            //8bit數(shù)據(jù)幀
            SPI_SST_Init_Structure.SPI_DataSize=SPI_DataSize_8b;
            //時(shí)鐘線(xiàn)默認(rèn)高
            SPI_SST_Init_Structure.SPI_CPOL=SPI_CPOL_High ;
            //數(shù)據(jù)捕獲于第二個(gè)時(shí)鐘沿,這兩個(gè)其實(shí)配置了時(shí)鐘極性和相位
            SPI_SST_Init_Structure.SPI_CPHA=SPI_CPHA_2Edge;
            //NSS模式選擇
            SPI_SST_Init_Structure.SPI_NSS=SPI_NSS_Soft;
            //波特率預(yù)分頻值為 64
            SPI_SST_Init_Structure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_64;
            //數(shù)據(jù)傳輸從 MSB 位開(kāi)始
            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)
            // 作用 : 向一個(gè)"addr"指向的寄存器中寫(xiě)入值"value"
            // 輸入?yún)?shù):char addr :指向的地址
            // char value :要寫(xiě)入的值
            // 輸出參數(shù):無(wú)
            // 說(shuō)明:
            //
            ////////////////////////////////////////////////////////////////////////////////
            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)//線(xiàn)路忙則等待
            {
            ;
            }
            SPI_I2S_SendData(SPI1, (uint16_t)value);//發(fā)送數(shù)據(jù)通過(guò)SPI1
            // Wait for TX to finish
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable
            }
            ////////////////////////////////////////////////////////////////////////////////
            // 程序名 : void TI_CC_SPIWriteBurstReg(char addr, char *buffer, char count)
            // 作用 : 向一個(gè)"addr"指向的寄存器中寫(xiě)入值"value"
            // 輸入?yún)?shù):char addr :指向的地址
            // char value :要寫(xiě)入的值
            // 輸出參數(shù):無(wú)
            // 說(shuō)明:
            //
            ////////////////////////////////////////////////////////////////////////////////
            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)//線(xiàn)路忙則等待
            {
            ;
            }
            for (i = 0; i < count; i++)
            {
            // Send data
            SPI_I2S_SendData(SPI1, (uint16_t)buffer[i]);//發(fā)送數(shù)據(jù)通過(guò)SPI1
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            }
            GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable
            }
            ////////////////////////////////////////////////////////////////////////////////
            // 程序名 : char TI_CC_SPIReadReg(char addr)
            // 作用 : 從一個(gè)單一的配置寄存器中讀數(shù),寄存器地址:"addr"
            // 輸入?yún)?shù):char addr :指向的地址
            // 輸出參數(shù):char :返回的寄存器值
            // 說(shuō)明:
            //
            ////////////////////////////////////////////////////////////////////////////////
            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)//線(xiàn)路忙則等待
            {
            ;
            }
            // 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)//線(xiàn)路忙則等待
            {
            ;
            }
            //虛擬的接收數(shù)據(jù),用來(lái)清空接收寄存器
            x = SPI_I2S_ReceiveData(SPI1);//接收數(shù)據(jù)通過(guò)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)//線(xiàn)路忙則等待$$$$
            {
            ;
            }
            // Dummy byte RXed during addr TX now in RXBUF
            // Clear flag//這個(gè)在stm32中是硬件清除
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            // Data byte RXed during dummy byte write is now in RXBUF
            x = SPI_I2S_ReceiveData(SPI1);//接收數(shù)據(jù)通過(guò)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)
            // 作用 : 從多個(gè)寄存器中讀數(shù),第一個(gè)寄存器地址:"addr",讀出的數(shù)據(jù)存放于"buffer"
            // 為起始地址的存儲(chǔ)空間,總共讀"count"個(gè)寄存器。
            // 輸入?yún)?shù):char addr :指向的地址
            // char *buffer:存放的存儲(chǔ)空間的起始地址
            // char count:要讀的寄存器的數(shù)量
            // 輸出參數(shù):無(wú)
            // 說(shuō)明:
            //
            ////////////////////////////////////////////////////////////////////////////////
            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)//線(xiàn)路忙則等待
            {
            ;
            }
            //虛擬的接收數(shù)據(jù),用來(lái)清空接收寄存器
            x = SPI_I2S_ReceiveData(SPI1);//接收數(shù)據(jù)通過(guò)SPI1
            // Dummy write to read 1st data byte
            SPI_I2S_SendData(SPI1, (uint16_t)0xff);//發(fā)送數(shù)據(jù)通過(guò)SPI1
            // Addr byte is now being TXed, with dummy byte to follow immediately
            after
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            x = SPI_I2S_ReceiveData(SPI1);//接收數(shù)據(jù)通過(guò)SPI1
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            // 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);//發(fā)送數(shù)據(jù)通過(guò)SPI1
            // Store data from last data RX
            buffer[i] = SPI_I2S_ReceiveData(SPI1);//接收數(shù)據(jù)通過(guò)SPI1
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            }
            // Store last RX byte in buffer
            buffer[count-1]= SPI_I2S_ReceiveData(SPI1);//接收數(shù)據(jù)通過(guò)SPI1
            GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable
            }
            ////////////////////////////////////////////////////////////////////////////////
            // 程序名 : char TI_CC_SPIReadStatus(char addr)
            // 作用 : 從狀態(tài)寄存器中讀數(shù),寄存器地址:"addr"
            // 輸入?yún)?shù):char addr :指向的狀態(tài)寄存器地址
            // 輸出參數(shù):char :狀態(tài)寄存器的值
            // 說(shuō)明:
            //
            ////////////////////////////////////////////////////////////////////////////////
            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));//發(fā)送數(shù)據(jù)通過(guò)SPI1
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            // Dummy write so we can read data
            x = SPI_I2S_ReceiveData(SPI1);//接收數(shù)據(jù)通過(guò)SPI1
            SPI_I2S_SendData(SPI1, (uint16_t)0xff);//發(fā)送數(shù)據(jù)通過(guò)SPI1
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            // Read data
            x = SPI_I2S_ReceiveData(SPI1);//接收數(shù)據(jù)通過(guò)SPI1
            GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); // CS disable
            return x;
            }
            ////////////////////////////////////////////////////////////////////////////////
            // 程序名 : void TI_CC_SPIStrobe(char strobe)
            // 作用 : 向命令寄存器寫(xiě)數(shù),寫(xiě)入的值"strobe"
            // 輸入?yún)?shù):char strobe :要寫(xiě)入的值
            // 輸出參數(shù):無(wú)
            // 說(shuō)明:
            //
            ////////////////////////////////////////////////////////////////////////////////
            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);//發(fā)送數(shù)據(jù)通過(guò)SPI1
            // Strobe addr is now being TXed
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            GPIO_WriteBit(TI_CC_CSn_GPIO, TI_CC_CSn_PIN, Bit_SET); //CS disable
            }
            ////////////////////////////////////////////////////////////////////////////////
            // 程序名 : void TI_CC_PowerupResetCCxxxx(void)
            // 作用 : 硬復(fù)位CC芯片
            // 輸入?yún)?shù):無(wú)
            // 輸出參數(shù):無(wú)
            // 說(shuō)明:
            //
            ////////////////////////////////////////////////////////////////////////////////
            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);//發(fā)送數(shù)據(jù)通過(guò)SPI1
            // Strobe addr is now being TXed
            while(SPI_I2S_GetFlagStatus(SPI1,SPI_I2S_FLAG_BSY )!= RESET)//線(xiàn)路忙則等待
            {
            ;
            }
            // 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
            }



            關(guān)鍵詞: CC1101接口STM3

            評(píng)論


            技術(shù)專(zhuān)區(qū)

            關(guān)閉