📄 send.h
字号:
uchar packetLength;
uchar cRSSI;
bit stx_en,srx_en;
int rxtx_time;
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() ;
#define WRITE_BURST 0x40
#define READ_SINGLE 0x80
#define READ_BURST 0xC0
#define RSSI 0
#define LQI 1
static uchar paTable_CC2500[] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };//CC2500发射功率表
uchar txBuffer_CCxx00[]={0x01,0x00};//,0x00,0x00};
uchar rxBuffer_CCxx00[1]= {0}; //接收缓冲
uchar status[2];
//250kbps MSK sensitivity
//E 指数,M底数
void WriteRfSettings_CC2500()
{
WriteReg(CC2500_FSCTRL1, 0x10); //0x0B 中频 //0x07???????????0x0a???????????????
WriteReg(CC2500_FSCTRL0, 0x00); //0x0C 加到基频上的频率偏移
WriteReg(CC2500_FREQ2, 0x5D); //0x0D (RF)
WriteReg(CC2500_FREQ1, 0x93); //0x0E
WriteReg(CC2500_FREQ0, 0xB1); //0x0F
WriteReg(CC2500_MDMCFG4, 0x0E); //0x10 (RX KHZ)//0x2d????????????????????
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, 0x42); //0x13 禁止前导位纠错;前导4个字节;信道空间的2个指数//0X22?????????????
WriteReg(CC2500_MDMCFG0, 0xF8); //0x14 (channal)信道空间(初始为1)的8位尾数26000000/2^18*(256+0xF8)*2^2*(channal)=199.951171875khz
// 此信道的频率单位与基频相加后,就是运行的频率
WriteReg(CC2500_CHANNR, 0x00); //0x0A //0X02?????????????????
WriteReg(CC2500_DEVIATN, 0x00); //0x15 背离指数为0//0X01?????????
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, 0x40);//0x1C AGC控制寄存器 //0X00?????????????????
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, 0x19); //0x26 //0X11????????????????????????????
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
}
//初始化cc2500并切换到接收状态
//
//======================================================================================
void SetupCC2500 (void)
{
POWER_UP_RESET_CC2500();//上电复位,进入空闲模式,重启
WriteRfSettings_CC2500();//设置各寄存器
WriteBurstReg(CC2500_PATABLE, paTable_CC2500, sizeof(paTable_CC2500));//输出功率
//* MCU 必须通过STX、SRX 和SIDLE 滤波控制发送和接收的起始和终止。 *//
}
//================================================================
// SPI_write
// software spi
// 写进去数据的同时,读出状态字
//=================================================================
uchar SPI_write(uchar value)
{
uchar i,spi_status;
for(i=0;i<8;i++)
{
ZGB_SCLK = 0; //上升沿锁存
if(value&0x80)//先进高位
ZGB_SI=1;
else
ZGB_SI=0;
value <<=1;
ZGB_SCLK=1;
spi_status<<=1;//先出高位
if(ZGB_SO)
spi_status |= 0x01;
else
spi_status &= ~0x01;
}
ZGB_SCLK = 0;
return(spi_status);
}
//============================================================
// 写一个数到地址为<addr>的寄存器里
//===========================================================
void WriteReg(uchar addr, uchar value)
{
ZGB_CS=0;
while(ZGB_SO);
addr&=0x7F;
SPI_write(addr);
SPI_write(value);
ZGB_CS=1;
}
//===========================================================
// 写多个值到寄存器里
// 起始地址:addr
// 数量:count
// 数据来源:*buffer
//
//============================================================
void WriteBurstReg(uchar addr, uchar *buffer, uchar count)
{
unsigned char j,value;//i;
ZGB_CS = 0;
while(ZGB_SO);
addr |= WRITE_BURST;
SPI_write(addr);
for(j=0;j<count;j++)
{
value=buffer[j];
SPI_write(value);
//for(i=0;i<10;i++);///100??????????????????????????????????
}
ZGB_CS = 1;
}
//===========================================================
// 写一个命令到RF里
//===========================================================
uchar Strobe(uchar command)
{
uchar status;
ZGB_CS = 0;
while(ZGB_SO);
status = SPI_write(command);
ZGB_CS = 1;
return(status);
}
//=========================================================
// 发送数据包(查询方式)
// 数据来源:*txBuffer
// 数据包长度:size
//=========================================================
uchar SendPacket(uchar *txBuffer, uchar size)
{
stx_en = 0;
//Strobe(CC2500_SIDLE); //退出
//Strobe(CC2500_SFTX); //Flush the TX FIFO buffer
WriteBurstReg(CC2500_TXFIFO, txBuffer, size);
Strobe(CC2500_STX); //用STX 开启TX
NOP(450);
/*
stx_en = 1;
rxtx_time = size*100;//100???????????????????????
while(stx_en)
{
rxtx_time--;
if(rxtx_time==0)//仅执行一次
{
Strobe(CC2500_SIDLE); //发射失败,退出
return 1;
}
}
*/
Strobe(CC2500_SIDLE);
return 0;
}
//=========================================================
void POWER_UP_RESET_CC2500()
{
ZGB_SCLK = 1;
NOP(100);
ZGB_SI = 0;
NOP(100);
ZGB_CS = 1;
NOP(100);
ZGB_CS = 0;
NOP(10);
ZGB_CS = 1;
NOP(200);
ZGB_CS = 0;
while(ZGB_SO);// 等待变低
Strobe(CC2500_SRES); /*重启芯片当电源供应遵守表12 的要求时,便可保证合适的重启功率。然而,应该
假设芯片含有未知的状态,直到在SPI 接口上传递一个SRES 滤波为止。任何情况下,
在开始工作之后,应该传送一个SRES 滤波。*/
while(ZGB_SO);
//Strobe(CC2500_SIDLE);////进入空闲模式,SIDLE 命令滤波总能用来强制通信控制装置进入空闲状态
ZGB_CS = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -