0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

淺談CC1101驅(qū)動(dòng)在STM32F103的移植

ss ? 作者:工程師譚軍 ? 2018-09-06 15:18 ? 次閱讀

本文主要是關(guān)于CC1101的相關(guān)介紹,并著重對(duì)CC1101驅(qū)動(dòng)在STM32F103的移植進(jìn)行了詳盡的闡述。

淺談CC1101驅(qū)動(dòng)在STM32F103的移植

首先明確:CC1101是通過SPI與MCU進(jìn)行通信的。根據(jù)從TI官方上獲得CC1101驅(qū)動(dòng),直接先移植SPI部分,STM32F103提供了SPI1和SPI2兩條SPI總線,可自行選擇,對(duì)于SPI的移植,直接參考STM32開發(fā)板上關(guān)于通過SPI操作Flash示例代碼,對(duì)于SPI的配置與TI提供的驅(qū)動(dòng)代碼里的SPI配置保持一致。SPI移植完成之后,接上CC1101射頻模塊,測(cè)試SPI是否能正常通信,主要通過向CC1101任意可讀可寫寄存器寫一個(gè)任意值,然后再讀出該寄存器里的值,通過串口打印出該值,通過以上操作判斷SPI是否正常通信,SPI移植是否成功。當(dāng)然,這里使用到了串口,所以需要同時(shí)將串口的代碼實(shí)現(xiàn),同樣參考串口實(shí)例。

淺談CC1101驅(qū)動(dòng)在STM32F103的移植

其次,當(dāng)STM32與CC1101的SPI通信完成后,果斷開始CC1101后續(xù)驅(qū)動(dòng)的移植。移植過程中,所有變量名、函數(shù)名與TI提供的驅(qū)動(dòng)里的保持一致,當(dāng)然CC1101寄存器配置也保持移植。對(duì)于移植初期,我并沒有太多的關(guān)心CC1101的時(shí)序問題,只關(guān)心怎么去移植,這也是自己的一個(gè)不好的習(xí)慣,所以初期移植的時(shí)候,對(duì)著TI提供的驅(qū)動(dòng)代碼,TI代碼里有什么函數(shù),我也移植什么函數(shù);函數(shù)里有CS管腳的操作,也對(duì)應(yīng)在操作在STM32下定義的CS管腳;TI里延時(shí)多長(zhǎng),我也跟著在STM32下延時(shí)相應(yīng)的時(shí)間。整個(gè)驅(qū)動(dòng)移植下來,關(guān)于CC1101的驅(qū)動(dòng)函數(shù)也大多了然在心了。

最后,TI驅(qū)動(dòng)里提供的是輪詢的方式收發(fā)數(shù)據(jù),對(duì)于初期來說,首先需要實(shí)現(xiàn)CC1101的工作,編譯調(diào)試移植到STM32上的CC1101驅(qū)動(dòng)代碼,看見數(shù)據(jù)從接收端串口打印出的那瞬間,心情真心不錯(cuò)基于STM32F103的CC1101驅(qū)動(dòng)移植。

當(dāng)然,輪詢的方式并不適合我在實(shí)際中應(yīng)用,改用中斷方式接收數(shù)據(jù),且使用FIFO小于64BYTE,對(duì)于中斷接收,做如下總結(jié):

方法一:配置寄存器IOCFGx.GDOx_CFG=0x06(可查看CC1101數(shù)據(jù)手冊(cè)通用引腳部分),以下降沿觸發(fā)中斷。

方法二:配置寄存器IOCFGx.GDOx_CFG=0x01,以上升降沿觸發(fā)中斷。

對(duì)于中斷的試用,具體可根據(jù)對(duì)IOCFGx.GDOx_CFG的配置實(shí)現(xiàn)。

本以為,這樣之后就完成了CC1101的驅(qū)動(dòng)移植,最后才知道,自己菜得不行,移植的代碼只是純粹的數(shù)據(jù)收發(fā),當(dāng)導(dǎo)師問道有無CCA、CS檢測(cè)等等,我就茫然了,恰好又是期末了,大牛導(dǎo)師最后自己去重新移植了有CCA檢測(cè)機(jī)制的驅(qū)動(dòng)(主要參考TI官方提供的SimpliciTI代碼),心里真心難受基于STM32F103的CC1101驅(qū)動(dòng)移植,好失敗,后期只對(duì)CC1101驅(qū)動(dòng)進(jìn)行了維護(hù)和改進(jìn)。

關(guān)于在后期維護(hù)和改進(jìn)中,主要解決兩個(gè)問題:

1.通信距離

測(cè)試參考SimpliciTI移植的CC1101驅(qū)動(dòng),其通信距離只有20幾米,能穿透一堵墻,無法滿足我們的需求,通過增加發(fā)射功率PA值,通信距離也不太明顯。查閱資料,通信距離與應(yīng)用環(huán)境、通信速率、PA等有關(guān),與是準(zhǔn)備將它通信速率(TI提供的是空中速率為250K的),修改為10K的速率,開始以為純粹配置一下MDMCFG3 為10K就行,但最終是必須配置channel filter bandwidth 、frequency deviation等,這些配置均建議通過TI提供的SmartRF Studio 軟件進(jìn)行配置。速率改變也必須注意CCA監(jiān)測(cè)過程中RSSI可用等待時(shí)間,RSSI可參考其TI提供的DN505文檔。最后,通過降低傳輸速率,將PA值設(shè)為10db,測(cè)試通信距離在空曠場(chǎng)地下可達(dá)到200多米,可穿透三堵墻,已經(jīng)滿足項(xiàng)目需要。但測(cè)試期間,修改后的10K速率驅(qū)動(dòng),經(jīng)常CCA檢測(cè)失敗,雖然通過DN505文檔修改了RSSI等待的時(shí)間,但依舊這樣,最終此問題糾結(jié)了我3天,最后突發(fā)奇想地去修改了調(diào)制解調(diào)方式為2-FSK后,CCA檢測(cè)正常運(yùn)行,至今還是沒明白為什么會(huì)這樣。

2.關(guān)于GDO0的問題

由于項(xiàng)目中是定時(shí)發(fā)送數(shù)據(jù),接收端采用GDO0以中斷方式接收數(shù)據(jù),但在測(cè)試中發(fā)現(xiàn),終端正常運(yùn)行不定時(shí)間后,中斷無法產(chǎn)生,調(diào)試為發(fā)現(xiàn)FIFO溢出等,通過去TI論壇上查找,發(fā)現(xiàn)有類似問題,但沒有徹底的解決方法,目前主要通過設(shè)置定時(shí)閾值,超過閾值未接收到數(shù)據(jù),就判定為GDO0中斷出現(xiàn)問題,便執(zhí)行FIFO刷新操作,然后終端又能繼續(xù)正常運(yùn)行,

CC1101與STM32的低功耗

1.stm32低功耗

(1)進(jìn)入stop模式

由于項(xiàng)目需要在睡眠時(shí)也保留RAM的數(shù)據(jù),顧考慮采用stop模式以減少STM32 的功耗,進(jìn)入stop的方法很簡(jiǎn)單,直接調(diào)用庫(kù)函數(shù)中的 PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI); 此處,我選擇了關(guān)閉電壓轉(zhuǎn)換器以進(jìn)一步降低功耗,使用指令WFI進(jìn)入,關(guān)于STOP進(jìn)入方式的選擇,可參考前文提供的博客。

(2)STM32的喚醒

由于,應(yīng)用中采用發(fā)送完數(shù)據(jù)變進(jìn)入休眠,并定時(shí)喚醒發(fā)送,且STOP模式下RTC正常工作,所以在本應(yīng)用中采用了RTC鬧鐘周期中斷喚醒,對(duì)于RTC的使用即配置可如下:

void RTC_Configuration(void)

{

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

EXTI_InitTypeDef EXTI_InitStructure;

EXTI_ClearITPendingBit(EXTI_Line17);

EXTI_InitStructure.EXTI_Line = EXTI_Line17;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

PWR_BackupAccessCmd(ENABLE);

BKP_DeInit();

#ifdef RCC_LSE

RCC_LSEConfig(RCC_LSE_ON);

while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)

{

}

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

#else

RCC_LSICmd(ENABLE);

while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)

{

}

RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

#endif

RCC_RTCCLKCmd(ENABLE);

RTC_WaitForSynchro();

RTC_SetPrescaler(32767);

RTC_WaitForLastTask();

RTC_ITConfig(RTC_IT_ALR, ENABLE);

RTC_WaitForLastTask();

RTC_Alarm_Interrupt(DISABLE);

}

以上,主要注意RTC時(shí)鐘的選擇,選擇RCC_LSE ,時(shí)間比較精確,但會(huì)產(chǎn)生相對(duì)長(zhǎng)一點(diǎn)的喚醒時(shí)延選擇;RCC_LSI,時(shí)間則不那么準(zhǔn)確,且功耗要多一點(diǎn),但產(chǎn)生的喚醒時(shí)延較小,具體可查閱STM32使用手冊(cè)關(guān)于低功耗部分的介紹。

2.CC1101低功耗

(1)進(jìn)入掉電模式

CC1101進(jìn)入IDEL狀態(tài) 一》 使用掉電模式(SPWD)即可。

(2)喚醒

直接操作拉低CS管腳即可。

3.調(diào)試低功耗

前期調(diào)試,只分別測(cè)試了STM32和CC1101在休眠功能上的實(shí)現(xiàn),即是否能進(jìn)入休眠以及是否能夠成功進(jìn)行喚醒,未對(duì)實(shí)際功耗進(jìn)行測(cè)試(由于硬件的特殊性)。

后期第一次測(cè)試STM32+CC1101整體模塊低功耗模式下功耗為4點(diǎn)幾mA,頓時(shí)就無語(yǔ)了關(guān)于STM32低功耗+CC1101低功耗;然后果斷挑斷模塊上的所有LED燈,再次測(cè)試,功耗直接降到1mA左右,此時(shí)雖然有所下降,但離手冊(cè)上的幾u(yù)A真不是一個(gè)檔次的,但對(duì)于菜鳥的我此時(shí)根本不知道怎么繼續(xù)減少功耗了,好吧,我只有去茫茫網(wǎng)絡(luò)中尋找低功耗的蛛絲馬跡了,果然在http://www.openedv.com/posts/list/18372.htm#116532里找到了希望,真心感謝博主的分享,于是趕緊把用到的SPI管腳以及串口管腳安裝博主提供的修改,并關(guān)閉所有不用的PIN,但最終測(cè)試功耗依然未降低,這就納悶了,為啥還是每降低呢關(guān)于STM32低功耗+CC1101低功耗,突然想起了不久前看過的STM32L系列低功耗的芯片,同時(shí)在有個(gè)低功耗經(jīng)驗(yàn)師兄的提醒下,果斷參考了其官方提供的超低功耗代碼關(guān)于STM32低功耗+CC1101低功耗,并在自己的項(xiàng)目中進(jìn)行如下操作:

在每次進(jìn)入休眠前:

#關(guān)閉所有時(shí)鐘以及外設(shè)(如本項(xiàng)目中用到的串口、SPI、timer)

#將所有I/O口改為GPIO_Mode_AIN狀態(tài)

void DisableGPIO(void)

{

GPIO_InitTypeDef GPIO_InitStructure

;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC\

|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO, ENABLE);

//Configure all GPIO port pins in Analog Input mode (floating input trigger OFF)

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_Init(GPIOD, &GPIO_InitStructure);

GPIO_Init(GPIOE, &GPIO_InitStructure);

//GPIOs Periph clock disable

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC

|RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOE, DISABLE);

}

在每次喚醒后:

#開啟休眠前所關(guān)閉的對(duì)應(yīng)時(shí)鐘以及外設(shè)

#初始化使用到的GPIO口

添加了如上的處理后,再次測(cè)試低功耗,終于讓我看見了uA級(jí)別的功耗關(guān)于STM32低功耗+CC1101低功耗,但功耗最低時(shí)在40uA左右,與根據(jù)芯片手冊(cè)提供的低功耗數(shù)據(jù)相比,還是有很大的距離,不過至此,通過軟件進(jìn)一步實(shí)現(xiàn)低功耗,我已經(jīng)無法再想到其他的方法,外設(shè)該關(guān)的都已經(jīng)關(guān)掉,功耗在40uA左右,目前能想到的就是硬件上功耗降降低,

結(jié)語(yǔ)

關(guān)于CC1101的相關(guān)介紹就到這了,如有不足之處歡迎指正。

相關(guān)閱讀推薦:基于STM32驅(qū)動(dòng)CC1101的程序分析

相關(guān)閱讀推薦:基于STM32F103RB和CC1101的無線數(shù)傳模塊設(shè)計(jì)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 芯片
    +關(guān)注

    關(guān)注

    452

    文章

    50206

    瀏覽量

    420863
  • CC1101
    +關(guān)注

    關(guān)注

    4

    文章

    36

    瀏覽量

    23084
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于STM32F103RB和CC1101的無線數(shù)傳模塊設(shè)計(jì)

    本文設(shè)計(jì)了一種可工作433.00-434.79MHz,中心頻率為433.00MHz,輸出功率可調(diào)的無線數(shù)傳模塊。模塊采用STM32F103RB單片機(jī)和射頻芯片CC1101設(shè)計(jì),利用EDA軟件ADS2008仿真優(yōu)化了射頻電路的輸
    發(fā)表于 08-23 14:28 ?9055次閱讀
    基于<b class='flag-5'>STM32F103</b>RB和<b class='flag-5'>CC1101</b>的無線數(shù)傳模塊設(shè)計(jì)

    HK32F103CC1101通訊的參考案例

    CC1101無線RF應(yīng)用廣泛,我們航順用HK32F103開發(fā)了一個(gè)實(shí)例,供有興趣的開發(fā)者參考。
    發(fā)表于 10-17 09:09

    cc1101數(shù)據(jù)手冊(cè)

    cc1101數(shù)據(jù)手冊(cè),此數(shù)據(jù)手冊(cè)為ti最新版本。
    發(fā)表于 02-17 17:11 ?16次下載

    cc1101產(chǎn)品手冊(cè)(English)

    CC1101的Datasheet,德州儀器英文原版。
    發(fā)表于 04-28 11:51 ?5次下載

    盤古STM32F103開發(fā)板移植uCGUI教程

    盤古STM32F103開發(fā)板移植uCGUI教程
    發(fā)表于 09-29 09:21 ?21次下載
    盤古<b class='flag-5'>STM32F103</b>開發(fā)板<b class='flag-5'>移植</b>uCGUI教程

    stm32f103移植

    stm32f103移植
    發(fā)表于 10-27 09:03 ?43次下載
    <b class='flag-5'>stm32f103</b><b class='flag-5'>移植</b>

    CC1101無線模塊如何使用_cc1101無線模塊的程序及使用介紹

    CC1101無線模塊是采用TI公司的CC1101芯片制作的模塊,一般是工作433M。長(zhǎng)沙云寶電子科技有限公司的生產(chǎn)的CC1101無線模塊比較穩(wěn)定。
    發(fā)表于 04-12 15:29 ?1.7w次閱讀

    無線芯片CC1100和CC1101的區(qū)別 淺談CC1101芯片的特點(diǎn)

    CC1101 [1] 是一款低于1GHz設(shè)計(jì)旨在用于極低功耗RF應(yīng)用。其主要針對(duì)工業(yè)、科研和醫(yī)療(ISM)以及短距離無線通信設(shè)備(SRD)。
    發(fā)表于 09-06 09:43 ?9985次閱讀

    CC1101工作原理 基于與STM32CC1101接口移植

    CC1101 [1] 是一款低于1GHz設(shè)計(jì)旨在用于極低功耗RF應(yīng)用。其主要針對(duì)工業(yè)、科研和醫(yī)療(ISM)以及短距離無線通信設(shè)備(SRD)。
    的頭像 發(fā)表于 09-06 14:45 ?2.1w次閱讀
    <b class='flag-5'>CC1101</b>工作原理 基于與<b class='flag-5'>STM32</b>的<b class='flag-5'>CC1101</b>接口<b class='flag-5'>移植</b>

    CC1101與MSP430接口庫(kù)移植STM32的詳細(xì)資料說明

    移植原來 TI 對(duì)于 CC1101 與 MSP430 接口庫(kù)到 STM32 平臺(tái),參考原 TI 庫(kù)應(yīng)用筆記 “ MSP430Interface toCC1100/2500 Code Library” Library”,做到盡量保
    發(fā)表于 05-17 17:10 ?18次下載
    <b class='flag-5'>CC1101</b>與MSP430接口庫(kù)<b class='flag-5'>移植</b>到<b class='flag-5'>STM32</b>的詳細(xì)資料說明

    GD32F103移植STM32F103代碼

    GD32F103移植STM32F103代碼使用相同F(xiàn)LASH和管腳數(shù)量相同的芯片,例如GDF103C8T6
    發(fā)表于 12-02 15:21 ?23次下載
    <b class='flag-5'>在</b>GD32<b class='flag-5'>F103</b><b class='flag-5'>移植</b><b class='flag-5'>STM32F103</b>代碼

    RT-Thread系統(tǒng)移植STM32f103

    RT-Thread系統(tǒng)移植STM32f103
    發(fā)表于 12-09 12:51 ?26次下載
    RT-Thread系統(tǒng)<b class='flag-5'>移植</b>到<b class='flag-5'>STM32f103</b>

    無線射頻芯片CC1101的特點(diǎn)和區(qū)別

    以及無線喚醒(WOR)的廣泛硬件支持。CC1101代碼、封裝和外引腳方面均與CC1100兼容,可用于全球最為常
    發(fā)表于 03-09 12:44 ?1332次閱讀

    【芯選擇】CC1101芯片的模塊實(shí)例

    、接收信號(hào)強(qiáng)度指示(RSSI)、空閑信道評(píng)估(CCA)、鏈路質(zhì)量指示以及無線喚醒(WOR)的廣泛硬件支持。CC1101代碼、封裝和外引腳方面均與CC1100兼容,
    的頭像 發(fā)表于 12-02 09:51 ?1316次閱讀
    【芯選擇】<b class='flag-5'>CC1101</b>芯片的模塊實(shí)例

    CC2500和CC1101移植說明

    主要通過如何移植、移植注意、關(guān)于芯片配置、如何生成導(dǎo)出配置四大步驟來說明CC2500和CC1101移植
    的頭像 發(fā)表于 06-15 14:32 ?546次閱讀
    <b class='flag-5'>CC</b>2500和<b class='flag-5'>CC1101</b><b class='flag-5'>移植</b>說明