当前位置:文档之家› STC15W401AS和CC2500通信已OK---发送程序

STC15W401AS和CC2500通信已OK---发送程序

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

* 作者:KANG

* 本部分程序参考了网上的程序,感谢前辈们的分享
重新 写入自己的配置文件 重写 加入串口 CC2500 寄存器配置文件 写入 改了 SPI单字节读取函数


已确定了 接收状态OK了。。状态字节读取 OK了


对CC2500初始化后,使用test =?CC2500_ReadReg(IOCFG0);查看test的值,如果为0x06,说明SPI读写寄存器没有问题 已证明OK了



可以连续取 RX FIFO 了


可以连续写入数组中的数据了

终于可以发送数组中的数据了,,,好开心啊!!!!!!!!

真的可以发送数据,并正确接收 到了!!!!哈哈哈!!!!!OKOKOK

加入输出功率设置PaTabel[8] = {0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB}; // 设置输出功率为 0dBM
但发射电流还是Delay_MS(1000); 1.6MA,有些不对啊!!! Delay_MS(1) 10MA

再次改良。重新用SmartRF Studio 7 配置文件。以前是250KB/s 现在是2.4KB/s 传输距离可以做到100米以上。
还要再优化一下 读RXFIFO字节溢出时清空FIFO


* 日期:2015.9.3
* 功能:CC2500与STC15W401AS 之间的通信程序 将接收到的数据通过串口发回给电脑显示

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

#include

#include // STC15W401AS 头文件


sbit CC2500_SI = P1^0; //

sbit CC2500_SO = P1^1; //

sbit CC2500_SCLK = P1^2; //

sbit CC2500_CSN = P1^3; //

sbit CC2500_GDO0 = P1^4; //

sbit CC2500_GDO2 = P1^5; //

sbit LED = P3^2;

#define CC2500_SI_HIGH CC2500_SI = 1;
#define CC2500_SI_LOW CC2500_SI = 0;

#define CC2500_SO_HIGH CC2500_SO = 1;
#define CC2500_SO_LOW CC2500_SO = 0;

#define CC2500_SCLK_HIGH CC2500_SCLK = 1;
#define CC2500_SCLK_LOW CC2500_SCLK = 0;


#define CC2500_CSN_HIGH CC2500_CSN = 1;
#define CC2500_CSN_LOW CC2500_CSN = 0;


#define CC2500_GDO0_HIGH CC2500_GDO0 = 1;
#define CC2500_GDO0_LOW CC2500_GDO0 = 0;

#define CC2500_GDO2_HIGH CC2500_GDO2 = 1;
#define CC2500_GDO2_LOW CC2500_GDO2 = 0;


#define WRITE_SINGLE 0x00 //写入
#define WRITE_BURST 0x40 //连续写入
#define READ_SINGLE 0x80 //读取
#define READ_BURST 0xC0 //连续读取


#define CC2500_SRES 0x30 // 复位芯片
#define CC2500_SFSTXON 0x31 // 开启和校准频率合成器(若 MCSM0.FS_AUTOCAL=1)


#define CC2500_SXOFF 0x32 // 关闭晶体振荡器
#define CC2500_SCAL 0x33 // 校准频率合成器并关断(开启快速启动)

#define CC2500_SRX 0x34 // 读

取模式(启用 RX。(若上一状态为空闲且 MCSM0.FS_AUTOCAL=1 则 首先运行校准。)

#define CC2500_STX 0x35 // 发射模式(在空闲状态下就启用 TX。若 MCSM0.FS_AUTOCAL=1 首先运行校 准。若在 RX 状态且 CCA 启用:若信道为空则进入 TX )

#define CC2500_SIDLE 0x36 // 空闲模式(离开 RX/TX,关断频率合成器并离开电磁波激活模式若可用)

#define CC2500_SAFC 0x37 // 运行 23.1 节列出的频率合成器的 AFC 调节
#define CC2500_SWOR 0x38 // 运行 28.5 节描述的自动 RX 选举序列(电磁波激活)
#define CC2500_SPWD 0x39 // 当 CSn 为高时进入功率降低模式。
#define CC2500_SFRX 0x3A // 清除 RX FIFO 缓冲
#define CC2500_SFTX 0x3B // 清除 TX FIFO 缓冲
#define CC2500_SWORRST 0x3C // 重新设置真实时间时钟
#define CC2500_SNOP 0x3D // 无操作。可能用来为更简单的软件将滤波命令变为 2 字节。


#define CC2500_PATABLE 0x3E
#define CC2500_TXFIFO 0x3F // 0x3F
#define CC2500_RXFIFO 0x3F //


#define CCxxx0_TXBYTES 0x3A
#define CCxxx0_RXBYTES 0x3B

#define CC2500_ADDR 0x09 // Device address

unsigned char CC2500_TxAddr = 0x01; // 发送地址设置函数
unsigned char TxRxBuf[8] = {0}; // 要发送的数组 CC2500_DATA_LEN=32;but 61中是64;1+CC2500_DATA_LEN 是发送次数 发送的数组
unsigned char code PaTabel[8] = {0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB, 0xFB}; // 设置输出功率为 0dBM


/***************** 寄存器配置(地址) *****************************/



#define TI_CCxxx0_IOCFG2 0x00 // GDO2 output pin configuration
#define TI_CCxxx0_IOCFG1 0x01 // GDO1 output pin configuration
#define TI_CCxxx0_IOCFG0 0x02 // GDO0 output pin configuration
#define TI_CCxxx0_FIFOTHR 0x03 // RX FIFO and TX FIFO thresholds
#define TI_CCxxx0_SYNC1 0x04 // Sync word, high byte
#define TI_CCxxx0_SYNC0 0x05 // Sync word, low byte
#define TI_CCxxx0_PKTLEN 0x06 // Packet length
#define TI_CCxxx0_PKTCTRL1 0x07 // Packet automation control
#define TI_CCxxx0_PKTCTRL0 0x08 // Packet automation control
#define TI_CCxxx0_ADDR 0x09 // Device address
#define TI_CCxxx0_CHANNR 0x0A // Channel number
#define TI_CCxxx0_FSCTRL1 0x0B // Frequency synthesizer control
#define TI_CCxxx0_FSCTRL0 0x0C // Frequency synthesizer control
#define TI_CCxxx0_FREQ2 0x0D // Frequency control word, high byte
#define TI_CCxxx0_FREQ1 0x0E // Frequency control word, mi

ddle byte
#define TI_CCxxx0_FREQ0 0x0F // Frequency control word, low byte
#define TI_CCxxx0_MDMCFG4 0x10 // Modem configuration
#define TI_CCxxx0_MDMCFG3 0x11 // Modem configuration
#define TI_CCxxx0_MDMCFG2 0x12 // Modem configuration
#define TI_CCxxx0_MDMCFG1 0x13 // Modem configuration
#define TI_CCxxx0_MDMCFG0 0x14 // Modem configuration
#define TI_CCxxx0_DEVIATN 0x15 // Modem deviation setting
#define TI_CCxxx0_MCSM2 0x16 // Main Radio Cntrl State Machine config
#define TI_CCxxx0_MCSM1 0x17 // Main Radio Cntrl State Machine config
#define TI_CCxxx0_MCSM0 0x18 // Main Radio Cntrl State Machine config
#define TI_CCxxx0_FOCCFG 0x19 // Frequency Offset Compensation config
#define TI_CCxxx0_BSCFG 0x1A // Bit Synchronization configuration
#define TI_CCxxx0_AGCCTRL2 0x1B // AGC control
#define TI_CCxxx0_AGCCTRL1 0x1C // AGC control
#define TI_CCxxx0_AGCCTRL0 0x1D // AGC control
#define TI_CCxxx0_WOREVT1 0x1E // High byte Event 0 timeout
#define TI_CCxxx0_WOREVT0 0x1F // Low byte Event 0 timeout
#define TI_CCxxx0_WORCTRL 0x20 // Wake On Radio control
#define TI_CCxxx0_FREND1 0x21 // Front end RX configuration
#define TI_CCxxx0_FREND0 0x22 // Front end TX configuration
#define TI_CCxxx0_FSCAL3 0x23 // Frequency synthesizer calibration
#define TI_CCxxx0_FSCAL2 0x24 // Frequency synthesizer calibration
#define TI_CCxxx0_FSCAL1 0x25 // Frequency synthesizer calibration
#define TI_CCxxx0_FSCAL0 0x26 // Frequency synthesizer calibration
#define TI_CCxxx0_RCCTRL1 0x27 // RC oscillator configuration
#define TI_CCxxx0_RCCTRL0 0x28 // RC oscillator configuration
#define TI_CCxxx0_FSTEST 0x29 // Frequency synthesizer cal control
#define TI_CCxxx0_PTEST 0x2A // Production test
#define TI_CCxxx0_AGCTEST 0x2B // AGC test
#define TI_CCxxx0_TEST2 0x2C // Various test settings
#define TI_CCxxx0_TEST1 0x2D // Various test settings
#define TI_CCxxx0_TEST0 0x2E // Various test settings



/*****************串口程序开始*********************************/

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define FOSC 11059200L //系统频率
#define BAUD 115200 //串口波特率

#define NONE_PARITY 0 //无校验
#define ODD_PARITY 1 //奇校验
#define EVEN_PARITY 2 //偶校验
#define MARK_PARITY 3 //标记校验
#define SPACE_PARITY 4 //空白校验

#define PARITYBIT EVEN_PARITY //定义校验位

bit busy;

unsigned char My_Data; // 发送我的数据


/*----------------------------
初始化串口
---------------------

------*/

void UART_INIT(void) // 波特率 115200
{
ACC = P_SW1;

P_SW1 = ACC; //(P3.0/RxD, P3.1/TxD)



#if (PARITYBIT == NONE_PARITY)
SCON = 0x50; //8位可变波特率
#elif (PARITYBIT == ODD_PARITY) || (PARITYBIT == EVEN_PARITY) || (PARITYBIT == MARK_PARITY)
SCON = 0xda; //9位可变波特率,校验位初始为1
#elif (PARITYBIT == SPACE_PARITY)
SCON = 0xd2; //9位可变波特率,校验位初始为0
#endif

T2L = (65536 - (FOSC/4/BAUD)); //设置波特率重装值
T2H = (65536 - (FOSC/4/BAUD))>>8;
AUXR = 0x14; //T2为1T模式, 并启动定时器2
AUXR |= 0x01; //选择定时器2为串口1的波特率发生器
ES = 1; //使能串口1中断
EA = 1;
}


/*----------------------------
发送串口数据
----------------------------*/
void SendData(BYTE dat)
{
while (busy); //等待前面的数据发送完成
ACC = dat; //获取校验位P (PSW.0)
if (P) //根据P来设置校验位
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 0; //设置校验位为0
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 1; //设置校验位为1
#endif
}
else
{
#if (PARITYBIT == ODD_PARITY)
TB8 = 1; //设置校验位为1
#elif (PARITYBIT == EVEN_PARITY)
TB8 = 0; //设置校验位为0
#endif
}
busy = 1;
SBUF = ACC; //写数据到UART数据寄存器
}



/*********************串口程序结束**********************************/




/**************************延时1MS子程序***************************************/

void Delay_MS (unsigned int a)
{ // 延时1ms

unsigned int i;

while(--a!=0)
{
for(i=0;i<600;i++);
}
}




/********************************MCU初始化****************************************/


void MCU_init(void)
{
P1M1 = 0x32; // P1.4 P1.5 P1.1 为漏极 P1.0 P1.2 P1.3为推挽 以后改IO功能时,这个也要对应改
P1M0 = 0x3F;


}



/*********************************SPI初始化函数********************************/

void SPI_init(void)
{
CC2500_CSN_HIGH;
CC2500_SCLK_LOW;

}




/********************************SPI单字节写入函数**********CSN在别子函数中调用******************/

unsigned char SPI_Write(unsigned char txdata)
{
unsigned char i,value;

for (i = 0;i < 8;i++)
{
if (txdata & 0x80) //总是发送最高位 发送数据
{
CC2500_SI_HIGH; // SI为高
}

else
{
CC2500_SI_LOW; // SI为低
}

CC2500_SCLK_HIGH; // SCLK 先高,延时再拉低。。。输出时钟信号

_nop_();
_nop_();


txdata = txdata<<1;

// 右移一位

CC2500_SCLK_LOW; // SCLK 先高,延时再拉低。。。输出时钟信号

_nop_();
_nop_();

txdata |= CC2500_SO; //读MISO到 dat 最低位 ? ? ? capture current MISO bit************************************

}

return value;

}




