#include "config.h"
#include "CC1101.h"
// RF_SETTINGS is a data structure which contains all relevant CCxxx0 registers
typedef struct S_RF_SETTINGS
{
unsigned char FSCTRL2; //另外加的
unsigned char FSCTRL1; // 频率合成器控制
unsigned char FSCTRL0; // 频率控制词汇,高字节
unsigned char FREQ2; // 频率控制词汇,中间字节
unsigned char FREQ1; // 频率控制词汇,低字节
unsigned char FREQ0; // 调制器配置
unsigned char MDMCFG4; // 调制器配置
unsigned char MDMCFG3; // 调制器配置
unsigned char MDMCFG2; // 调制器配置
unsigned char MDMCFG1; // 调制器配置
unsigned char MDMCFG0; // 调制器背离设置
unsigned char CHANNR; // 信道数
unsigned char DEVIATN; // 主通信控制状态机配置
unsigned char FREND1; // 前末端TX配置
unsigned char FREND0; // 频率合成器校准
unsigned char MCSM0; // 频率偏移补偿配置
unsigned char FOCCFG; // 位同步配置
unsigned char BSCFG; // AGC控制
unsigned char AGCCTRL2; // AGC控制
unsigned char AGCCTRL1; // AGC控制
unsigned char AGCCTRL0; // 高字节时间0暂停
unsigned char FSCAL3; // 频率合成器校准
unsigned char FSCAL2; // 频率合成器校准
unsigned char FSCAL1; // 频率合成器校准
unsigned char FSCAL0; // RC振荡器配置
unsigned char FSTEST; // 产品测试
unsigned char TEST2; // 不同的测试设置
unsigned char TEST1; // 不同的测试设置
unsigned char TEST0; // 不同的测试设置
unsigned char IOCFG2; // GDO2输出脚配置
unsigned char IOCFG0; // GDO0输出脚配置
unsigned char PKTCTRL1; // 数据包自动控制
unsigned char PKTCTRL0; // 数据包自动控制
unsigned char ADDR; // 设备地址
unsigned char PKTLEN; // 数据包长度
} RF_SETTINGS;
/////////////////////////////////////////////////////////////////
const RF_SETTINGS rfSettings =
{
0x00, //另外加的
0x08, // 频率合成器控制
0x00, // 频率控制词汇,高字节
0x10, // 频率控制词汇,中间字节
0xA7, // 频率控制词汇,低字节
0x62, // 调制器配置
0x5B, // 调制器配置
0xF8, // 调制器配置
0x03, // 调制器配置
0x22, // 调制器配置
0xF8, // 调制器背离设置
0x00, // 信道数
0x47, // 主通信控制状态机配置
0xB6, // 前末端TX配置
0x10, // 频率合成器校准
0x18, // 频率偏移补偿配置
0x1D, // 位同步配置
0x1C, // AGC控制
0xC7, // AGC控制
0x00, // AGC控制
0xB2, // 高字节时间0暂停
0xEA, // 频率合成器校准
0x2A, // 频率合成器校准
0x00, // 频率合成器校准
0x11, // RC振荡器配置
0x59, // 产品测试
0x81, // 不同的测试设置
0x35, // 不同的测试设置
0x09, // 不同的测试设置
0x0B, // GDO2输出脚配置
0x06, // GDO0输出脚配置
0x04, // 数据包自动控制
0x05, // 数据包自动控制
0x00, // 设备地址
0x3f, // 数据包长度
};
//*****************************************************************************************
//函数名:delay(unsigned int s)
//输入:时间
//输出:无
//功能描述:普通廷时,内部用
//*****************************************************************************************
static void delay(unsigned int s)
{
unsigned int i;
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
for(i=0; i<s; i++);
}
void halWait(uint timeout) {
do {
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
} while (--timeout);
}
//******************************************************************************
//函数名:SpiInit(void)
//输入:无
//输出:无
//功能描述:SPI状态初始化
//******************************************************************************
void SpiInit(void)
{
CSN=0;
SCK=0;
CSN=1;
}
/*****************************************************************************************
//函数名:CpuInit()
//输入:无
//输出:无
//功能描述:SPI初始化程序
/*****************************************************************************************/
void CpuInit(void)
{
SpiInit();
delay(5000);
}
//*****************************************************************************************
//函数名:SpisendByte(INT8U dat)
//输入:发送的数据
//输出:无
//功能描述:SPI发送一个字节
//*****************************************************************************************
uchar SpiTxRxByte(uchar dat)
{
uchar i,temp;
temp = 0;
//----------------------以下是模拟SPI时序方式-----------------------------------
SCK = 0;//拉低SCLK,初始化SCLK的状态
for(i=0; i<8; i++)
{
if(dat & 0x80)//判断dat的最高位是1还是0
{
MOSI = 1;//如果dat最高位是1,那么SI口为1
}
else MOSI = 0;//如果dat最高位为0,那么SI口为0
dat <<= 1; //dat左移一位
SCK = 1; //CCLK拉高,发送或接收数据
_nop_();
_nop_();
temp <<= 1; //记录处理数据位的变量temp左移一位
if(MISO)temp++;//接收到数据则temp加1
SCK = 0; //重新拉低SCLK,进行下一位的操作
_nop_();
_nop_();
}
return temp;
}
//*****************************************************************************************
//函数名:void RESET_CC1100(void)
//输入:无
//输出:无
//功能描述:复位CC1100 此处请参考CC1101中文手册P30
//*****************************************************************************************
void RESET_CC1100(void)
{
CSN = 0; //拉低CSn,即中文手册P30中图11的40us右边的CSn状态
while (MISO); //等待SO变低
SpiTxRxByte(CCxxx0_SRES); //写入复位命令
while (MISO); //当SO再次变低时重启完成,即中文手册P30中图11的"done"处
CSN = 1;
}
//*****************************************************************************************
//函数名:void POWER_UP_RESET_CC1100(void)
//输入:无
//输出:无
//功能描述:上电复位CC1100 此处请参考CC1101中文手册P30。
//*****************************************************************************************
void POWER_UP_RESET_CC1100(void)
{
CSN = 1;//滤波CSn为高
halWait(1); //保持CSn为高1us
CSN = 0; //将CSn拉为低
halWait(1);//保持CSn为低1us
CSN = 1; //滤波CSn为高
halWait(41); //保持CSn为高至少40us
RESET_CC1100(); //复位CC1100 发布SRES滤波
}
//*****************************************************************************************
//函数名:void halSpiWriteReg(INT8U addr, INT8U value)
//输入:地址和配置字
//输出:无
//功能描述:SPI写寄存器 请参考CC1101的中文数据手册P19
//*****************************************************************************************
void halSpiWriteReg(uchar addr, uchar value)
{
CSN = 0; //拉低CSn开始写入
while (MISO);
SpiTxRxByte(addr); //写地址
SpiTxRxByte(value); //写入配置
CSN = 1; //拉高CSn结束写入
}
//*****************************************************************************************
//函数名:void halSpiWriteBurstReg(INT8U addr, INT8U *buffer, INT8U count)
//输入:地址,写入缓冲区,写入个数
//输出:无
//功能描述:SPI连续写配置寄存器
//*****************************************************************************************
void halSpiWriteBurstReg(uchar addr, uchar *buffer, uchar count)
{
uchar i, temp;
temp = addr | WRITE_BURST; //连续写入
CSN = 0; //拉低CSn开始连续写入
while (MISO);
SpiTxRxByte(temp);
for (i = 0; i < count; i++) //写入count个
{
SpiTxRxByte(buffer[i]);
}
CSN = 1; //拉高CSn结