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

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

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

基于STM32驅(qū)動(dòng)CC1101的程序分析 淺談CC1101調(diào)試

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

本文主要是關(guān)于CC1101的相關(guān)介紹,并著重對(duì)基于STM32驅(qū)動(dòng)CC1101的程序進(jìn)行了詳盡的分析。

基于STM32驅(qū)動(dòng)CC1101的程序分析

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

其次,當(dāng)STM32與CC1101的SPI通信完成后,果斷開(kāi)始CC1101后續(xù)驅(qū)動(dòng)的移植。移植過(guò)程中,所有變量名、函數(shù)名與TI提供的驅(qū)動(dòng)里的保持一致,當(dāng)然CC1101寄存器配置也保持移植。對(duì)于移植初期,我并沒(méi)有太多的關(guān)心CC1101的時(shí)序問(wèn)題,只關(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)移植下來(lái),關(guān)于CC1101的驅(qū)動(dòng)函數(shù)也大多了然在心了。

/*

** CC1101 433MHz無(wú)線模塊相互通信

** 2014-11-16

*/

#include “stm32f10x.h”

#include “cc1101.h”

#include “led.h”

/*************NVIC控制器配置***************************/

//組號(hào) 搶占位數(shù) 子優(yōu)先級(jí)數(shù)量

// 組0 0 4

// 組1 1 3

// 組2 2 2

// 組3 3 1

// 組4 4 0

#define NVIC_PRIORITY_GROUP_0 (7 - 0)

#define NVIC_PRIORITY_GROUP_1 (7 - 1)

#define NVIC_PRIORITY_GROUP_2 (7 - 2)

#define NVIC_PRIORITY_GROUP_3 (7 - 3)

#define NVIC_PRIORITY_GROUP_4 (7 - 4)

#define NVIC_PRIORITY_GROUP (NVIC_PRIORITY_GROUP_2) /* 設(shè)置為組2 */

//#include “RF_Send.h”

//#include “task.h”

//***************更多功率參數(shù)設(shè)置可詳細(xì)參考DATACC1100英文文檔中第48-49頁(yè)的參數(shù)表******************

//INT8U PaTabel[8] = {0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04 ,0x04}; //-30dBm 功率最小

//INT8U PaTabel[8] = {0x17,0x17 ,0x17 ,0x17 ,0x17 ,0x17,0x17 ,0x17}; //-20dBm

//INT8U PaTabel[8] = {0x1D,0x1D ,0x1D ,0x1D ,0x1D ,0x1D,0x1D ,0x1D}; //-15dBm

//INT8U PaTabel[8] = {0x26,0x26 ,0x26 ,0x26 ,0x26 ,0x26,0x26 ,0x26}; //-10dBm

//INT8U PaTabel[8] = {0x37,0x37 ,0x37 ,0x37 ,0x37 ,0x37,0x37 ,0x37}; //-6dBm

//INT8U PaTabel[8] = {0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60 ,0x60};//0dBm

//INT8U PaTabel[8] = {0x86,0x86 ,0x86 ,0x86 ,0x86 ,0x86,0x86 ,0x86}; //5dBm

const u8 PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};//12dBm

u8 RF_Read_Buff[64];//接收緩沖區(qū)

_RF_Sta RF_Sta;//RF狀態(tài)

/////////////////////////////////////////////////////////////////

const RF_SETTINGS rfSettings =

{

0x00,

0x08, // FSCTRL1 Frequency synthesizer control.

0x00, // FSCTRL0 Frequency synthesizer control.

0x10, // FREQ2 Frequency control word, high byte.

0xA7, // FREQ1 Frequency control word, middle byte.

0x62, // FREQ0 Frequency control word, low byte.

0x5B, // MDMCFG4 Modem configuration.

0xF8, // MDMCFG3 Modem configuration.

0x03, // MDMCFG2 Modem configuration.

0x22, // MDMCFG1 Modem configuration.

0xF8, // MDMCFG0 Modem configuration.

0x00, // CHANNR Channel number.

0x47, // DEVIATN Modem deviation setting (when FSK modulation is enabled)。

0xB6, // FREND1 Front end RX configuration.

0x10, // FREND0 Front end RX configuration.

0x18, // MCSM0 Main Radio Control State Machine configuration.

// 0x0F, // MCSM1 Main Radio Control State Machine configuration.

0x1D, // FOCCFG Frequency Offset Compensation Configuration.

0x1C, // BSCFG Bit synchronization Configuration.

0xC7, // AGCCTRL2 AGC control.

0x00, // AGCCTRL1 AGC control.

0xB2, // AGCCTRL0 AGC control.

0xEA, // FSCAL3 Frequency synthesizer calibration.

0x2A, // FSCAL2 Frequency synthesizer calibration.

0x00, // FSCAL1 Frequency synthesizer calibration.

0x11, // FSCAL0 Frequency synthesizer calibration.

0x59, // FSTEST Frequency synthesizer calibration.

0x81, // TEST2 Various test settings.

0x35, // TEST1 Various test settings.

0x09, // TEST0 Various test settings.

0x0B, // IOCFG2 GDO2 output pin configuration.

0x06, // IOCFG0D GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanation.

0x04, // PKTCTRL1 Packet automation control.

0x05, // PKTCTRL0 Packet automation control.

0x00, // ADDR Device address.

RFDATLEN // PKTLEN Packet length.

};

//*****************************************************************************************

//函數(shù)名:delayus(unsigned int s)

//輸入:時(shí)間

//輸出:無(wú)

//功能描述:普通廷時(shí),內(nèi)部用

//*****************************************************************************************

void delayus(u16 timeout)

{

u8 i;

do

{

for(i=0; i《20; i++);

}

while (--timeout);

}

/*****************************************************************************************/

//函數(shù)名:CC1101_SpiInit()

//輸入:無(wú)

//輸出:無(wú)

//功能描述:SPI初始化程序

/*****************************************************************************************/

void CC1101_SpiInit(void)

{

RCC-》APB2ENR|=1《《4; //使能PORTC時(shí)鐘

GPIOC-》CRL&=0Xff000000;

GPIOC-》CRL|=0X00833388;

GPIOC-》ODR|=0x00000023;

}

void Open_GD0_Interrupt(void)

{

uint32_t priority;

/* 使能io復(fù)用時(shí)鐘 */

RCC-》APB2ENR |= 1 《《 0;

/* 配置為輸外部中斷5在PC5上 */

AFIO-》EXTICR[1] &= ~(0xF 《《 4);

AFIO-》EXTICR[1] |= (2 《《 4);

/* 開(kāi)啟外部中斷5 */

EXTI-》IMR |= (1 《《 5);

/* 上升沿觸發(fā) */

EXTI-》RTSR |= (1 《《 5);

EXTI-》FTSR &= ~(1 《《 5);

NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP); /* 設(shè)置為組2 */

priority = NVIC_EncodePriority (NVIC_PRIORITY_GROUP, 2, 3);

NVIC_SetPriority(EXTI9_5_IRQn,priority); /* EXTIx_IRQn 在stm32f10x.h中有定義 */

NVIC_EnableIRQ(EXTI9_5_IRQn);

}

//*****************************************************************************************

//函數(shù)名:SpisendByte(INT8U dat)

//輸入:發(fā)送的數(shù)據(jù)

//輸出:無(wú)

//功能描述:SPI發(fā)送一個(gè)字節(jié)

//*****************************************************************************************

u8 SpiTxRxByte(u8 dat)

{

u8 i,j,temp= 0;

SCK = 0;

for(i=0; i《8; i++)

{

if(dat & 0x80)MOSI = 1;

else MOSI = 0;

j++;j++;

dat 《《= 1;

j++;j++;

SCK = 1;

j++;j++;

temp 《《= 1;

if(MISO)temp++;

SCK = 0;

j++;j++;

}

return temp;

}

