📄 cc1100.c
字号:
/****************************************************************/
#include "config.h"
#include "CC1100.h"
#define SCLK (1 << 17) //P0.17 作模拟SCLK
#define SI (1 << 18) //P0.18 作模拟SCLK
#define SO (1 << 19) //P0.19 作模拟SCLK
//#define CC1100_CS (1 << 20) // P0.20为CC1100的片选CS
//#define GDO0 (1 << 2) //P0.2 作CC1100的GDO0输出脚
//头字节第一位为W/R位,第二位为burst位,后六位为地址位。
#define WRITE_BURST 0x40 //W/R位为0,burst位为1,写多个寄存器
#define READ_SINGLE 0x80 //W/R位为1,burst位为0,读一个寄存器
#define READ_BURST 0xC0 //W/R位为1,burst位为1,读多个寄存器
//W/R位为0,burst位为了0,读一个寄存器
//地址范围:0x00~0x3F
//此为要写入CC1100的功率表
BYTE paTable[] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};
//S_RF_SETTINGS 为CC1100.h中定义的一个结构体
//里面的值为将写入到CC1100各寄存器的值
const RF_SETTINGS rfSettings1 =
{
0x0A, // FSCTRL1 Frequency synthesizer control.
0x00, // FSCTRL0 Frequency synthesizer control.
0x10, // FREQ2 Frequency control word, high byte.
0xB1, // FREQ1 Frequency control word, middle byte.
0x3b, // FREQ0 Frequency control word, low byte.
0x86, //0x2D, // MDMCFG4 Modem configuration.
0x83, //0x3B, // MDMCFG3 Modem configuration.
0x03, // MDMCFG2 Modem configuration.
0x22, // MDMCFG1 Modem configuration.
0xF8, // MDMCFG0 Modem configuration.
0x00, // CHANNR Channel number.
0x44, // DEVIATN Modem deviation setting (when FSK modulation is enabled).
0x56, // FREND1 Front end RX configuration.
0x10, // FREND0 Front end RX configuration.
0x18, // MCSM0 Main Radio Control State Machine configuration.
0x16, // FOCCFG Frequency Offset Compensation Configuration.
0x6C, // BSCFG Bit synchronization Configuration.
0x03, // AGCCTRL2 AGC control.
0x91, // AGCCTRL0 AGC control.
0xA9, // FSCAL3 Frequency ` calibration.
0x0a, // FSCAL2 Frequency synthesizer calibration.
0x11, // FSCAL0 Frequency synthesizer calibration.
0x59, // FSTEST Frequency synthesizer calibration.
0x88, // TEST2 Various test settings.
0x31, // TEST1 Various test settings.
0x0B, // TEST0 Various test settings.
0x24,// // IOCFG2 GDO2 output pin configuration.
0x06,// // IOCFG0D GDO0 output pin configuration. Refer to SmartRF?Studio User Manual for detailed pseudo register explanantion.
0x04, // PKTCTRL1 Packet automation control.
0x05, // PKTCTRL0 Packet automation control.
0x00, // ADDR Device address.
0x20, // PKTLEN
};
/********************此文件包函的在关cc1101的函数*********声明部分***********************************/
BYTE halSpiReadReg(BYTE addr);
void halSpiWriteReg(BYTE addr, BYTE value);
void halSpiStrobe(BYTE strobe);
BYTE halSpiReadStatus(BYTE addr);
void halSpiReadBurstReg(BYTE addr, BYTE *buffer, BYTE count);
void halSpiWriteBurstReg(BYTE addr,BYTE *buffer,BYTE count);
void POWER_UP_RESET_CC1100();
void halRfWriteRfSettings1();
void InitCC1100();
BYTE halRfReceivePacket(BYTE *rxBuffer, BYTE *length);
BYTE halRfSendPacket(BYTE *txBuffer,uint8 size);
/**************************定义部分****************************************************************************
** 函数名称:halSpiReadReg()
** 函数功能:读一个寄存器函数
**********************************************************************************************************/
BYTE halSpiReadReg(BYTE addr)
{
unsigned char i,value,j;
IO0CLR = SCLK; //先将时钟线置低
IO0CLR = CC1100_CS; //CS置0,使能CC1100的SPI口 ,//SPI通信开始
addr|=READ_SINGLE; //0x80,确保SI第一位W/R为1 ,读一个寄存器
for(i=0;i<8;i++) { //要写入CC1100地址的确8位数据依次传送,高位先传送
if(addr&0x80) IO0SET = SI; //写CC1100数据是通过发布在SI脚实现的
else IO0CLR = SI;
IO0SET = SCLK; //SI上的数据在SCLK上升沿被CC1100采集
addr <<=1; //左移一位
IO0CLR = SCLK; //清零SCLK脚,以便下一位数据在下一个上升沿被采集
}
IO0CLR = SI; //数据传送完成后,清零SI,避免可能的影响
//DelayNS(400);
value=0; //用value装读取的寄存器的值
for(i=0;i<8;i++) { //CC1100将地址为addr的寄存器的8位值依次传送到SO,高位先传送
value <<=1; //将上一次循环得到的数据左移保存 ,执行8次,有效左移7次,保存了8位数据
IO0SET = SCLK; //在SCLK上升沿,SO输出数据
if(IO0PIN& SO) value|= 0x01; //SO = 1,写1
else value &= 0xFE; //SO = 0,写0
IO0CLR = SCLK;
}
IO0SET = CC1100_CS; //SPI通信结束
return value; //返回value
}
/**********************************************************/
void halSpiWriteReg(BYTE addr, BYTE value) { //写一个寄存器函数
unsigned char i;
IO0CLR = SCLK; //先置零SCLK
IO0CLR = CC1100_CS; //片选有效,SPI通信开始
addr &= 0x7F; //W/R = 0
for(i=0;i<8;i++) { //SI线发布地址数据
if(addr&0x80) IO0SET = SI;
else IO0CLR = SI;
IO0SET = SCLK;
addr <<=1;
IO0CLR = SCLK;
}
IO0CLR = SI;
for(i=0;i<8;i++) { //SI线发布要写入的值数据
if(value&0x80) IO0SET = SI;
else IO0CLR = SI;
IO0SET = SCLK;
value <<=1;
IO0CLR = SCLK;
}
IO0CLR = SI;
IO0SET = CC1100_CS; //SPI通信结束
}// halSpiWriteReg
/**************************************************************************************************/
void halSpiStrobe(BYTE strobe)
{
unsigned char i;
IO0CLR = CC1100_CS; //SPI通信开始
for(i=0;i<8;i++) {
if(strobe&0x80) IO0SET = SI;
else IO0CLR = SI;
IO0SET = SCLK;
strobe <<=1;
IO0CLR = SCLK;
}
IO0CLR = SI; //写SI = 0,避免可能的影响
IO0SET = CC1100_CS; //SPI通信结束
}// halSpiStrobe
//-------------------------------------------------------------------------------------------------------
// BYTE halSpiReadStatus(BYTE addr)
// DESCRIPTION:
// This function reads a CC1100 status register.
// ARGUMENTS:
// BYTE addr
// Address of the CC1100 status register to be accessed.
//
// RETURN VALUE:
// BYTE
// Value of the accessed CC1100 status register.
//功能:将addr发布到SI线上,将SO线上得到的数据以value返回,均为一个字节。
//-------------------------------------------------------------------------------------------------------//比上个函数就多了 asm("nop")和……;其余一样
BYTE halSpiReadStatus(BYTE addr) {
unsigned char i,value;
IO0CLR = SCLK;
IO0CLR = CC1100_CS;
addr |= READ_BURST; //0xC0,确保SI第一位W/R和第二位burst均为1。
/*注意此处:第二位不是单/多访问位,为1表访问status registers,为0表访问command strobes。具体请翻阅数据手册*/
for(i=0;i<8;i++) { //写要读状态寄存器的地址
if(addr&0x80) IO0SET = SI;
else IO0CLR = SI;
IO0SET = SCLK;
addr <<=1;
IO0CLR = SCLK;
}
IO0CLR = SI;
value=0;
for(i=0;i<8;i++) { //得到值
value <<=1;
IO0SET = SCLK;
if( IO0PIN&SO ) value |= 0x01;
else value &= 0xFE;
IO0CLR = SCLK;
}
IO0SET = CC1100_CS; //SPI通信结束
return value;
}
//-------------------------------------------------------------------------------------------------------
// void halSpiReadBurstReg(BYTE addr, BYTE *buffer, BYTE count)
//
// DESCRIPTION:
// This function reads multiple CC1100 register, using SPI burst access.
//
// ARGUMENTS:
// BYTE addr
// Address of the first CC1100 register to be accessed.
// BYTE *buffer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -