久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
STM8驅動CC1101程序
[打印本頁]
作者:
wxx2020cn
時間:
2017-4-5 10:35
標題:
STM8驅動CC1101程序
下面是驅動程序,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);
}
作者:
hardair
時間:
2021-8-30 17:46
很棒的源代碼~~~謝謝樓主~~~
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
欧美精品一区三区
|
成人a视频在线观看
|
日韩亚洲一区二区
|
成人在线视频免费观看
|
三级在线观看
|
色一阁
|
日韩精品久久久久久
|
久热伊人
|
一区二区免费
|
亚洲人在线播放
|
在线播放中文字幕
|
日本一二三区电影
|
天天综合天天
|
无码日韩精品一区二区免费
|
av黄在线观看
|
国产一在线观看
|
国精产品一区一区三区免费完
|
国产福利在线播放麻豆
|
国产精产国品一二三产区视频
|
蜜桃视频一区二区三区
|
午夜在线视频
|
久久久久国产
|
国产男女视频
|
精品欧美
|
久久精品16
|
97久久久久久久久
|
成人小视频在线观看
|
九九热在线观看
|
久久精品中文
|
91久久国产精品
|
国产在线对白
|
日韩精品免费在线观看
|
一级黄色片毛片
|
日韩中文字幕在线视频观看
|
国产精品一区二区三
|
久久久久亚洲精品
|
天天操天天干天天爽
|
国产精品免费看
|
视频二区
|
伊大人久久
|
免费成人在线网站
|