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

📄 cc1100_tx_rx.c

📁 C8051F310的CC1100模块收发程序
💻 C
📖 第 1 页 / 共 2 页
字号:

#include <c8051f310.h>
#include <intrins.h>
#include "CC1100.h"
// ==================================================================================
// 常数定义
// 如果通讯故障,适当降低通讯速率
// ==================================================================================
#define		SYSCLK		 (24500000/8)						// 系统时钟
#define		UART_BAUD 	4800								// UART波特率
#define		SPI_SCK		100000								// SPI时钟速率

sfr16		TMR2RL	= 0xCA;									// 定时器2重装载寄存器
sfr16		TMR2	= 0xCC;									// 定时器2计数寄存器
sfr16		TMR3RL	= 0x92;									// 定时器3重装载寄存器
sfr16		TMR3	= 0x94;									// 定时器3计数寄存器

#define		INT8U				unsigned char
#define		INT16U				unsigned int

#define 	time0h 			(65535-1000)/256
#define 	time0l 			(65535-1000)%256			//定时1MS
#define 	WRITE_BURST     	0x40						//连续写入
#define 	READ_SINGLE     	0x80						//读
#define 	READ_BURST      	0xC0						//连续读
#define 	BYTES_IN_RXFIFO     0x7F  						//接收缓冲区的有效字节数
#define 	CRC_OK              0x80 						//CRC校验通过位标志

//------------------------------------------------------------------------------------------------------
// CC2500/CC1100 STROBE, CONTROL AND STATUS REGSITER
#define CCxxx0_IOCFG2       0x00        // GDO2 output pin configuration
#define CCxxx0_IOCFG1       0x01        // GDO1 output pin configuration
#define CCxxx0_IOCFG0       0x02        // GDO0 output pin configuration
#define CCxxx0_FIFOTHR      0x03        // RX FIFO and TX FIFO thresholds
#define CCxxx0_SYNC1        0x04        // Sync word, high INT8U
#define CCxxx0_SYNC0        0x05        // Sync word, low INT8U
#define CCxxx0_PKTLEN       0x06        // Packet length
#define CCxxx0_PKTCTRL1     0x07        // Packet automation control
#define CCxxx0_PKTCTRL0     0x08        // Packet automation control
#define CCxxx0_ADDR         0x09        // Device address
#define CCxxx0_CHANNR       0x0A        // Channel number
#define CCxxx0_FSCTRL1      0x0B        // Frequency synthesizer control
#define CCxxx0_FSCTRL0      0x0C        // Frequency synthesizer control
#define CCxxx0_FREQ2        0x0D        // Frequency control word, high INT8U
#define CCxxx0_FREQ1        0x0E        // Frequency control word, middle INT8U
#define CCxxx0_FREQ0        0x0F        // Frequency control word, low INT8U
#define CCxxx0_MDMCFG4      0x10        // Modem configuration
#define CCxxx0_MDMCFG3      0x11        // Modem configuration
#define CCxxx0_MDMCFG2      0x12        // Modem configuration
#define CCxxx0_MDMCFG1      0x13        // Modem configuration
#define CCxxx0_MDMCFG0      0x14        // Modem configuration
#define CCxxx0_DEVIATN      0x15        // Modem deviation setting
#define CCxxx0_MCSM2        0x16        // Main Radio Control State Machine configuration
#define CCxxx0_MCSM1        0x17        // Main Radio Control State Machine configuration
#define CCxxx0_MCSM0        0x18        // Main Radio Control State Machine configuration
#define CCxxx0_FOCCFG       0x19        // Frequency Offset Compensation configuration
#define CCxxx0_BSCFG        0x1A        // Bit Synchronization configuration
#define CCxxx0_AGCCTRL2     0x1B        // AGC control
#define CCxxx0_AGCCTRL1     0x1C        // AGC control
#define CCxxx0_AGCCTRL0     0x1D        // AGC control
#define CCxxx0_WOREVT1      0x1E        // High INT8U Event 0 timeout
#define CCxxx0_WOREVT0      0x1F        // Low INT8U Event 0 timeout
#define CCxxx0_WORCTRL      0x20        // Wake On Radio control
#define CCxxx0_FREND1       0x21        // Front end RX configuration
#define CCxxx0_FREND0       0x22        // Front end TX configuration
#define CCxxx0_FSCAL3       0x23        // Frequency synthesizer calibration
#define CCxxx0_FSCAL2       0x24        // Frequency synthesizer calibration
#define CCxxx0_FSCAL1       0x25        // Frequency synthesizer calibration
#define CCxxx0_FSCAL0       0x26        // Frequency synthesizer calibration
#define CCxxx0_RCCTRL1      0x27        // RC oscillator configuration
#define CCxxx0_RCCTRL0      0x28        // RC oscillator configuration
#define CCxxx0_FSTEST       0x29        // Frequency synthesizer calibration control
#define CCxxx0_PTEST        0x2A        // Production test
#define CCxxx0_AGCTEST      0x2B        // AGC test
#define CCxxx0_TEST2        0x2C        // Various test settings
#define CCxxx0_TEST1        0x2D        // Various test settings
#define CCxxx0_TEST0        0x2E        // Various test settings

// Strobe commands
#define CCxxx0_SRES         0x30        // Reset chip.
#define CCxxx0_SFSTXON      0x31        // Enable and calibrate frequency synthesizer (if MCSM0.FS_AUTOCAL=1).
                                        // If in RX/TX: Go to a wait state where only the synthesizer is
                                        // running (for quick RX / TX turnaround).
#define CCxxx0_SXOFF        0x32        // Turn off crystal oscillator.
#define CCxxx0_SCAL         0x33        // Calibrate frequency synthesizer and turn it off
                                        // (enables quick start).
#define CCxxx0_SRX          0x34        // Enable RX. Perform calibration first if coming from IDLE and
                                        // MCSM0.FS_AUTOCAL=1.
#define CCxxx0_STX          0x35        // In IDLE state: Enable TX. Perform calibration first if
                                        // MCSM0.FS_AUTOCAL=1. If in RX state and CCA is enabled:
                                        // Only go to TX if channel is clear.
#define CCxxx0_SIDLE        0x36        // Exit RX / TX, turn off frequency synthesizer and exit
                                        // Wake-On-Radio mode if applicable.
#define CCxxx0_SAFC         0x37        // Perform AFC adjustment of the frequency synthesizer
#define CCxxx0_SWOR         0x38        // Start automatic RX polling sequence (Wake-on-Radio)
#define CCxxx0_SPWD         0x39        // Enter power down mode when CSn goes high.
#define CCxxx0_SFRX         0x3A        // Flush the RX FIFO buffer.
#define CCxxx0_SFTX         0x3B        // Flush the TX FIFO buffer.
#define CCxxx0_SWORRST      0x3C        // Reset real time clock.
#define CCxxx0_SNOP         0x3D        // No operation. May be used to pad strobe commands to two
                                        // INT8Us for simpler software.

#define CCxxx0_PARTNUM      0x30
#define CCxxx0_VERSION      0x31
#define CCxxx0_FREQEST      0x32
#define CCxxx0_LQI          0x33
#define CCxxx0_RSSI         0x34
#define CCxxx0_MARCSTATE    0x35
#define CCxxx0_WORTIME1     0x36
#define CCxxx0_WORTIME0     0x37
#define CCxxx0_PKTSTATUS    0x38
#define CCxxx0_VCO_VC_DAC   0x39
#define CCxxx0_TXBYTES      0x3A
#define CCxxx0_RXBYTES      0x3B

#define CCxxx0_PATABLE      0x3E
#define CCxxx0_TXFIFO       0x3F
#define CCxxx0_RXFIFO       0x3F

//全局变量定义
/****************************************************************************************/
INT16U TimeOutCount[2]={0,0};							//超时计数器
INT8U PaTabel[8] = {0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0 ,0xC0};

/////////////////////LSD_RFC1100C4//////////////////////////
// ==================================================================================
// 单片机引脚定义
// ==================================================================================
//SPI
//P0.2       P0.3    P0.4       P0.5             
//SCK/TX0  MISO/RX0  MOSI     NSS (CSN) 
sbit	CSN	=P0^5;//CSN
sbit	MOSI=P0^4;//MOSI
sbit	MISO=P0^3;//MISO
sbit	SCK	=P0^2;//SCK
sbit	GDO0	=	P2^0;//GDO0
sbit	GDO2	=	P2^1;//GDO2

unsigned char TX_Buffer[10]=0;
/********************************************/
/********************************************/
// 根据实际设计修改单片机引脚定义
/********************************************/
/********************************************/
void Port_IO_Init()
{
    // P0.0  -  Skipped,     Open-Drain, Digital
    // P0.1  -  Skipped,     Open-Drain, Digital
    // P0.2  -  SCK  (SPI0), Open-Drain, Digital
    // P0.3  -  MISO (SPI0), Open-Drain, Digital
    // P0.4  -  MOSI (SPI0), Open-Drain, Digital
    // P0.5  -  NSS  (SPI0), Open-Drain, Digital
	P0SKIP    = 0x03;
	XBR0		= 0x02;											// 允许 SPI,
	XBR1		= 0x40;										// 弱上拉,交叉开关使能
	P0MDOUT		= 0X14;// SCK, MOSI,为推挽输出 0x55;			 
}

void Delayms(unsigned char n);
// ==================================================================================
// 振荡器初始化
// ==================================================================================
void Oscillator_Init()
{
	OSCICN		= 0x80;										// SYSCLK=24500000/8
}
void halWait(INT16U timeout) {
    do {
        _nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_();
		_nop_(); 
    } while (--timeout);
}

// ==================================================================================
// 看门狗刷新
// ==================================================================================
void WDTRefresh()
{ 	
  PCA0CPL4	= 0x62;										// 看门狗时间:99.3ms
	PCA0CPH4	= 0x62;										// 看门狗时间:99.3ms
}

// ==================================================================================
// 看门狗初始化
// ==================================================================================
void PCA_Init()
{
	PCA0MD		|= 0x40;									// 看门狗允许
	PCA0MD		&= 0xF1;									// 看门狗时钟使用SYSCLK/12
	PCA0CPL4	= 0x62;										// 看门狗时间:99.3ms
	PCA0CPH4	= 0x62;
}

// ==================================================================================
// 定时器初始化
// SYSCLK = 24.5MHz / 8
// T0:                 ;
// T1:  UART波特率发生器
// T2:  s定时器;
// T3: 
// ==================================================================================
void Timer_Init()
{
 	TMOD		 = 0x20;										// 定时器1: 8位自装载定时器
    CKCON		 = 0x05;										// 定时器1时钟使用SYSCLK,
 	TMR2CN  = 0x00;
    TMR2RL	 = -(63802);				// 63802    0.25s    -(SYSCLK / 12 * 1 / 1000)重装载寄存器
 	TMR2		= -(63802);		// 定时器2:16位自装载定时器,时钟使用SYSCLK/12;允许运行
	TR1			= 0;										// T1运行
}


// ==================================================================================
// SPI初始化
// ==================================================================================
void SPI_Init()
{
	SPI0CFG		= 0x40;										// 工作在主方式
															// 在SCK周期的第一个边沿采样数据
															// SCK空闲时处于低电平
	SPI0CKR		= SYSCLK / 2 / SPI_SCK - 1;					// SPI时钟频率寄存器
	SPI0CN		=0x01;// 0x05;										//三线单主站工作方式;SPI允许
}

// ==================================================================================
// 中断系统初始化
// ==================================================================================
void Interrupts_Init()
{  
	IE        = 0x00;				
	EA		= 1;										// 中断允许
}
//================================================================================
//延时程序延时时间为n*10us 
//f=24.5MHz/8
//================================================================================
void Delay10us (unsigned int times)
 {
 	unsigned int  TEM=0;  
	for(TEM=0;TEM<times;TEM++)
	  {
	  	_nop_();
	  	_nop_();
	  	_nop_();
	  	 WDTRefresh(); 
	    
	  }
 }

// ==================================================================================
// 定时器2中断服务程序
// ==================================================================================
void Timer2_ISR() interrupt 5 using 1
 {
 TMR2CN	&= ~0xC0;										// 清除T2中断标志
 }
 
// ==================================================================================
// UART中断服务程序
// ==================================================================================
void UART0_ISR () interrupt 4 using 1
{ 
	
 RI0 = 0;											// 清除接收中断标志
}
// ==================================================================================
// 硬件初始化
// ==================================================================================
void Device_Init()
{
	Oscillator_Init ();										// 振荡器初始化
	PCA_Init ();											// 看门狗设置
	Port_IO_Init ();										// 端口设置
	Timer_Init ();											// 定时器设置
	SPI_Init ();											// SPI设置
 	Interrupts_Init ();										// 中断设置
}

// ==================================================================================
// 数据初始化
// ==================================================================================
void Data_Init()
{

  XBR1		= 0x40;										// 弱上拉,交叉开关使能
	P0MDOUT	= 0X14;// SCK, MOSI,为推挽输出 0x55;			
  P2MDOUT = 0xFF;

	CSN=0;
	SCK=0;
	CSN=1;

}


//*****************************************************************************************
//函数名:INT16U ReadTimer(INT8U n)
//输入:要读的计时器
//输出:读出值
//功能描述:读计时器
//*****************************************************************************************
INT16U ReadTimer(INT8U n)
{
	INT16U tmp;
	ET0 = 0;                                    // Disable Timer0 interrupt
	tmp = timer[n];                             // Clear timer[n]
	ET0 = 1;                                    // Enable Timer0 interrupt
	return tmp;
}

/*****************************************************************************************
//函数名:SendCh(ch)
//输入:无
//输出:无
//功能描述:串口发送一个字符
/*****************************************************************************************/
void SendCh(INT8U ch)
{
	SBUF = ch;
	while(!TI);
	TI = 0;
}

/*****************************************************************************************

⌨️ 快捷键说明

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