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

📄 cc1100.c

📁 cc1100通讯源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
//功能描述:SPI连续写配置寄存器
//*****************************************************************************
void halSpiWriteBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count) 
{
	unsigned char i, temp;
	temp = addr | WRITE_BURST;
	EA = 0;	
	CS_CC1100 = 0;
	while (GDO2);
	SpiReadWrite(temp);
	for (i = 0; i < count; i++)
	{
		SpiReadWrite(buffer[i]);
	}
	CS_CC1100 = 1;
	EA = 1;	
}

//*****************************************************************************
//函数名:void halSpiStrobe(unsigned char strobe)
//功能描述:SPI写命令
//*****************************************************************************
void halSpiStrobe(unsigned char strobe) 
{
	EA = 0;	
	CS_CC1100 = 0;
	while (GDO2);
	SpiReadWrite(strobe);		//写入命令
	CS_CC1100 = 1;
	EA = 1;	
}




//*****************************************************************************
//函数名:unsigned char halSpiReadReg(unsigned char addr)
//功能描述:SPI读寄存器
//*****************************************************************************
unsigned char halSpiReadReg(unsigned char addr) 
{
	unsigned char temp, value;
	temp = addr|READ_SINGLE;//读寄存器命令
	EA = 0;	
	CS_CC1100 = 0;
	while (GDO2);
	SpiReadWrite(temp);
	value = SpiReadWrite(0);
	CS_CC1100 = 1;
	EA = 1;	
	return value;
}


//*****************************************************************************
//函数名:void halSpiReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count)
//功能描述:SPI连续写配置寄存器
//*****************************************************************************
void halSpiReadBurstReg(unsigned char addr, unsigned char *buffer, unsigned char count) 
{
	unsigned char i,temp;
	temp = addr | READ_BURST;	//写入要读的配置寄存器地址和读命令
	EA = 0;		//关闭总中断,防止扫数码管时产生错误
	CS_CC1100 = 0;
	while (GDO2);			
	SpiReadWrite(temp);   
	for (i = 0; i < count; i++) 
	{
		buffer[i] = SpiReadWrite(0);
	}
	CS_CC1100 = 1;
	EA = 1;	
}


//*****************************************************************************
//函数名:unsigned char halSpiReadStatus(unsigned char addr) 
//功能描述:SPI读状态寄存器
//*****************************************************************************
unsigned char halSpiReadStatus(unsigned char addr) 
{
	unsigned char value,temp;
	temp = addr | READ_BURST;//写入要读的状态寄存器的地址同时写入读命令
	EA = 0;				//关闭总中断,防止扫数码管时产生错误
	CS_CC1100 = 0;
	while (GDO2);
	SpiReadWrite(temp);
	value = SpiReadWrite(0);
	CS_CC1100 = 1;
	return value;
	EA = 1;
}



//*****************************************************************************
//函数名:void halRfWriteRfSettings(RF_SETTINGS *pRfSettings)
//功能描述:配置CC1100的寄存器
//*****************************************************************************
void halRfWriteRfSettings(void) 
{
	halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL2);
	halSpiWriteReg(CCxxx0_FSCTRL1,  rfSettings.FSCTRL1);
	halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL0);
	halSpiWriteReg(CCxxx0_FREQ2,    rfSettings.FREQ2);
	halSpiWriteReg(CCxxx0_FREQ1,    rfSettings.FREQ1);
	halSpiWriteReg(CCxxx0_FREQ0,    rfSettings.FREQ0);
	halSpiWriteReg(CCxxx0_MDMCFG4,  rfSettings.MDMCFG4);
	halSpiWriteReg(CCxxx0_MDMCFG3,  rfSettings.MDMCFG3);
	halSpiWriteReg(CCxxx0_MDMCFG2,  rfSettings.MDMCFG2);
	halSpiWriteReg(CCxxx0_MDMCFG1,  rfSettings.MDMCFG1);
	halSpiWriteReg(CCxxx0_MDMCFG0,  rfSettings.MDMCFG0);
	halSpiWriteReg(CCxxx0_CHANNR,   rfSettings.CHANNR);
	halSpiWriteReg(CCxxx0_DEVIATN,  rfSettings.DEVIATN);
	halSpiWriteReg(CCxxx0_FREND1,   rfSettings.FREND1);
	halSpiWriteReg(CCxxx0_FREND0,   rfSettings.FREND0);
	halSpiWriteReg(CCxxx0_MCSM0 ,   rfSettings.MCSM0 );
	halSpiWriteReg(CCxxx0_FOCCFG,   rfSettings.FOCCFG);
	halSpiWriteReg(CCxxx0_BSCFG,    rfSettings.BSCFG);
	halSpiWriteReg(CCxxx0_AGCCTRL2, rfSettings.AGCCTRL2);
	halSpiWriteReg(CCxxx0_AGCCTRL1, rfSettings.AGCCTRL1);
	halSpiWriteReg(CCxxx0_AGCCTRL0, rfSettings.AGCCTRL0);
	halSpiWriteReg(CCxxx0_FSCAL3,   rfSettings.FSCAL3);
	halSpiWriteReg(CCxxx0_FSCAL2,   rfSettings.FSCAL2);
	halSpiWriteReg(CCxxx0_FSCAL1,   rfSettings.FSCAL1);
	halSpiWriteReg(CCxxx0_FSCAL0,   rfSettings.FSCAL0);
	halSpiWriteReg(CCxxx0_FSTEST,   rfSettings.FSTEST);
	halSpiWriteReg(CCxxx0_TEST2,    rfSettings.TEST2);
	halSpiWriteReg(CCxxx0_TEST1,    rfSettings.TEST1);
	halSpiWriteReg(CCxxx0_TEST0,    rfSettings.TEST0);
	halSpiWriteReg(CCxxx0_IOCFG2,   rfSettings.IOCFG2);
	halSpiWriteReg(CCxxx0_IOCFG0,   rfSettings.IOCFG0);    
	halSpiWriteReg(CCxxx0_PKTCTRL1, rfSettings.PKTCTRL1);
	halSpiWriteReg(CCxxx0_PKTCTRL0, rfSettings.PKTCTRL0);
	halSpiWriteReg(CCxxx0_ADDR,     rfSettings.ADDR);
	halSpiWriteReg(CCxxx0_PKTLEN,   rfSettings.PKTLEN);
	halSpiWriteReg(CCxxx0_FSCTRL1,  rfSettings.FSCTRL1);
	halSpiWriteReg(CCxxx0_FSCTRL0,  rfSettings.FSCTRL0);
	halSpiWriteReg(CCxxx0_FREQ2,    rfSettings.FREQ2);
	halSpiWriteReg(CCxxx0_FREQ1,    rfSettings.FREQ1);
	halSpiWriteReg(CCxxx0_FREQ0,    rfSettings.FREQ0);
}
//*****************************************************************************
//函数名:void Init_CC1100(void)
//功能描述:初始化CC1100。
//*****************************************************************************
void Init_CC1100(void)
{
	POWER_UP_RESET_CC1100();
	halRfWriteRfSettings();
	halSpiWriteBurstReg(CCxxx0_PATABLE, PaTabel, 8);
}


//*****************************************************************************
//函数名:void halRfSendPacket(unsigned char *txBuffer, unsigned char size)
//功能描述:CC1100发送一组数据
//*****************************************************************************

void halRfSendPacket(unsigned char *txBuffer,unsigned char size) 
{
    halSpiWriteReg(CCxxx0_TXFIFO, size);
    halSpiWriteBurstReg(CCxxx0_TXFIFO, txBuffer, size); //写入要发送的数据
    halSpiStrobe(CCxxx0_STX);                           //进入发送模式发送数据
	
    // Wait for GDO2 to be set -> sync transmitted
    ResetTimer(0);
    while (!GDO2)
    {
        if (ReadTimer(0) > 10)   //防由CC1100硬件问题导致发送失败后硬件锁死 
        {
            halSpiStrobe(CCxxx0_SIDLE);
            break;
        }
    }
    // Wait for GDO2 to be cleared -> end of packet
    ResetTimer(0);
    while (GDO2)
    {
        if (ReadTimer(0) > 10)//防由CC1100硬件问题导致发送失败后硬件锁死 
        {
            halSpiStrobe(CCxxx0_SIDLE);
            break;
        }
    }
    halSpiStrobe(CCxxx0_SFTX);
}

//*****************************************************************************
//函数名:unsigned char halRfReceivePacket(unsigned char *rxBuffer, unsigned char length)
//功能描述:CC1100接收一组数据,并放入缓冲区 
//*****************************************************************************
unsigned char halRfReceivePacket(unsigned char *rxBuffer, unsigned char length) 
{
    unsigned char status[2];
    unsigned char packetLength = 0;
	
    halSpiStrobe(CCxxx0_SRX);                           //进入接收状态
    ResetTimer(2);
    while (!GDO2)
    {
        if (ReadTimer(2) > 10)                          //防由CC1100硬件问题导致接收失败后硬件锁死
        {
            halSpiStrobe(CCxxx0_SIDLE);
            return 0;
        }
    }
    ResetTimer(2);
    while (GDO2)
    {
        if (ReadTimer(2) > 10)                          //防由CC1100硬件问题导致接收失败后硬件锁死
        {
            halSpiStrobe(CCxxx0_SIDLE);
            return 0;
        }
    }
	
    if ((halSpiReadStatus(CCxxx0_RXBYTES) & BYTES_IN_RXFIFO))
    {                                                   //如果接的字节数不为0
        packetLength = halSpiReadReg(CCxxx0_RXFIFO);    //读出第一个字节,此字节为该帧数据长度
        if (packetLength == length)                     //如果所要的有效数据长度小于等于接收到的数据包的长度
        {
            halSpiReadBurstReg(CCxxx0_RXFIFO, rxBuffer, packetLength);
                                                        //读出所有接收到的数据
            halSpiReadBurstReg(CCxxx0_RXFIFO, status, 2);//读出CRC校验位
	
            if (status[1] & CRC_OK)                     //如果校验成功返回接收成功
            {  
                halSpiStrobe(CCxxx0_SFRX);              //接收之后刷新缓冲区 
                return 1;
            }
            else
            {
                halSpiStrobe(CCxxx0_SFRX);
                return 0;
            }  
        }
        else 
        {
            halSpiStrobe(CCxxx0_SFRX);                  //清洗接收缓冲区
            return 0;
        }
    } 
    else
    {
        halSpiStrobe(CCxxx0_SFRX);
        return 0;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -