⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cc1100.c

📁 IO模拟SPI实验.rar
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************/
#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 + -