那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

stm32+cc1101無線接收數據不穩定? 淺談stm32+cc1101的低功耗

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

本文主要是關于stm32+cc1101的相關介紹,并著重對stm32+cc1101的數據傳輸及其低功耗進行了詳盡的闡述。

stm32+cc1101無線接收數據不穩定

發出側向命令

檢查TXFIFO中的字節數,

如果超過0,那么Flush TXFIFO

用數據填充TXFIFO

發出STX命令,就是這樣。

現在,您可以調用MARCSTATE(重復地和快速地)查看內部狀態機通過發送數據的不同步驟。

RX側:

發出側向命令

檢查RXFIFO中的字節數,

如果超過0,那么Flush RXFIFO

發布SRX命令,就是這樣。

現在,您可以調用MARCSTATE(重復地和快速地)查看內部狀態機通過發送數據的不同步驟。

stm32+cc1101無線接收數據不穩定? 淺談stm32+cc1101的低功耗

淺談stm32+cc1101的低功耗

電路設計上,只用到了一個LED、串口1、一個模擬SPI、一個中斷線、一個讀卡芯片RESET線,硬件上就只剩下這么點東西了,這個時候我采用的是待機模式,使用的是讀卡芯片的中斷接PA0喚醒STM32,在此之前要先使得讀卡芯片進入低功耗、然后STM32進入低功耗,這一步完成了,貌似沒什么問題,功耗確實從幾十mA驟降到3mA左右,開始還挺滿意的,但是測試廠商提供的樣板,功耗卻只有幾十uA,有點郁悶了。為什么會這樣?反復查看硬件、程序,都找不出原因,而且這個時候的工作效果很爛,根本就不能喚醒,所以我就懷疑是讀卡芯片一端低功耗有問題,因為我將PA0腳直接短接VCC,這樣就可以產生一個邊沿觸發STM32喚醒了,但是用讀卡芯片無法喚醒,所以我懷疑是讀卡芯片的RESET腳電平不對,經檢查,確實是因為RESET腳加了上拉電阻,讀卡芯片是高電平復位,在STM32進入待機后,管腳全都浮空了,導致RESET被拉高,一直在復位;我去掉上拉電阻,覺得很有希望解決問題了,但是測試結果是:有時候能喚醒,有時候不能,我仔細一想難道是因為STM32待機后管腳電平不確定,導致讀卡芯片RESET腳電平不定,而工作不正常,看樣子只有換用其他方案了。后面確實驗證了我的想法,使用STOP模式后,喚醒問題引刃而解。

就在關鍵時刻,芯片原廠火種送炭,送來急需的技術支持資料,一個包含低功耗源代碼,趕緊拿過來測試,先研讀下代碼,使用的是STOP模式,而不是待機模式,使用的是任意外部中斷喚醒,功耗低制40uA,這個時候就相當激動啊,趕快下載測試啊,結果功耗確實降了,但還是有1mA,更人家一比多了幾十倍啊。。。

我第一反應是硬件不對,經過測試修改,首先找到第一個原因,讀卡芯片RESET管腳上拉電阻又給焊上去了。。.,拆掉后功耗驟降到幾百uA,還是不行。。 測試過程中,為了去掉LDO的干擾,整板采用3.3V供電,但是后面經過測試,LDO的功耗其實也只有5uA不到,這LDO功耗值得贊一個;雖然結果還是沒達到預期,但是看到了希望,勝利就在眼前啊。

為此我反復看了技術支持提供的程序,發現他們的STM32的所有管腳都的設置都有所考究:(因為公司保密原則,代碼中刪除掉了關于該讀卡芯片的前綴信息等)

GPIO_InitTypeDef GPIO_InitStructure;

/* GPIOA Periph clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

/* GPIOB Periph clock enable */

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

/* GPIOC Periph clock enable */

//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

//####################################################

//USART1 Port Set

//TXD

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

//RXD

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOA, &GPIO_InitStructure);

//RST output pushpull mode

GPIO_InitStructure.GPIO_Pin = TRST;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(PORT1, &GPIO_InitStructure);

//IRQ input pull-up mode

GPIO_InitStructure.GPIO_Pin = TIRQ;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(PORT1, &GPIO_InitStructure);

//MISO input pull-up mode

GPIO_InitStructure.GPIO_Pin = MISO;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(PORT2, &GPIO_InitStructure);

//NSS,SCK,MOSI output pushpull mode

GPIO_InitStructure.GPIO_Pin = (NSS|SCK|MOSI);

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(PORT2, &GPIO_InitStructure);

//############################################################################

//TEST Port set

//TESTO input pushpull mode

GPIO_InitStructure.GPIO_Pin = TESTO;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_Init(TEST_PORT, &GPIO_InitStructure);

//############################################################################

//TEST Port set

//TESTI output pushpull mode

GPIO_InitStructure.GPIO_Pin = TESTI;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(TEST_PORT, &GPIO_InitStructure);

//############################################################################

//LED Port Set

//LED output pushpull mode

GPIO_InitStructure.GPIO_Pin = LED;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(LED_PORT, &GPIO_InitStructure);

//############################################################

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOC, &GPIO_InitStructure);

首先,想MOSI、SCK、CS、LED、RST這些管腳應該設置為推挽輸出,TXD設置為復用輸出,而IRQ、RXD、MISO設置浮空輸入,什么都沒接的管腳全都設置為下拉輸入,而TESTI、TESO我一直不解是什么東東,開始就沒管,而開始的時候MISO我也沒怎么注意,設置成上拉輸入(而不是浮空輸入),反正大部分按照廠家提供的參考,我并沒有照搬,測試效果一樣,但功耗確是還有80-90uA,期間我找了好久沒找到原因,給技術支持一看,原來是因為MISO沒有設置成浮空輸入,我是設置成了上拉輸入,上拉電阻一直在消耗大約40uA的電流。。。 好吧,這是自己不夠細心導致的,以后做低功耗的項目管腳配置是個大問題,不能再這么馬虎了!!! 我將MISO設置成浮空輸入之后,最低功耗還是有40+,離10uA的最低功耗還有段距離,到底是為什么呢?最后我發現

,該讀卡芯片有個TESTIN/TESTOUT管腳,是用來測試用的,出廠后也就用不上了,我也一直以為這兩個腳確實沒什么用,就沒接;可是我發現廠家提供的樣板居然接了這兩個腳,但是廠商也沒說這兩個腳接或不接會影響功耗啊,抱著試一試的心態,我我把TESTIN/TESTOUT兩個管腳接到單片機上進行相應的配置,接下來是見證奇跡的時刻了,功耗居然真的、真的降到10uA了。。。。。。。。。。。 此處省略n個字

這時候真的很激動,真的很想罵人啊,坑爹的廠家,為什么不給提示說這兩個腳不接單片機會消耗電流呢?(也許是文檔里面提到了,但是幾百頁的文檔,還是全英文的,一堆堆的文字,我再看一遍,確實沒有提到這兩個管腳會有漏電流。)

項目就這樣完工了,中間最重要的是技術支持的強力支持,不然項目不能完工了,這個項目低功耗STM32方面難度不高,主要是讀卡芯片上面的低功耗調試起來問題很多,還是人家原廠的出馬才解決了問題,因為眾多原因,不能公布該芯片的資料,包括該芯片怎么進入低功耗也無法公開,所以抱歉~~。

關于STM32進入低功耗,我簡單的總結了一下:

1.管腳設置,這個很關鍵,還是跟你電路有關系,外加上拉、下拉電阻切記不能隨便加

2.STM32的systick clock、DMA、TIM什么的,能關就全都關掉,STM32低功耗很簡單,關鍵是外圍電路功耗是關鍵

3.選擇一個低功耗的LDO,這個項目用到的LDO功耗就很不錯,靜態功耗10uA都不到。

4.確定STM32設置沒問題,進入低功耗有好幾種情況可以選擇(睡眠、停機、待機),我還是推薦選擇STOP模式,這個我覺的比較好是因為可以任意外部中斷都可以喚醒,而且管腳可以保留之前的設置,進入停機模式的代碼使用庫函數自帶的,就一句:

PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI);

意思是,在進入停機模式之前,也關掉電壓調節器,進一步降低功耗,使用WFI指令(任意中斷喚醒),但是經過測試,使用WFE(任事件喚醒)指令效果、功耗一模一樣。

最后一步是從STOP模式怎么恢復了,恢復其實也很簡單,外部中斷來了會進入中斷函數,然后STM32就被喚醒,喚醒還要做一些工作,需要開啟外部晶振(當然你也可以選擇使用內部自帶振蕩器)、開啟你需要的外設等等。

結語

關于stm32+cc1101的相關介紹就到這了,如有不足之處歡迎指正。

相關閱讀推薦:基于STM32F103RB和CC1101的無線數傳模塊設計相關閱讀推薦:基于STM32的可遙控智能跟隨小車的設計與實現

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • STM32
    +關注

    關注

    2272

    文章

    10923

    瀏覽量

    357568
  • CC1101
    +關注

    關注

    4

    文章

    36

    瀏覽量

    23236
收藏 人收藏

    評論

    相關推薦

    無線通訊模塊 cc1101無線模塊

    SPI 遙控模塊 無線模塊概述芯威科技VT-CC1101-433M基于TI Chipcon的CC1101無線收發芯片設計,是一款完整的、體積小巧的、
    發表于 08-07 17:37

    CC1101組網與假死問題

    ,什么原因?關于MSP430與CC1101低功耗問題為什么CC1101信道出現串擾現象?STM32+CC1101組網問題請教
    發表于 08-29 17:45

    淺談無線射頻CC1101芯片的特點與CC1100的區別

    用于極低功耗RF應用。其主要針對工業、科研和醫療(ISM)以及短距離無線通信設備(SRD)。CC1101可提供對數據包處理、數據緩沖、突發傳
    發表于 11-17 10:57

    CC1101低功耗RF無線射頻芯片

    CC1101[1] 是一款低于1GHz設計旨在用于極低功耗RF應用。其主要針對工業、科研和醫療(ISM)以及短距離無線通信設備(SRD)。CC1101可提供對
    發表于 11-18 11:20

    cc1101數據手冊

    cc1101數據手冊,此數據手冊為ti最新版本。
    發表于 02-17 17:11 ?16次下載

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

    CC1101無線模塊是采用TI公司的CC1101芯片制作的模塊,一般是工作在433M。長沙云寶電子科技有限公司的生產的CC1101無線模塊比
    發表于 04-12 15:29 ?1.8w次閱讀

    CC1101 低功耗(低于 1GHz)射頻收發器

    電子發燒友網為你提供TI(ti)CC1101相關產品參數、數據手冊,更有CC1101的引腳圖、接線圖、封裝手冊、中文資料、英文資料,CC1101真值表,
    發表于 11-02 19:33
    <b class='flag-5'>CC1101</b> <b class='flag-5'>低功耗</b>(低于 1GHz)射頻收發器

    無線芯片CC1100和CC1101的區別 淺談CC1101芯片的特點

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

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

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

    淺談CC1101驅動在STM32F103的移植

    最后,TI驅動里提供的是輪詢的方式收發數據,對于初期來說,首先需要實現CC1101的工作,編譯調試移植到STM32上的CC1101驅動代碼,看見數據
    的頭像 發表于 09-06 15:18 ?7911次閱讀
    <b class='flag-5'>淺談</b><b class='flag-5'>CC1101</b>驅動在<b class='flag-5'>STM32</b>F103的移植

    cc1101低功耗設計方案 CC1101收發驅動程序

    CC1101是一款低于1GHz設計旨在用于極低功耗RF應用。其主要針對工業、科研和醫療(ISM)以及短距離無線通信設備(SRD)。
    發表于 09-06 15:30 ?5301次閱讀

    cc1101無線模塊

    CC1101無線模塊是采用TI公司的CC1101芯片制作的模塊,一般是工作在433M。長沙云寶電子科技有限公司的生產的CC1101無線模塊比
    的頭像 發表于 03-09 12:42 ?2670次閱讀
    <b class='flag-5'>cc1101</b><b class='flag-5'>無線</b>模塊

    無線射頻芯片CC1101的特點和區別

    本文主要是關于無線芯片CC1100和CC1101的相關介紹,并著重對無線芯片CC1100和CC1101
    發表于 03-09 12:44 ?1483次閱讀

    無線射頻芯片CC1101的特點和區別

    本文主要是關于無線芯片CC1100和CC1101的相關介紹,并著重對無線芯片CC1100和CC1101
    的頭像 發表于 03-09 18:28 ?2394次閱讀

    【芯選擇】CC1101芯片的模塊實例

    CC1101芯片CC1101是一款低于1GHz設計旨在用于極低功耗RF應用。其主要針對工業、科研和醫療(ISM)以及短距離無線通信設備(SRD)。C
    的頭像 發表于 12-02 09:51 ?1471次閱讀
    【芯選擇】<b class='flag-5'>CC1101</b>芯片的模塊實例
    威尼斯人娱乐城网络百家乐| 百家乐规则技法| 澳博足球| 皇冠百家乐客户端皇冠| 百家乐官网是如何出千的| 大发888赌场| 百家乐开户就送现金| 代理百家乐官网免费试玩| 足球投注开户| 华盛顿百家乐的玩法技巧和规则 | 大发娱乐城| 大世界百家乐娱乐场| 至尊百家乐官网娱乐| 江北区| 百家乐波音独家注册送彩| 百家乐怎么玩呀| 缅甸百家乐官网玩家吗| 嘉义市| 大发888易付168| 如何玩百家乐游戏| 西游记百家乐官网娱乐城| 百家乐官网投注网中国体育| 威尼斯人娱乐网注册| 百家乐的规则博彩正网| 百家乐官网新送彩金| 百家乐官网推荐怎么看| 星空棋牌大厅下载| 贵宾百家乐的玩法技巧和规则 | 百家乐网站开户| 网上百家乐官网是叫九五至尊么| 凤山县| 皇冠现金网导航| 玩百家乐的玩法技巧和规则| 百家乐视频官网| 百家乐官网赌博破解| 论坛| 大赢家足球比分| 大发888娱乐城亚付宝| 澳门百家乐心| 网上百家乐有没有假| 百家乐官网事电影|