📄 tr.c
字号:
#include <iom8v.h>
#include "main.h"
#include "CC2500.h"
#include "zgb.h"
//#include "uart0.h"
#include "spi.h"
#include "pcdef.h"
uchar packetLength;
uchar cRSSI;
uchar stx_en,srx_en;
int rxtx_time;
uchar SO_data;
void SetupCC2500(void);
uchar RxCCxx00(void);
void TxCC2500(void);
void RXCC2500(void);
uchar SPI_write(uchar);
uchar SPI_read();
uchar ReadReg(uchar);
void WriteReg(uchar, uchar);
uchar ReadStatus(uchar);
void ReadBurstReg(uchar addr, uchar *buffer, uchar count);
void WriteBurstReg(uchar addr, uchar *buffer, uchar count);
uchar Strobe(uchar strobe) ;
uchar SendPacket(uchar *txBuffer, uchar size);
uchar ReceivePacket(uchar *rxBuffer, uchar length);
void POWER_UP_RESET_CC2500(void) ;
#define WRITE_BURST 0x40
#define READ_SINGLE 0x80
#define READ_BURST 0xC0
#define RSSI 0
#define LQI 1
//static uchar paTable_CC2500[] = {0xFF, 0xFE, 0xBB, 0xA9, 0x7F, 0x6E, 0x97, 0xC5 }; //CC2500发射功率表
static uchar paTable_CC2500[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };//CC2500发射功率表
//uchar txBuffer_CCxx00[] = {10, 0x5a};//0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9};
uchar txBuffer_CCxx00[] = {0x03,0x5a,0X05,0x00};//0x05,0x00};
uchar rxBuffer_CCxx00[3] = {0}; //接收缓冲
uchar status[2];
//250kbps MSK sensitivity
//E 指数,M底数
void WriteRfSettings_CC2500()
{
WriteReg(CC2500_FSCTRL1, 0x07); //0x0B 中频
WriteReg(CC2500_FSCTRL0, 0x00); //0x0C 加到基频上的频率偏移
WriteReg(CC2500_FREQ2, 0x5D); //0x0D (RF)
WriteReg(CC2500_FREQ1, 0x93); //0x0E
WriteReg(CC2500_FREQ0, 0xB1); //0x0F
WriteReg(CC2500_MDMCFG4, 0x2D); //0x10 (RX KHZ)
WriteReg(CC2500_MDMCFG3, 0x3B); //0x11 (DATARATE)
WriteReg(CC2500_MDMCFG2, 0x73); //0x12 BIT7:0 = Enable (better sensitivity)
// 1 = Disable (current optimized). Only for data rates ≤ 250 kBaud
// BIT6:4 = 0x111 MSK
// BIT3 = 0 禁止曼切斯特编码/译码
// BIT2:0 = 0X011 开启TX时的重复同步词汇发送和RX时的32 位同步词汇侦测
// (只有32 位中的30 位需要匹配):
WriteReg(CC2500_MDMCFG1, 0x22); //0x13 禁止前导位纠错;前导4个字节;信道空间的2个指数
WriteReg(CC2500_MDMCFG0, 0xF8); //0x14 (channal)信道空间(初始为1)的8位尾数26000000/2^18*(256+0xF8)*2^2*(channal)=199.951171875khz
// 此信道的频率单位与基频相加后,就是运行的频率
WriteReg(CC2500_CHANNR, 0x00); //0x0A
WriteReg(CC2500_DEVIATN, 0x01); //0x15 背离指数为0
WriteReg(CC2500_FREND1, 0xB6); //0x21 前端rx配置
WriteReg(CC2500_FREND0, 0x10); //0x22 前端TX配置,调整当前TX LO 缓冲(输入到PA)
WriteReg(CC2500_MCSM2, 0x07); //0x16 至到数据包终止
WriteReg(CC2500_MCSM1, 0x30); //0x17 若RSSI 在门限之下,清理数据包指示,除非当前接收一个数据包
// 在数据包被接受后的下一个状态:空闲
// 在数据包已发送到(TX)后的下个状态:空闲
WriteReg(CC2500_MCSM0, 0x18); //0x18 当从空闲到TX 或RX时,进行自动校准
// 终止次数64次,禁止引脚通讯控制选项,XOSC_FORCE_OFF
WriteReg(CC2500_FOCCFG, 0x1D); //0x19 频率偏移补偿配置
WriteReg(CC2500_BSCFG, 0x1C); //0x1A 位同步控制
WriteReg(CC2500_AGCCTRL2, 0xC7);//0x1B AGC控制寄存器
WriteReg(CC2500_AGCCTRL1, 0x00);//0x1C AGC控制寄存器
WriteReg(CC2500_AGCCTRL0, 0xB0);//0x1D AGC控制寄存器
WriteReg(CC2500_FSCAL3, 0xEA); //0x23 频率合成器校准配置和结果寄存器
WriteReg(CC2500_FSCAL2, 0x0A); //0x24 FSCAL3 CHIP_CURR_CAL_EN FSCAL3
WriteReg(CC2500_FSCAL1, 0x00); //0x25
WriteReg(CC2500_FSCAL0, 0x11); //0x26
WriteReg(CC2500_FSTEST, 0x59); //0X29 测试用
WriteReg(CC2500_TEST2, 0x88); //0x2C 测试用
WriteReg(CC2500_TEST1, 0x31); //0x2D 测试用
WriteReg(CC2500_TEST0, 0x0B); //0x2E 测试用
WriteReg(CC2500_IOCFG2, 0x29); //0x00 GDO2输出不反向,默认为CHIP_RDY,CHIP_RDYn 可在SO 脚被观测CHIP_RDYn 信号表明晶体正处于工作中,
//调节数字供给电压是稳定的。
WriteReg(CC2500_IOCFG1, 0x2E);//0x01 低驱动,不反向,高阻态
WriteReg(CC2500_IOCFG0, 0x06); //0x02 //
/*非温度检测,不反转,当同步词汇被送出/收到时声明,在数据包末端时反声明。对RX,当可选地址检测失败
或RX FIFO 溢出时,引脚被反声明。若TX FIFO 下溢,这个引脚将同样被反声明*/
WriteReg(CC2500_PKTCTRL1, 0x04);//0x07 附加状态字RSSI LQI如:CRCOK,无地址检查。
WriteReg(CC2500_PKTCTRL0, 0x05);//0x08 白化关闭,正常模式,使用RX/TX FIFO,CRC_EN,可变长度数据包
WriteReg(CC2500_ADDR, 0x00); //0x09 数据包过滤时使用的地址ADDRESS=00 FOR pc_card//????????????
WriteReg(CC2500_PKTLEN, 0x3D); //0x06 固定包的长度与可变数据包的最大长度
WriteReg(CC2500_FIFOTHR, 0x07); //0x03 TXFIFO=33/RXFIFO=32
}
void main(void)
{
system_init();
Dly1mS(6);
SetupCC2500();
Strobe(CC2500_SIDLE);
Strobe(CC2500_SRX);
//=====================================================================================
while(1) //for RX
{
PORTB|=0B00100000;
SendPacket(txBuffer_CCxx00, sizeof(txBuffer_CCxx00));//发送数据包
PORTB&=0B11011111;
NOP(10);
}
}
//======================================================================================
//初始化cc2500并切换到接收状态
//
//======================================================================================
void SetupCC2500(void)
{
POWER_UP_RESET_CC2500();//上电复位,进入空闲模式,重启
WriteRfSettings_CC2500();//设置各寄存器
WriteBurstReg(CC2500_PATABLE, paTable_CC2500, sizeof(paTable_CC2500));//输出功率
//* MCU 必须通过STX、SRX 和SIDLE 滤波控制发送和接收的起始和终止。 */
//PORTB&=0B11011111;
}
//=====================================================================================
//======================================================================================
//
//初始化cc2500并切换到接收状态
//
//======================================================================================
//------------------------------------------------------------
// 判断CC1100,CC2500是否接收到数据,如果有,在数码管显示出来
//-------------------------------------------------------------
uchar RxCCxx00(void)
{
uchar length;
//***LED OFF
length = sizeof(rxBuffer_CCxx00);//10个
srx_en = 0;
if(ReadStatus(CC2500_MARCSTATE)!=0x0D)//主通信控制状态机状态 RX状态,不是接收状态下
{
Strobe(CC2500_SRX);//启用RX
}
srx_en = 1;
if (ReceivePacket(rxBuffer_CCxx00, length))//CRC正确的话
{
// ======================================
//SEND_LED = ~SEND_LED;
return 1;
}
else
return 0;
}
//------------------------------------------------------------
// TX OPTION CC2500,CC2500pa,cc2550,cc2550pa发射数据
//-------------------------------------------------------------
void TxCC2500()
{
SendPacket(txBuffer_CCxx00, sizeof(txBuffer_CCxx00));
}
//---------------------------------------------------------------
void RXCC2500(void)
{
if(RxCCxx00()) //是否收到数据? 收到后处理
{
;
}
}
//================================================================
// SPI_write
// software spi
// 写进去数据的同时,读出状态字
//=================================================================
uchar SPI_write(uchar value)
{
uchar i,spi_status;
for(i=0;i<8;i++)
{
PORTD&= 0B11111101; //ZGB_SCLK = 0; //上升沿锁存
NOP(3);
if(value&0x80)//先进高位
PORTD|= 0B00000001; //ZGB_SI=1;
else
PORTD&= 0B11111110; // ZGB_SI=0;
value <<=1;
NOP(2);
PORTD|= 0B00000010; //ZGB_SCLK=1;
spi_status<<=1;//先出高位
NOP(2);
SO_data=PIND;//==============
if( (SO_data&0B00000100) == 0B00000100) //ZGB_SO
spi_status|= 0x01;
else
spi_status&= ~0x01;
NOP(2);
}
NOP(2);
PORTD&= 0B11111101; //ZGB_SCLK = 0;
NOP(2);
return(spi_status);
}
//--------------------------------------------------------------------
uchar SPI_read()
{
uchar i,value;
for(i=0;i<8;i++)
{
value <<=1;
PORTD|= 0B00000010; //ZGB_SCLK=1;
NOP(2);
SO_data=PIND; //==============
if( (SO_data&0B00000100) == 0B00000100) //ZGB_SO)
value |= 0x01;
else
value &= ~0x01;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -