下面是驅動程序,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);
- }
|