久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4210|回復: 1
打印 上一主題 下一主題
收起左側

STM8驅動CC1101程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:186207 發表于 2017-4-5 10:35 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
下面是驅動程序,stm8單片機的型號是STM8S103F3P6

驅動代碼:
  • /*************************************************************************************************************
  • * 文件名: CC1101.c
  • * 功能:  STM8 CC1101驅動函數
  • * 作者:  cp1300@139.com
  • * 創建時間: 2013-12-06 14:35
  • * 最后修改時間:2013-12-06
  • * 詳細:  433MHZ收發芯片驅動
  • *************************************************************************************************************/  
  • #include "system.h"  
  • #include "delay.h"  
  • #include "CC1101.h"  
  •   
  • //CC1101命令掩碼  
  • #define     WRITE_BURST         0x40                        //連續寫入  
  • #define     READ_SINGLE         0x80                        //讀  
  • #define     WRITE_SINGLE        0x00                        //寫  
  • #define     READ_BURST          0xC0  
  •   
  •   
  •   
  • //連續讀  
  • #define     BURST_READ_FIFO     0xff        //突發讀取RX FIFO  
  • #define     BYTE_READ_FIFO      0xBF        //單字節讀取 RX FIFO  
  • #define     BURST_WRITE_FIFO    0x7f        //突發寫TX FIFO  
  • #define     BYTE_WRITE_FIFO     0x3f        //單字節寫 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讀寫一字節  
  • //不帶片選  
  • 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();                //時鐘上升沿寫入數據  
  •         temp <<= 1;nop;  
  •         if(CC1101_GetMISO()) temp ++;  
  •         CC1101_SCLK_L();                //時鐘下降沿讀取數據  
  •     }  
  •   
  •     return temp;  
  • }  
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數    :   u8 CC1101_Command(CC1101_CMD_TYPE Cmd)
  • * 功能    :   發送單字節命令
  • * 參數    :   Cmd;命令,見CC1101_CMD_TYPE
  • * 返回    :   寄存器的值
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時間    :   2013-12-06
  • * 最后修改時間 : 2013-12-06
  • * 說明    :   以寫的方式單直接訪問將觸發響應的命令
  • *************************************************************************************************************************/  
  • u8 CC1101_Command(CC1101_CMD_TYPE Cmd)  
  • {  
  •     u8 status;  
  •   
  •     CC1101_CS_L();                              //片選有效  
  •     while(CC1101_GetMISO());  
  •     status = CC1101_ReadWriteByte((u8)Cmd);     //發送命令  
  •     while(CC1101_GetMISO());  
  •     CC1101_CS_H();                              //片選關閉  
  •     return status;  
  • }  
  •   
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數    :   u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr)
  • * 功能    :   讀取CC1101通用寄存器
  • * 參數    :   RegAddr:寄存器地址,見:CC1101_REG_TYPE
  • * 返回    :   寄存器的值
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時間    :   2013-12-06
  • * 最后修改時間 : 2013-12-06
  • * 說明    :   一次讀取一個寄存器
  • *************************************************************************************************************************/  
  • u8 CC1101_ReadReg(CC1101_REG_TYPE RegAddr)  
  • {  
  •     u8 data;  
  •   
  •     CC1101_CS_L();                                  //片選有效  
  •     CC1101_ReadWriteByte((u8)READ_SINGLE|RegAddr);  //發送讀命令以及寄存器索引  
  •     data = CC1101_ReadWriteByte(0xff);              //讀取  
  •     CC1101_CS_H();                                  //片選關閉  
  •     return data;  
  • }  
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數    :   u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data)
  • * 功能    :   寫入CC1101通用寄存器
  • * 參數    :   RegAddr:寄存器地址,見:CC1101_REG_TYPE,data:需要寫入的數據
  • * 返回    :   狀態寄存器的值
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時間    :   2013-12-06
  • * 最后修改時間 : 2013-12-06
  • * 說明    :   一次寫入一個寄存器,并返回狀態
  •             不要對只讀的寄存器進行寫操作
  • *************************************************************************************************************************/  
  • u8 CC1101_WriteReg(CC1101_REG_TYPE RegAddr, u8 data)  
  • {  
  •     u8 status;  
  •   
  •     if(RegAddr > 0x80) return 0;                             //防止誤操作,0x30以后的寄存器為只讀狀態寄存器  
  •     CC1101_CS_L();                                              //片選有效  
  •     while(CC1101_GetMISO());  
  •     status = CC1101_ReadWriteByte((u8)WRITE_SINGLE|RegAddr);    //發送寫命令以及寄存器索引  
  •     CC1101_ReadWriteByte(data);                                 //寫入數據  
  •     CC1101_CS_H();                                              //片選關閉  
  •     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對應PC3,PC4  
  •     GPIOx_Init(GPIOC, BIT3, IN_UP);  
  •     GPIOx_Init(GPIOC, BIT4, IN_UP);  
  •   
  •     //初始化寄存器  
  •     CC1101_Command(CC1101_CMD_SRES);                    //復位  
  •     Delay_MS(10);  
  •       
  •     while(CC1101_ReadReg(CC1101_REG_AGCTEST) != 0x3F)   //檢測通信  
  •     {  
  •         LED_ON();  
  •         Delay_MS(10);  
  •         LED_OFF();  
  •         Delay_MS(100);  
  •     }  
  •     LED_OFF();  
  •   
  •     CC1101_WriteReg(CC1101_REG_IOCFG0,0x06);            //發送提示引腳  
  •     CC1101_WriteReg(CC1101_REG_IOCFG2,0x01);            //接收提示引腳  
  •   
  •     CC1101_WriteReg(CC1101_REG_FIFOTHR,0x0f);           //RX FIFO和TX FIFO門限  
  •     CC1101_WriteReg(CC1101_REG_SYNC1,0xD3);             //同步詞匯,高字節  
  •     CC1101_WriteReg(CC1101_REG_SYNC0,0x91);             //同步詞匯,低字節  
  •     CC1101_WriteReg(CC1101_REG_PKTLEN,CC1101_DATA_LEN); //數據包長度,255  
  •     CC1101_WriteReg(CC1101_REG_PKTCTRL1,0x04);          //數據包自動控制  
  •     CC1101_WriteReg(CC1101_REG_PKTCTRL0,0x04);          //數據包自動控制  
  •     CC1101_WriteReg(CC1101_REG_ADDR,0x00);              //設備地址  
  •     CC1101_WriteReg(CC1101_REG_CHANNR,0x00);            //信道  
  •     CC1101_WriteReg(CC1101_REG_FSCTRL1,0x06);           //頻率合成器控制,高字節  
  •     CC1101_WriteReg(CC1101_REG_FSCTRL0,0x00);           //頻率合成器控制,低字節  
  •     CC1101_WriteReg(CC1101_REG_FREQ2,0x10);             //頻率控制詞匯,高字節  
  •     CC1101_WriteReg(CC1101_REG_FREQ1,0xb1);             //頻率控制詞匯,中間字節  
  •     CC1101_WriteReg(CC1101_REG_FREQ0,0x3b);             //頻率控制詞匯,低字節  
  •       
  •     //2.4KBPS  
  •     CC1101_WriteReg(CC1101_REG_MDMCFG4,0xF6);           //調制器配置  
  •     CC1101_WriteReg(CC1101_REG_MDMCFG3,0x83);           //調制器配置  
  •       
  •     CC1101_WriteReg(CC1101_REG_MDMCFG2,0x13);           //調制器配置  
  •     CC1101_WriteReg(CC1101_REG_MDMCFG1,0x22);           //調制器配置  
  •     CC1101_WriteReg(CC1101_REG_MDMCFG0,0xf8);           //調制器配置  
  •       
  •     CC1101_WriteReg(CC1101_REG_DEVIATN,0x15);           //調制器背離設置  
  •     CC1101_WriteReg(CC1101_REG_MCSM2,0x07);             //主通信控制狀態機配置  
  •     CC1101_WriteReg(CC1101_REG_MCSM1,0x30);             //主通信控制狀態機配置  
  •     CC1101_WriteReg(CC1101_REG_MCSM0,0x18);             //主通信控制狀態機配置  
  •     CC1101_WriteReg(CC1101_REG_FOCCFG,0x16);            //頻率偏移補償配置  
  •     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);           //高字節時間0暫停  
  •     CC1101_WriteReg(CC1101_REG_WOREVT0,0x6b);           //低字節時間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);            //頻率合成器校準  
  •     CC1101_WriteReg(CC1101_REG_FSCAL2,0x2a);            //頻率合成器校準  
  •     CC1101_WriteReg(CC1101_REG_FSCAL1,0x00);            //頻率合成器校準  
  •     CC1101_WriteReg(CC1101_REG_FSCAL0,0x1f);            //頻率合成器校準  
  •     CC1101_WriteReg(CC1101_REG_RCCTRL1,0x41);           //RC振蕩器配置  
  •     CC1101_WriteReg(CC1101_REG_RCCTRL0,0x00);           //RC振蕩器配置  
  •     CC1101_WriteReg(CC1101_REG_FSTEST,0x59);            //頻率合成器校準控制  
  •       
  •     //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);  
  • }  
  •   
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數    :   void CC1101_WriteTxFIFO(u8 *pBuff,u8 len)
  • * 功能    :   寫入數據到發送緩沖區
  • * 參數    :   pBuff:需要寫入的數據緩沖區指針,len:需要寫入的數據長度
  • * 返回    :   無
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時間    :   2014-01-01
  • * 最后修改時間 : 2014-01-01
  • * 說明    :   寫入數據到發送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();  
  • }  
  •   
  •   
  •   
  • /*************************************************************************************************************************
  • * 函數    :   void CC1101_ReadRxFIFO(u8 *pBuff,u8 len)
  • * 功能    :   讀取接收緩沖區
  • * 參數    :   pBuff:需要讀取的數據緩沖區指針,len:需要讀取的數據長度
  • * 返回    :   無
  • * 依賴    :   底層宏定義
  • * 作者    :   cp1300@139.com
  • * 時間    :   2014-01-01
  • * 最后修改時間 : 2014-01-01
  • * 說明    :   從接收FIFO讀取數據
  • *************************************************************************************************************************/  
  • 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();  
  • }  
  •   
  •   
  • //發送數據,將緩沖區數據全部發送出去  
  • //一次最多64B,因為受到FIFO限制  
  • void CC1101_RfDataSend(u8 *pBuff,u8 len)  
  • {  
  •     CC1101_Command(CC1101_CMD_SIDLE);   //退出當前模式  
  •     CC1101_Command(CC1101_CMD_SFTX);    //清空發送緩沖區  
  •     CC1101_WriteTxFIFO(pBuff, len);     //寫入數據到發送緩沖區  
  •     CC1101_Command(CC1101_CMD_STX);     //開始發送數據  
  •       
  •     while(!CC1101_GDO0);  
  •     while(CC1101_GDO0);  
  •   
  •     CC1101_Command(CC1101_CMD_SIDLE);   //退出當前模式  
  • }  
  •   
  •   
  •   
  •   
  •   
  • //發送數據包  
  • //每次發送最多65B,第一字節為長度,數據多將會重復發送  
  • //可以發送任意大小  
  • //CC1101PackSize有效數據包大小,0-64,也就是CC1101單次發送數據大小-1  
  • void CC1101_RfDataSendPack(u8 *pBuff, u16 len)  
  • {  
  •     u16 i,m,n,j;  
  •       
  •     m = len / (CC1101_DATA_LEN-1);          //整數數據幀數量  
  •     n = len % (CC1101_DATA_LEN-1);          //余數  
  •       
  •     //發送整數包  
  •     for(i = 0;i < m;i ++)                  
  •     {  
  •         Delay_MS(1);  
  •         CC1101_Command(CC1101_CMD_SIDLE);   //退出當前模式  
  •         CC1101_Command(CC1101_CMD_SFTX);    //清空發送緩沖區  
  •          
  •         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++); //寫入數據到發送緩沖區  
  •         }  
  •         CC1101_CS_H();  
  •          
  •         CC1101_Command(CC1101_CMD_STX);     //開始發送數據  
  •         while(!CC1101_GDO0);  
  •         while(CC1101_GDO0);                 //等待發送完成  
  •     }  
  •     //發送余數包  
  •     if(n!=0)  
  •     {  
  •         Delay_MS(1);  
  •         CC1101_Command(CC1101_CMD_SIDLE);   //退出當前模式  
  •         CC1101_Command(CC1101_CMD_SFTX);    //清空發送緩沖區  
  •         CC1101_CS_L();  
  •         CC1101_ReadWriteByte(BURST_WRITE_FIFO);  
  •          
  •         CC1101_ReadWriteByte(n);            //先寫入包大小      
  •         for(j = 0;j < n;j ++)  
  •         {  
  •             CC1101_ReadWriteByte(*pBuff++); //寫入數據到發送緩沖區  
  •         }  
  •         CC1101_CS_H();  
  •          
  •         CC1101_Command(CC1101_CMD_STX);     //開始發送數據  
  •         while(!CC1101_GDO0);  
  •         while(CC1101_GDO0);                 //等待發送完成  
  •     }  
  •     CC1101_Command(CC1101_CMD_SIDLE);   //退出當前模式  
  • }  
  •   
  •   
  •   
  •   
  •   
  •   
  •   
  • //讀取芯片狀態  
  • u8 CC1101_GetStatus(void)  
  • {  
  •     return CC1101_WriteReg(CC1101_REG_TEST2, 0x98);  
  • }  

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:416391 發表于 2021-8-30 17:46 | 只看該作者
很棒的源代碼~~~謝謝樓主~~~
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久久久久影院 | 国产午夜av片 | 成人av电影免费在线观看 | 成人免费小视频 | 99国产精品久久久久 | 精品久久久久久亚洲综合网 | www.天天操| 久在草 | 久久久久国产 | 欧美性猛交一区二区三区精品 | 欧产日产国产精品视频 | 一级片免费网站 | 精品成人在线视频 | 青青草亚洲 | 亚洲欧美一区二区三区在线 | 欧美一级α片 | 欧美一级黄色片在线观看 | 欧美一级片在线 | 99婷婷 | 正在播放国产精品 | 日日摸夜夜添夜夜添精品视频 | 国产在线播 | 成人影院免费视频 | 日韩中文欧美 | 精品亚洲永久免费精品 | 亚洲一区黄色 | 国外成人免费视频 | 亚洲精品久久久一区二区三区 | 午夜手机在线视频 | 精品一区在线 | 国产精品99免费视频 | 999热精品 | 中文字幕日韩一区 | 曰韩一二三区 | 亚洲精品亚洲人成人网 | 久久久久国产一区二区三区 | 亚洲精品视频观看 | 国产精品一区二区电影 | 午夜男人免费视频 | 欧美国产精品 | 久久综合狠狠综合久久综合88 |