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

📄 cc1100.c

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