找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 4233|回復(fù): 1
收起左側(cè)

STM8驅(qū)動(dòng)CC1101程序

[復(fù)制鏈接]
ID:186207 發(fā)表于 2017-4-5 10:35 | 顯示全部樓層 |閱讀模式
下面是驅(qū)動(dòng)程序,stm8單片機(jī)的型號(hào)是STM8S103F3P6

驅(qū)動(dòng)代碼:
  • /*************************************************************************************************************
  • * 文件名: CC1101.c
  • * 功能:  STM8 CC1101驅(qū)動(dòng)函數(shù)
  • * 作者:  cp1300@139.com
  • * 創(chuàng)建時(shí)間: 2013-12-06 14:35
  • * 最后修改時(shí)間:2013-12-06
  • * 詳細(xì):  433MHZ收發(fā)芯片驅(qū)動(dòng)
  • *************************************************************************************************************/  
  • #include "system.h"  
  • #include "delay.h"  
  • #include "CC1101.h"  
  •   
  • //CC1101命令掩碼  
  • #define     WRITE_BURST         0x40                        //連續(xù)寫入  
  • #define     READ_SINGLE         0x80                        //讀  
  • #define     WRITE_SINGLE        0x00                        //寫  
  • #define     READ_BURST          0xC0  
  •   
  •   
  •   
  • //連續(xù)讀  
  • #define     BURST_READ_FIFO     0xff        //突發(fā)讀取RX FIFO  
  • #define     BYTE_READ_FIFO      0xBF        //單字節(jié)讀取 RX FIFO  
  • #define     BURST_WRITE_FIFO    0x7f        //突發(fā)寫TX FIFO  
  • #define     BYTE_WRITE_FIFO     0x3f        //單字節(jié)寫 TX FIFO  
  •   
  • #define CC1101_DATA_LEN 64  
  •   
  •   
  •   
  • //SPI接口  
  • //底層接口宏定義  
  • #define CC1101_CS_H()               (GPIOA->ODR|=BIT3)       //PA3=1  
  • #define CC1101_CS_L()               (GPIOA->ODR&=~BIT3)      //PA3=0  
  • #define CC1101_MOSI_H()             (GPIOC->ODR|=BIT6)           //PC6  
  • #define CC1101_MOSI_L()             (GPIOC->ODR&=~BIT6)          //PC6  
  • #define CC1101_SCLK_H()             (GPIOC->ODR|=BIT5)           //PC5  
  • #define CC1101_SCLK_L()             (GPIOC->ODR&=~BIT5)          //PC5  
  • #define CC1101_GetMISO()            (GPIOC->IDR&BIT7)            //PC7  
  •   
  •   
  • //CC1101 SPI讀寫一字節(jié)  
  • //不帶片選  
  • u8 CC1101_ReadWriteByte(u8 data)  
  • {  
  •     u8 i;  
  •     u8 temp = 0;  
  •   
  •     for(i = 0;i < 8;i ++)  
  •     {  
  •         if(data & 0x80)  
  •         {  
  •             CC1101_MOSI_H();  
  •         }  
  •         else  
  •         {  
  •             CC1101_MOSI_L();  
  •         }  
  •         data <<= 1;nop;  
  •         CC1101_SCLK_H();                //時(shí)鐘上升沿寫入數(shù)據(jù)  
  •         temp <<= 1;nop;  
  •         if(CC1101_GetMISO()) temp ++;  
  •         CC1101_SCLK_L();                //時(shí)鐘下降沿讀取數(shù)據(jù)  
  •     }  
  •   
  •     return temp;  
  • }  
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數(shù)    :   u8 CC1101_Command(CC1101_CMD_TYPE Cmd)
  • * 功能    :   發(fā)送單字節(jié)命令
  • * 參數(shù)    :   Cmd;命令,見CC1101_CMD_TYPE
  • * 返回    :   寄存器的值
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時(shí)間    :   2013-12-06
  • * 最后修改時(shí)間 : 2013-12-06
  • * 說明    :   以寫的方式單直接訪問將觸發(fā)響應(yīng)的命令
  • *************************************************************************************************************************/  
  • u8 CC1101_Command(CC1101_CMD_TYPE Cmd)  
  • {  
  •     u8 status;  
  •   
  •     CC1101_CS_L();                              //片選有效  
  •     while(CC1101_GetMISO());  
  •     status = CC1101_ReadWriteByte((u8)Cmd);     //發(fā)送命令  
  •     while(CC1101_GetMISO());  
  •     CC1101_CS_H();                              //片選關(guān)閉  
  •     return status;  
  • }  
  •   
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數(shù)    :   u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr)
  • * 功能    :   讀取CC1101通用寄存器
  • * 參數(shù)    :   RegAddr:寄存器地址,見:CC1101_REG_TYPE
  • * 返回    :   寄存器的值
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時(shí)間    :   2013-12-06
  • * 最后修改時(shí)間 : 2013-12-06
  • * 說明    :   一次讀取一個(gè)寄存器
  • *************************************************************************************************************************/  
  • u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr)  
  • {  
  •     u8 data;  
  •   
  •     CC1101_CS_L();                                  //片選有效  
  •     CC1101_ReadWriteByte((u8)READ_SINGLE|RegAddr);  //發(fā)送讀命令以及寄存器索引  
  •     data = CC1101_ReadWriteByte(0xff);              //讀取  
  •     CC1101_CS_H();                                  //片選關(guān)閉  
  •     return data;  
  • }  
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數(shù)    :   u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data)
  • * 功能    :   寫入CC1101通用寄存器
  • * 參數(shù)    :   RegAddr:寄存器地址,見:CC1101_REG_TYPE,data:需要寫入的數(shù)據(jù)
  • * 返回    :   狀態(tài)寄存器的值
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時(shí)間    :   2013-12-06
  • * 最后修改時(shí)間 : 2013-12-06
  • * 說明    :   一次寫入一個(gè)寄存器,并返回狀態(tài)
  •             不要對(duì)只讀的寄存器進(jìn)行寫操作
  • *************************************************************************************************************************/  
  • u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data)  
  • {  
  •     u8 status;  
  •   
  •     if(RegAddr > 0x80) return 0;                             //防止誤操作,0x30以后的寄存器為只讀狀態(tài)寄存器  
  •     CC1101_CS_L();                                              //片選有效  
  •     while(CC1101_GetMISO());  
  •     status = CC1101_ReadWriteByte((u8)WRITE_SINGLE|RegAddr);    //發(fā)送寫命令以及寄存器索引  
  •     CC1101_ReadWriteByte(data);                                 //寫入數(shù)據(jù)  
  •     CC1101_CS_H();                                              //片選關(guān)閉  
  •     return status;  
  • }  
  •   
  •   
  • #include "LED.h"  
  • void CC1101_Init(u8 Addr)  
  • {  
  •   
  •     //初始化片選  
  •     GPIOx_Init(GPIOA, BIT3, OUT_PP_10M);  
  •     CC1101_CS_H();  
  •     //初始化SCLK  
  •     GPIOx_Init(GPIOC, BIT5, OUT_PP_10M);  
  •     CC1101_SCLK_H();  
  •     //初始化MOSI  
  •     GPIOx_Init(GPIOC, BIT6, OUT_PP_10M);  
  •     CC1101_MOSI_H();  
  •     //初始化MISO  
  •     GPIOx_Init(GPIOC, BIT7, IN_UP);  
  •   
  •     CC1101_SCLK_L();  
  •     CC1101_MOSI_L();  
  •     //初始化GDO0,GDO2對(duì)應(yīng)PC3,PC4  
  •     GPIOx_Init(GPIOC, BIT3, IN_UP);  
  •     GPIOx_Init(GPIOC, BIT4, IN_UP);  
  •   
  •     //初始化寄存器  
  •     CC1101_Command(CC1101_CMD_SRES);                    //復(fù)位  
  •     Delay_MS(10);  
  •       
  •     while(CC1101_ReadReg(CC1101_REG_AGCTEST) != 0x3F)   //檢測(cè)通信  
  •     {  
  •         LED_ON();  
  •         Delay_MS(10);  
  •         LED_OFF();  
  •         Delay_MS(100);  
  •     }  
  •     LED_OFF();  
  •   
  •     CC1101_WriteReg(CC1101_REG_IOCFG0,0x06);            //發(fā)送提示引腳  
  •     CC1101_WriteReg(CC1101_REG_IOCFG2,0x01);            //接收提示引腳  
  •   
  •     CC1101_WriteReg(CC1101_REG_FIFOTHR,0x0f);           //RX FIFO和TX FIFO門限  
  •     CC1101_WriteReg(CC1101_REG_SYNC1,0xD3);             //同步詞匯,高字節(jié)  
  •     CC1101_WriteReg(CC1101_REG_SYNC0,0x91);             //同步詞匯,低字節(jié)  
  •     CC1101_WriteReg(CC1101_REG_PKTLEN,CC1101_DATA_LEN); //數(shù)據(jù)包長(zhǎng)度,255  
  •     CC1101_WriteReg(CC1101_REG_PKTCTRL1,0x04);          //數(shù)據(jù)包自動(dòng)控制  
  •     CC1101_WriteReg(CC1101_REG_PKTCTRL0,0x04);          //數(shù)據(jù)包自動(dòng)控制  
  •     CC1101_WriteReg(CC1101_REG_ADDR,0x00);              //設(shè)備地址  
  •     CC1101_WriteReg(CC1101_REG_CHANNR,0x00);            //信道  
  •     CC1101_WriteReg(CC1101_REG_FSCTRL1,0x06);           //頻率合成器控制,高字節(jié)  
  •     CC1101_WriteReg(CC1101_REG_FSCTRL0,0x00);           //頻率合成器控制,低字節(jié)  
  •     CC1101_WriteReg(CC1101_REG_FREQ2,0x10);             //頻率控制詞匯,高字節(jié)  
  •     CC1101_WriteReg(CC1101_REG_FREQ1,0xb1);             //頻率控制詞匯,中間字節(jié)  
  •     CC1101_WriteReg(CC1101_REG_FREQ0,0x3b);             //頻率控制詞匯,低字節(jié)  
  •       
  •     //2.4KBPS  
  •     CC1101_WriteReg(CC1101_REG_MDMCFG4,0xF6);           //調(diào)制器配置  
  •     CC1101_WriteReg(CC1101_REG_MDMCFG3,0x83);           //調(diào)制器配置  
  •       
  •     CC1101_WriteReg(CC1101_REG_MDMCFG2,0x13);           //調(diào)制器配置  
  •     CC1101_WriteReg(CC1101_REG_MDMCFG1,0x22);           //調(diào)制器配置  
  •     CC1101_WriteReg(CC1101_REG_MDMCFG0,0xf8);           //調(diào)制器配置  
  •       
  •     CC1101_WriteReg(CC1101_REG_DEVIATN,0x15);           //調(diào)制器背離設(shè)置  
  •     CC1101_WriteReg(CC1101_REG_MCSM2,0x07);             //主通信控制狀態(tài)機(jī)配置  
  •     CC1101_WriteReg(CC1101_REG_MCSM1,0x30);             //主通信控制狀態(tài)機(jī)配置  
  •     CC1101_WriteReg(CC1101_REG_MCSM0,0x18);             //主通信控制狀態(tài)機(jī)配置  
  •     CC1101_WriteReg(CC1101_REG_FOCCFG,0x16);            //頻率偏移補(bǔ)償配置  
  •     CC1101_WriteReg(CC1101_REG_BSCFG,0x6c);             //位同步配置  
  •     CC1101_WriteReg(CC1101_REG_AGCTRL2,0x03);           //AGC控制  
  •     CC1101_WriteReg(CC1101_REG_AGCTRL1,0x40);           //AGC控制  
  •     CC1101_WriteReg(CC1101_REG_AGCTRL0,0x91);           //AGC控制  
  •     CC1101_WriteReg(CC1101_REG_WOREVT1,0x87);           //高字節(jié)時(shí)間0暫停  
  •     CC1101_WriteReg(CC1101_REG_WOREVT0,0x6b);           //低字節(jié)時(shí)間0暫停  
  •     CC1101_WriteReg(CC1101_REG_WORCTRL,0xfb);           //電磁波激活控制  
  •     CC1101_WriteReg(CC1101_REG_FREND1,0x56);            //前末端RX配置  
  •     CC1101_WriteReg(CC1101_REG_FREND0,0x10);            //前末端TX配置  
  •     CC1101_WriteReg(CC1101_REG_FSCAL3,0xe9);            //頻率合成器校準(zhǔn)  
  •     CC1101_WriteReg(CC1101_REG_FSCAL2,0x2a);            //頻率合成器校準(zhǔn)  
  •     CC1101_WriteReg(CC1101_REG_FSCAL1,0x00);            //頻率合成器校準(zhǔn)  
  •     CC1101_WriteReg(CC1101_REG_FSCAL0,0x1f);            //頻率合成器校準(zhǔn)  
  •     CC1101_WriteReg(CC1101_REG_RCCTRL1,0x41);           //RC振蕩器配置  
  •     CC1101_WriteReg(CC1101_REG_RCCTRL0,0x00);           //RC振蕩器配置  
  •     CC1101_WriteReg(CC1101_REG_FSTEST,0x59);            //頻率合成器校準(zhǔn)控制  
  •       
  •     //10DB  
  •     //CC1101_WriteReg(CC1101_REG_PATABLE0,0xc0);   
  •     //CC1101_WriteReg(CC1101_REG_PATABLE1,0xc0);   
  •     /*CC1101_WriteReg(CC1101_REG_PATABLE2,0xc0);  
  •     CC1101_WriteReg(CC1101_REG_PATABLE3,0xc0);  
  •     CC1101_WriteReg(CC1101_REG_PATABLE4,0xc0);  
  •     CC1101_WriteReg(CC1101_REG_PATABLE5,0xc0);  
  •     CC1101_WriteReg(CC1101_REG_PATABLE6,0xc0);  
  •     CC1101_WriteReg(CC1101_REG_PATABLE7,0xc0); */  
  •     Delay_MS(10);  
  • }  
  •   
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數(shù)    :   void CC1101_WriteTxFIFO(u8 *pBuff,u8 len)
  • * 功能    :   寫入數(shù)據(jù)到發(fā)送緩沖區(qū)
  • * 參數(shù)    :   pBuff:需要寫入的數(shù)據(jù)緩沖區(qū)指針,len:需要寫入的數(shù)據(jù)長(zhǎng)度
  • * 返回    :   無
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時(shí)間    :   2014-01-01
  • * 最后修改時(shí)間 : 2014-01-01
  • * 說明    :   寫入數(shù)據(jù)到發(fā)送FIFO
  • *************************************************************************************************************************/  
  • void CC1101_WriteTxFIFO(u8 *pBuff,u8 len)  
  • {  
  •     u16 i;  
  •   
  •     CC1101_CS_L();  
  •     CC1101_ReadWriteByte(BURST_WRITE_FIFO);  
  •     for(i = 0;i < len;i ++)  
  •     {  
  •         CC1101_ReadWriteByte(pBuff);  
  •     }  
  •     CC1101_CS_H();  
  • }  
  •   
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數(shù)    :   void CC1101_ReadRxFIFO(u8 *pBuff,u8 len)
  • * 功能    :   讀取接收緩沖區(qū)
  • * 參數(shù)    :   pBuff:需要讀取的數(shù)據(jù)緩沖區(qū)指針,len:需要讀取的數(shù)據(jù)長(zhǎng)度
  • * 返回    :   無
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時(shí)間    :   2014-01-01
  • * 最后修改時(shí)間 : 2014-01-01
  • * 說明    :   從接收FIFO讀取數(shù)據(jù)
  • *************************************************************************************************************************/  
  • void CC1101_ReadRxFIFO(u8 *pBuff,u8 len)  
  • {  
  •     u16 i;  
  •   
  •     CC1101_CS_L();  
  •     CC1101_ReadWriteByte(BURST_READ_FIFO);  
  •     for(i = 0;i < len;i ++)  
  •     {  
  •         pBuff = CC1101_ReadWriteByte(0xff);  
  •     }  
  •     CC1101_CS_H();  
  • }  
  •   
  •   
  • //發(fā)送數(shù)據(jù),將緩沖區(qū)數(shù)據(jù)全部發(fā)送出去  
  • //一次最多64B,因?yàn)槭艿紽IFO限制  
  • void CC1101_RfDataSend(u8 *pBuff,u8 len)  
  • {  
  •     CC1101_Command(CC1101_CMD_SIDLE);   //退出當(dāng)前模式  
  •     CC1101_Command(CC1101_CMD_SFTX);    //清空發(fā)送緩沖區(qū)  
  •     CC1101_WriteTxFIFO(pBuff, len);     //寫入數(shù)據(jù)到發(fā)送緩沖區(qū)  
  •     CC1101_Command(CC1101_CMD_STX);     //開始發(fā)送數(shù)據(jù)  
  •       
  •     while(!CC1101_GDO0);  
  •     while(CC1101_GDO0);  
  •   
  •     CC1101_Command(CC1101_CMD_SIDLE);   //退出當(dāng)前模式  
  • }  
  •   
  •   
  •   
  •   
  •   
  • //發(fā)送數(shù)據(jù)包  
  • //每次發(fā)送最多65B,第一字節(jié)為長(zhǎng)度,數(shù)據(jù)多將會(huì)重復(fù)發(fā)送  
  • //可以發(fā)送任意大小  
  • //CC1101PackSize有效數(shù)據(jù)包大小,0-64,也就是CC1101單次發(fā)送數(shù)據(jù)大小-1  
  • void CC1101_RfDataSendPack(u8 *pBuff, u16 len)  
  • {  
  •     u16 i,m,n,j;  
  •       
  •     m = len / (CC1101_DATA_LEN-1);          //整數(shù)數(shù)據(jù)幀數(shù)量  
  •     n = len % (CC1101_DATA_LEN-1);          //余數(shù)  
  •       
  •     //發(fā)送整數(shù)包  
  •     for(i = 0;i < m;i ++)                  
  •     {  
  •         Delay_MS(1);  
  •         CC1101_Command(CC1101_CMD_SIDLE);   //退出當(dāng)前模式  
  •         CC1101_Command(CC1101_CMD_SFTX);    //清空發(fā)送緩沖區(qū)  
  •          
  •         CC1101_CS_L();  
  •         CC1101_ReadWriteByte(BURST_WRITE_FIFO);  
  •          
  •         CC1101_ReadWriteByte(CC1101_DATA_LEN-1);//先寫入包大小      
  •         for(j = 0;j < (CC1101_DATA_LEN-1);j ++)  
  •         {  
  •             CC1101_ReadWriteByte(*pBuff++); //寫入數(shù)據(jù)到發(fā)送緩沖區(qū)  
  •         }  
  •         CC1101_CS_H();  
  •          
  •         CC1101_Command(CC1101_CMD_STX);     //開始發(fā)送數(shù)據(jù)  
  •         while(!CC1101_GDO0);  
  •         while(CC1101_GDO0);                 //等待發(fā)送完成  
  •     }  
  •     //發(fā)送余數(shù)包  
  •     if(n!=0)  
  •     {  
  •         Delay_MS(1);  
  •         CC1101_Command(CC1101_CMD_SIDLE);   //退出當(dāng)前模式  
  •         CC1101_Command(CC1101_CMD_SFTX);    //清空發(fā)送緩沖區(qū)  
  •         CC1101_CS_L();  
  •         CC1101_ReadWriteByte(BURST_WRITE_FIFO);  
  •          
  •         CC1101_ReadWriteByte(n);            //先寫入包大小      
  •         for(j = 0;j < n;j ++)  
  •         {  
  •             CC1101_ReadWriteByte(*pBuff++); //寫入數(shù)據(jù)到發(fā)送緩沖區(qū)  
  •         }  
  •         CC1101_CS_H();  
  •          
  •         CC1101_Command(CC1101_CMD_STX);     //開始發(fā)送數(shù)據(jù)  
  •         while(!CC1101_GDO0);  
  •         while(CC1101_GDO0);                 //等待發(fā)送完成  
  •     }  
  •     CC1101_Command(CC1101_CMD_SIDLE);   //退出當(dāng)前模式  
  • }  
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  • //讀取芯片狀態(tài)  
  • u8 CC1101_GetStatus(void)  
  • {  
  •     return CC1101_WriteReg(CC1101_REG_TEST2, 0x98);  
  • }  

回復(fù)

使用道具 舉報(bào)

ID:416391 發(fā)表于 2021-8-30 17:46 | 顯示全部樓層
很棒的源代碼~~~謝謝樓主~~~
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表