//*****************************************************************************************

//函數(shù)名:void RESET_CC1100(void)

//輸入:無(wú)

//輸出:無(wú)

//功能描述:復(fù)位CC1100

//*****************************************************************************************

u8 RESET_CC1100(void)

{

u16 n=0;

CSN = 0;

while(MISO)

{

if(++n》300)return 0;

delayus(5);

}

n=0;

SpiTxRxByte(CCxxx0_SRES); //寫入復(fù)位命令

while(MISO)

{

if(++n》300)return 0;

delayus(5);

}

CSN = 1;

return 1;

}

//*****************************************************************************************

//函數(shù)名:void POWER_UP_RESET_CC1100(void)

//輸入:無(wú)

//輸出:無(wú)

//功能描述:上電復(fù)位CC1100

//*****************************************************************************************

u8 POWER_UP_RESET_CC1100(void)

{

CSN = 1;

delayus(10);

CSN = 0;

delayus(10);

CSN = 1;

delayus(100);

if(RESET_CC1100())return 1; //復(fù)位CC1100

return 0;

}

CC1101調(diào)試

關(guān)于濾波指令和寄存器配置:

其實(shí)這里也TFT配置差不多,玩過(guò)TFT的都有同感,TFT可以通過(guò)RW引腳控制是讀還是寫,如果是寫寄存器,先寫寄存器的地址,然后寫數(shù)據(jù),數(shù)據(jù)就到了相應(yīng)的寄存器里面了;讀就是RW引腳設(shè)置為讀對(duì)應(yīng)的電平,先寫寄存器的地址,該寄存器里面的數(shù)據(jù)就可以讀出來(lái)了。明白了這些其實(shí)理解CC1101就可以很容易理解了。

那么對(duì)應(yīng)CC1101的理解:

寄存器的配置:

CC1101寄存器地址是0~0x3F,也就是BIT0~BIT5

CC1101讀寫控制是BIT7,BIT7為1時(shí),為讀對(duì)應(yīng)的寄存器,BIT7為0時(shí),為寫相應(yīng)的寄存器。

那么還剩下一個(gè)BIT6,BIT6是突發(fā)訪問(wèn)控制為,BIT6為1為突發(fā)訪問(wèn),BIT6為0為單字節(jié)訪問(wèn)。(突發(fā)訪問(wèn)下面說(shuō))

這樣我們就可以很容易理解了,比如配置PKTCTRL0寄存器,其地址0x08,我們突發(fā)訪問(wèn)寫的話寫先數(shù)據(jù)0x48,再連續(xù)寫數(shù)據(jù),這里明白了突發(fā)訪問(wèn)后就很容易知道了,如果單字節(jié)讀這個(gè)寄存器,先寫數(shù)據(jù)0x88,讀一下就可以了。

命令濾波:

命令濾波這里和TFT的寫0x22是一樣的,它就自動(dòng)跳轉(zhuǎn)到寄存器的出口,cc1101這里也是,只要寫一下對(duì)應(yīng)的寄存器的地址,不用寫數(shù)據(jù),它就內(nèi)部自動(dòng)執(zhí)行相應(yīng)的指令,比如重啟芯片,設(shè)置為發(fā)送模式,共有14個(gè)濾波指令,地址從0x30~0x3D。

關(guān)于濾波指令的狀態(tài)寄存器其實(shí)是可讀不可寫的,

也就是0x30~0x3D的地址加上0xC0,(BIT7 和IBT6為1,前面說(shuō)過(guò)了),比如寫數(shù)據(jù)0xF4,就可以讀到相應(yīng)RSSI狀態(tài)寄存器里面的值。

CC1101的幾個(gè)狀態(tài):

幾個(gè)狀態(tài)分別是,IDLE,TX,RX,F(xiàn)STXON,校準(zhǔn),遷移,RXFIFO_OVERFLOW,TXFIFO_OVERFLOW,有讀的狀態(tài)字的BIT6~BIT4決定

結(jié)語(yǔ)

關(guān)于基于STM32驅(qū)動(dòng)CC1101的程序的相關(guān)介紹就到這了,如有不足之處歡迎指正。

相關(guān)閱讀推薦:一文看懂CC110L與CC1101的區(qū)別

相關(guān)閱讀推薦:無(wú)線芯片CC1100和CC1101的區(qū)別

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

    關(guān)注

    2263

    文章

    10846

    瀏覽量

    353763
  • CC1101
    +關(guān)注

    關(guān)注

    4

    文章

    36

    瀏覽量

    23060
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CC1101組網(wǎng)與假死問(wèn)題

    CC1101 關(guān)于SWOR的的幾個(gè)理解CC1101CC1100區(qū)別及一些假死問(wèn)題分析!CC1101為什么會(huì)收到錯(cuò)誤字符?本人第一次使用
    發(fā)表于 08-29 17:45

    cc1101天線設(shè)計(jì)

    cc1101天線設(shè)計(jì),又需要的朋友下來(lái)看看。
    發(fā)表于 02-15 15:10 ?102次下載

    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次下載

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

    cc1101中文數(shù)據(jù)手冊(cè)
    發(fā)表于 09-22 11:05 ?79次下載
    <b class='flag-5'>cc1101</b>中文數(shù)據(jù)手冊(cè)

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

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

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

    電子發(fā)燒友網(wǎng)為你提供TI(ti)CC1101相關(guān)產(chǎn)品參數(shù)、數(shù)據(jù)手冊(cè),更有CC1101的引腳圖、接線圖、封裝手冊(cè)、中文資料、英文資料,CC1101真值表,CC1101管腳等資料,希望可以
    發(fā)表于 11-02 19:33
    <b class='flag-5'>CC1101</b> 低功耗(低于 1GHz)射頻收發(fā)器

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

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

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

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

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

    最后,TI驅(qū)動(dòng)里提供的是輪詢的方式收發(fā)數(shù)據(jù),對(duì)于初期來(lái)說(shuō),首先需要實(shí)現(xiàn)CC1101的工作,編譯調(diào)試移植到STM32上的CC1101
    的頭像 發(fā)表于 09-06 15:18 ?7671次閱讀
    <b class='flag-5'>淺談</b><b class='flag-5'>CC1101</b><b class='flag-5'>驅(qū)動(dòng)</b>在<b class='flag-5'>STM32</b>F103的移植

    cc1101低功耗設(shè)計(jì)方案 CC1101收發(fā)驅(qū)動(dòng)程序

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

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

    本文主要是關(guān)于無(wú)線芯片CC1100和CC1101的相關(guān)介紹,并著重對(duì)無(wú)線芯片CC1100和CC1101進(jìn)行了詳盡的對(duì)比分析。
    發(fā)表于 03-09 12:44 ?1280次閱讀

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

    本文主要是關(guān)于無(wú)線芯片CC1100和CC1101的相關(guān)介紹,并著重對(duì)無(wú)線芯片CC1100和CC1101進(jìn)行了詳盡的對(duì)比分析。
    的頭像 發(fā)表于 03-09 18:28 ?2126次閱讀

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

    CC1101芯片CC1101是一款低于1GHz設(shè)計(jì)旨在用于極低功耗RF應(yīng)用。其主要針對(duì)工業(yè)、科研和醫(yī)療(ISM)以及短距離無(wú)線通信設(shè)備(SRD)。CC1101可提供對(duì)數(shù)據(jù)包處理、數(shù)據(jù)緩沖、突發(fā)傳輸
    的頭像 發(fā)表于 12-02 09:51 ?1253次閱讀
    【芯選擇】<b class='flag-5'>CC1101</b>芯片的模塊實(shí)例

    CC2500和CC1101移植說(shuō)明

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