📄 cc1100.c
字号:
// Pointer to a byte array which stores the values read from a
// corresponding range of CC1100 registers.
// BYTE count
// Number of bytes to be written to the subsequent CC1100 registers.
//-------------------------------------------------------------------------------------------------------
void halSpiReadBurstReg(BYTE addr, BYTE *buffer, BYTE count) {
unsigned char j,i,value;
IO0CLR = SCLK;
IO0CLR = CC1100_CS; //SPI通信开始
addr|=READ_BURST;
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(j=0;j<count;j++) {
for(i=0;i<8;i++) {
value <<=1;
IO0SET = SCLK;
if(IO0PIN&SO) value |= 0x01;
else value &= 0xFE;
IO0CLR = SCLK;
}
buffer[j] = value;
}
IO0SET = CC1100_CS; //SPI通信开始
}// halSpiReadBurstReg
/****************************************************************************************/
void halSpiWriteBurstReg(BYTE addr,BYTE *buffer,BYTE count)
{
unsigned char i,j,value;
IO0CLR = SCLK;
IO0CLR = CC1100_CS; //片选有效 //SPI通信开始
addr = addr|WRITE_BURST;
for(i=0;i<8;i++) {
if(addr&0x80) IO0SET = SI;
else IO0CLR = SI;
IO0SET = SCLK;
addr <<=1;
//DelayNS(5);
IO0CLR = SCLK;
}
IO0CLR = SI;
for(j=0;j<count;j++) {
value=buffer[j];
for(i=0;i<8;i++) {
if(value&0x80) IO0SET = SI;
else IO0CLR = SI;
IO0SET = SCLK;
value <<=1;
//DelayNS(5);
IO0CLR = SCLK;
}
IO0CLR = SI;
//DelayNS(10);
}
IO0SET = CC1100_CS; //SPI通信开始
}
/***************************************************************************************/
void POWER_UP_RESET_CC1100() //见数据手册,手工复位
{
unsigned char i,strobe;
// IO0SET = SCLK;
// IO0CLR = SI;
IO0SET = CC1100_CS; //片选写高
for(i=0;i<10;i++); // In 8MHz 6uS
IO0CLR = CC1100_CS;
for(i=0;i<10;i++); // In 8MHz 6uS
IO0SET = CC1100_CS;
for(i=0;i<100;i++); // In 8MHz 6uS
IO0CLR = CC1100_CS;
//for(i=0;i<100;i++); // In 8MHz 6uS
while(IO0PIN&SO); //等待SO为低
strobe=CC1100_SRES; //#define CC1100_SRES 0x30 // Reset chip.
for(i=0;i<8;i++) { //发布在SI线
if(strobe&0x80) IO0SET = SI;
else IO0CLR = SI;
IO0SET = SCLK;
strobe <<=1;
//DelayNS(30);
IO0CLR = SCLK;
}
while(IO0PIN&SO); //等待SO为低,复位完成
IO0SET = CC1100_CS; //SPI通信开始
}
/********************************************************************************************/
void halRfWriteRfSettings1() { //配置寄存器函数
// Write register settings
halSpiWriteReg(CC1100_FSCTRL1, rfSettings1.FSCTRL1);
halSpiWriteReg(CC1100_FSCTRL0, rfSettings1.FSCTRL0);
halSpiWriteReg(CC1100_FREQ2, rfSettings1.FREQ2);
halSpiWriteReg(CC1100_FREQ1, rfSettings1.FREQ1);
halSpiWriteReg(CC1100_FREQ0, rfSettings1.FREQ0);
halSpiWriteReg(CC1100_MDMCFG4, rfSettings1.MDMCFG4);
halSpiWriteReg(CC1100_MDMCFG3, rfSettings1.MDMCFG3);
halSpiWriteReg(CC1100_MDMCFG2, rfSettings1.MDMCFG2);
halSpiWriteReg(CC1100_MDMCFG1, rfSettings1.MDMCFG1);
halSpiWriteReg(CC1100_MDMCFG0, rfSettings1.MDMCFG0);
halSpiWriteReg(CC1100_CHANNR, rfSettings1.CHANNR);
halSpiWriteReg(CC1100_DEVIATN, rfSettings1.DEVIATN);
halSpiWriteReg(CC1100_FREND1, rfSettings1.FREND1);
halSpiWriteReg(CC1100_FREND0, rfSettings1.FREND0);
halSpiWriteReg(CC1100_MCSM0 , rfSettings1.MCSM0 );
halSpiWriteReg(CC1100_FOCCFG, rfSettings1.FOCCFG);
halSpiWriteReg(CC1100_BSCFG, rfSettings1.BSCFG);
halSpiWriteReg(CC1100_AGCCTRL2, rfSettings1.AGCCTRL2);
halSpiWriteReg(CC1100_AGCCTRL0, rfSettings1.AGCCTRL0);
halSpiWriteReg(CC1100_FSCAL3, rfSettings1.FSCAL3);
halSpiWriteReg(CC1100_FSCAL2, rfSettings1.FSCAL2);
halSpiWriteReg(CC1100_FSCAL0, rfSettings1.FSCAL0);
halSpiWriteReg(CC1100_FSTEST, rfSettings1.FSTEST);
halSpiWriteReg(CC1100_TEST2, rfSettings1.TEST2);
halSpiWriteReg(CC1100_TEST1, rfSettings1.TEST1);
halSpiWriteReg(CC1100_TEST0, rfSettings1.TEST0);
halSpiWriteReg(CC1100_IOCFG2, rfSettings1.IOCFG2);
halSpiWriteReg(CC1100_IOCFG0, rfSettings1.IOCFG0);
halSpiWriteReg(CC1100_PKTCTRL1, rfSettings1.PKTCTRL1);
halSpiWriteReg(CC1100_PKTCTRL0, rfSettings1.PKTCTRL0);
halSpiWriteReg(CC1100_ADDR, rfSettings1._ADDR);
halSpiWriteReg(CC1100_PKTLEN, rfSettings1.PKTLEN);
//add
}// halRfWriteRfSettings
/*************************************************************************/
void InitCC1100() //CC1100的初始化函数
{
POWER_UP_RESET_CC1100(); //manual reset
halRfWriteRfSettings1(); //配置寄存器
halSpiWriteBurstReg(CC1100_PATABLE, paTable, sizeof(paTable)); //写CC1100的功率寄存器
DelayNS(50); //延时 确保完成
}
/*******************************************************/
//-------------------------------------------------------------------------------------------------------
// BATE halRfReceivePacket(BYTE *rxBuffer, UINT8 *length)
// RETURN VALUE:
// BOOL
// TRUE: CRC OK
// FALSE: CRC NOT OK
//-------------------------------------------------------------------------------------------------------
BYTE halRfReceivePacket(BYTE *rxBuffer, BYTE *length) { //接收无线数据
BYTE status;
BYTE packetLength;
halSpiStrobe(CC1100_SRX); //发布SRX命令,进入RX状态
while ( !(IO0PIN&GDO0) ); // Wait for GDO0 to be set -> sync received //GDO0配置寄存器IOCFG = 0x06;见P56页
while (IO0PIN&GDO0);// Wait for GDO2 to be cleared -> end of packet //
status = halSpiReadStatus(CC1100_PKTSTATUS); //读取状态
// Read pdata from RX FIFO and store them in rxBuffer
packetLength = halSpiReadReg(CC1100_RXFIFO); //由于配置为可变长度数据包,读RXFIFO第一位即为数据包长度
if (packetLength <= *length) { //长度是否合理
halSpiReadBurstReg(CC1100_RXFIFO, rxBuffer, packetLength); //读取RXFIFO(也是寄存器,存放无线接收和数据)
*length = packetLength;
// Flush RX FIFO
halSpiStrobe(CC1100_SFRX); //冲刷RXFIFO
return (status & CRC_OK); //如果CRC检查也正确,返回1
}
else {
*length = packetLength; //长度不合理
// Flush RX FIFO
halSpiStrobe(CC1100_SFRX);
return 0;
}
}// halRfReceivePacket
/***************************************************************************/
BYTE halRfSendPacket(BYTE *txBuffer,uint8 size) //发送无线数据
{
halSpiWriteReg(CC1100_TXFIFO,size);
halSpiWriteBurstReg(CC1100_TXFIFO,txBuffer,size); //先写数据到TXFIFO
halSpiStrobe(CC1100_STX); //发布STX命令,将TXFIFO的数据无线发送
//Wait for GDO0 to be set -> sync transmitted
while( !(GDO0&IO0PIN) );
//Wait for GDO0 to be cleared -> end of packet
while( GDO0&IO0PIN );
halSpiStrobe(CC1100_SFTX);
}
/****************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -