📄 cc1100.c
字号:
//功能描述: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 + -