|
下面是驅(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);
- }
|
|