📄 cc1100_tx_rx.c
字号:
#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 + -