/************************************CC2500写入命令函数,与SPI_Write子函数一起作用***************************************************/

void CC2500_Command(unsigned char cmd)
{
CC2500_CSN_LOW; // 先设置SCN 一起作用
while (CC2500_SO); // 等待SO脚 变低,说明芯片电压调制器已稳定
SPI_Write(cmd); //写入命令
CC2500_CSN_HIGH; // 先设置SCN 一起作用
}





/***********************************CC2500寄存器配置写入函数********************************************************/


void CC2500_WriteReg(unsigned char addr, unsigned char value)
{
CC2500_CSN_LOW; // 先设置SCN 一起作用

while (CC2500_SO); // 等待SO脚 变低,说明芯片电压调制器已稳定

SPI_Write(addr|WRITE_SINGLE); //写地址
SPI_Write(value); //写入配置
CC2500_CSN_HIGH; // 先设置SCN 一起作用
}






/**************************CC2500上电复位子程序********************************/

void CC2500_RES(void)
{
CC2500_SCLK_HIGH;
CC2500_SI_LOW; // SCLK,SI 先拉高,以避免PIN脚控制模式造成的潜在问题

CC2500_CSN_LOW;
CC2500_CSN_HIGH; // 先将CSN为低,然后再拉高
Delay_MS(1);

CC2500_CSN_LOW;
Delay_MS(1);

CC2500_CSN_HIGH; // 先将CSN为低,然后再拉高
Delay_MS(1);

CC2500_CSN_LOW;

while ( CC2500_SO ); // 将CSN拉低等待SO变低*****************************

SPI_Write(CC2500_SRES); //写入复位命令 CCxxx0_SRES=0x30

CC2500_CSN_HIGH;

}




/************************CC2500 寄存器配置文件写入******2.4KB/s*****************************/


void CC2500_RES_File(void) // CC2500 寄存器配置文件 写入
{

CC2500_WriteReg(TI_CCxxx0_IOCFG0,0x06); //GDO0Output Pin Configuration
CC2500_WriteReg(TI_CCxxx0_FIFOTHR,0x07); //RX FIFO and TX FIFO Thresholds
CC2500_WriteReg(TI_CCxxx0_PKTLEN,0xFF); //Packet Length
CC2500_WriteReg(TI_CCxxx0_PKTCTRL1,0x04); //Packet Automation Control
CC2500_WriteReg(TI_CCxxx0_PKTCTRL0,0x05); //Packet Automation Control
CC2500_WriteReg(TI_CCxxx0_ADDR,0x00); //Device Address
CC2500_WriteReg(TI_CCxxx0_CHANNR,0x00); //Channel Number
CC2500_WriteReg(TI_CCxxx0_FSCTRL1,0x08); //Frequency Synthesizer Control
CC2500_WriteReg(TI_CCxxx0_FSCTRL0,0x00); //Frequency Synthesizer Control
CC2500_WriteReg(TI_CCxxx0_FREQ2,0x5D); //Frequency Control Word, High Byte


CC2500_WriteReg(TI_CCxxx0_FREQ1,0x93); //Frequency Control Word, Middle Byte
CC2500_WriteReg(TI_CCxxx0_FREQ0,0xB1); //Frequency Control Word, Low Byte
CC2500_WriteReg(TI_CCxxx0_MDMCFG4,0x86); //Modem Configuration
CC2500_WriteReg(TI_CCxxx0_MDMCFG3,0x83); //Modem Configuration
CC2500_WriteReg(TI_CCxxx0_MDMCFG2,0x03); //Modem Configuration
CC2500_WriteReg(TI_CCxxx0_MDMCFG1,0x22); //Modem Configuration
CC2500_WriteReg(TI_CCxxx0_MDMCFG0,0xF8); //Modem Configuration
CC2500_WriteReg(TI_CCxxx0_DEVIATN,0x44); //Modem Deviation Setting
CC2500_WriteReg(TI_CCxxx0_MCSM2,0x07); //Main Radio Control State Machine Configuration
CC2500_WriteReg(TI_CCxxx0_MCSM1,0x30); //Main Radio Control State Machine Configuration
CC2500_WriteReg(TI_CCxxx0_MCSM0,0x18); //Main Radio Control State Machine Configuration
CC2500_WriteReg(TI_CCxxx0_FOCCFG,0x16); //Frequency Offset Compensation Configuration
CC2500_WriteReg(TI_CCxxx0_BSCFG,0x6C); //Bit Synchronization Configuration
CC2500_WriteReg(TI_CCxxx0_AGCCTRL2,0x03); //AGC Control
CC2500_WriteReg(TI_CCxxx0_AGCCTRL1,0x40); //AGC Control
CC2500_WriteReg(TI_CCxxx0_AGCCTRL0,0x91); //AGC Control
CC2500_WriteReg(TI_CCxxx0_FREND1,0x56); //Front End RX Configuration
CC2500_WriteReg(TI_CCxxx0_FREND0,0x10); //Front End TX configuration
CC2500_WriteReg(TI_CCxxx0_FSCAL3,0xA9); //Frequency Synthesizer Calibration
CC2500_WriteReg(TI_CCxxx0_FSCAL2,0x0A); //Frequency Synthesizer Calibration
CC2500_WriteReg(TI_CCxxx0_FSCAL1,0x00); //Frequency Synthesizer Calibration
CC2500_WriteReg(TI_CCxxx0_FSCAL0,0x11); //Frequency Synthesizer Calibration
CC2500_WriteReg(TI_CCxxx0_FSTEST,0x59); //Frequency Synthesizer Calibration Control
CC2500_WriteReg(TI_CCxxx0_TEST2,0x88); //Various Test Settings
CC2500_WriteReg(TI_CCxxx0_TEST1,0x31); //Various Test Settings
CC2500_WriteReg(TI_CCxxx0_TEST0,0x0B); //Various Test Settings


// CC2500_Command(CC2500_SFRX); // 先进读取模式
// CC2500_Command(CC2500_SFTX); // 先进发射模式
CC2500_Command(CC2500_SIDLE); // 先进空闲模式


}






/***************** 以下为接收函数***************************************/


//--------------------------SPI单字节读取函数---------------------------

unsigned int SPI_Read(void)
{
unsigned char i,rxdata;
rxdata = 0x00;

for (i = 0;i < 8;i++)
{
rxdata = rxdata<<1;

CC2500_SCLK_HIGH;

if (CC2500_SO) //读取最高位,保存至最末尾,通过左移位完成整个字节
{
rxdata |= 0x01;
}

else
{
rxdata &= 0xFE; // 等同于 rxdata &= ~0x01;
}

_nop_();
_nop_();


CC2500_SCLK_LOW;

_nop_();
_nop_();


}



return rxdata;


}





//-----------------------

----CC2500寄存器读取函数------------------------------------

unsigned int CC2500_ReadReg(unsigned char addr)
{
unsigned char value;
CC2500_CSN_LOW;

while ( CC2500_SO ); // 将CSN拉低等待SO变低***************************

SPI_Write(addr|READ_SINGLE); //单字节读取 READ_SINGLE =0x80

value = SPI_Read();
CC2500_CSN_HIGH;

return value; // ***************************************************************

}



/***************** 以下为发送函数***************************************/

//---------------------------CC2500发送地址设置函数--------------------------------------
void CC2500_Write_TxADDR(void)
{

TxRxBuf[0] = CC2500_TxAddr; // CC2500_WriteReg(CC2500_ADDR,CC2500_TxAddr);
}



//---------------------------CC2500寄存器连续写入函数--------------------------------------
void CC2500_WriteBurstReg(unsigned char addr, unsigned char * buffer, unsigned char count)
{
unsigned char i;

CC2500_CSN_LOW; // CSN拉低

while (CC2500_SO); // 等待SO脚变低

SPI_Write(addr | WRITE_BURST); // 连续写入数据

for (i = 0; i < count; i++)
{
SPI_Write(buffer[i]); // 写数组中的数据入CC2500
}

CC2500_CSN_HIGH; // 数据写完后,CSN脚拉高,结束写入
}



//---------------------------CC2500数据包发送函数--------------------------------------
void CC2500_TxPacket(unsigned char * CC2500_TxRxBuf)
{
unsigned char CC2500_DATA_LEN = 8; // 发送数组的次数

CC2500_WriteBurstReg(CC2500_TXFIFO, CC2500_TxRxBuf,CC2500_DATA_LEN); //写入要发送的数据 CC2500_TXFIFO 0x3F CC2500_TxRxBuf 是数组

My_Data = CC2500_ReadReg(0xFA); // 读 TX FIFO中的 字节数 0x3A 一定要连续读!!!
SendData(My_Data); // 发送的个数数据发回给串口



CC2500_Command(CC2500_STX); //进入发送模式发送数据

while (!CC2500_GDO0); // Wait for GDO0 to be set -> sync transmitted
while (CC2500_GDO0); // Wait for GDO0 to be cleared -> end of packet




CC2500_Command(CC2500_SFTX); //刷新发送缓冲区 FIFO
CC2500_Command(CC2500_SIDLE); //进入空闲模式


}




void main (void)
{
MCU_init(); // 初始化MCU
SPI_init(); // SPI口上电初始化
CC2500_RES(); // 上电复位CC2500
CC2500_RES_File(); // CC2500 寄存器配置文件 写入
CC2500_WriteBurstReg(CC2500_PATABLE, PaTabel, 8); //设置输出功率为 0dBM

UART_INIT(); // 初始化串口

// CC2500_Write_TxADDR(); //---------------------------CC2500发送地址设置函数--------------------------------------

CC2500_Command(CC2500_SIDLE); // 先进空闲模式,防止锁死

while(1)
{


TxRxBuf[

0] = 0x08; //数组的初始值 这一个是数据包中数组的个数 发送的第一个字节不可以为 0!!!!不然发送不了
TxRxBuf[1] = 0x01;
TxRxBuf[2] = 0x02;
TxRxBuf[3] = 0x03;
TxRxBuf[4] = 0x04;
TxRxBuf[5] = 0x05;
TxRxBuf[6] = 0x06;
TxRxBuf[7] = 0x07;

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

TxRxBuf[8] = 0x08;
TxRxBuf[9] = 0x09;

TxRxBuf[10] = 0x0A;
TxRxBuf[11] = 0x0B;
TxRxBuf[12] = 0x0C;
TxRxBuf[13] = 0x0D;
TxRxBuf[14] = 0x0F;

TxRxBuf[15] = 0x07;
TxRxBuf[16] = 0x07;
TxRxBuf[17] = 0x01;
TxRxBuf[18] = 0x02;
TxRxBuf[19] = 0x03;
TxRxBuf[20] = 0x04;
TxRxBuf[21] = 0x05;
TxRxBuf[22] = 0x06;
TxRxBuf[23] = 0x07;
TxRxBuf[24] = 0x07;
**********************************************/


CC2500_TxPacket(TxRxBuf); // 发送数组


My_Data = 0;

LED = ~LED;

Delay_MS(2);


}

}


/*----------------------------
UART 中断服务程序
-----------------------------*/
void Uart() interrupt 4 using 1
{
if (RI)
{
RI = 0; //清除RI位
}
if (TI)
{
TI = 0; //清除TI位
busy = 0; //清忙标志
}
}

相关主题
文本预览
相关文档 最新文档