📄 tr.c
字号:
NOP(2);
PORTD&=0B01111111; //ZGB_SCLK=0;
NOP(2);
}
return value;
}
//==========================================================
// 读单个寄存器的值
//==========================================================
uchar ReadReg(uchar addr)
{
unsigned char value;
PORTD&=0B01111111; //ZGB_CS = 0;
NOP(2);
SO_data=PIND;
while((SO_data&0B00000100) == 0B00000100)
SO_data=PIND; //ZGB_SO);
addr|=READ_SINGLE;
SPI_write(addr);
value=SPI_read();
NOP(2);
PORTD|=0B10000000; //ZGB_CS=1;
NOP(2);
return value;
}
//============================================================
// 写一个数到地址为<addr>的寄存器里
//===========================================================
void WriteReg(uchar addr, uchar value)
{
PORTD&=0B01111111; //ZGB_CS=0;
SO_data=PIND;
while( (SO_data&0B00000100) == 0B00000100 )
SO_data=PIND; //ZGB_SO);
addr&=0x7F;
SPI_write(addr);
SPI_write(value);
NOP(2);
PORTD|=0B10000000; //ZGB_CS=1;
}
//===========================================================
// 读RF的地址为<addr>的状态寄存器
//===========================================================
uchar ReadStatus(uchar addr)
{
unsigned char value;
PORTD&=0B01111111; //ZGB_CS = 0;
SO_data=PIND;
while(( SO_data&0B00000100 ) == 0B00000100) //ZGB_SO);
SO_data=PIND;
addr|= READ_BURST;
SPI_write(addr);
value=SPI_read();
NOP(2);
PORTD|=0B10000000; //ZGB_CS = 1;
cRSSI = value;
return value;
}
//============================================================
// 读多个寄存器的值
// 起始地址:addr
// 数量:count
// 保存地方:*buffer
//============================================================
void ReadBurstReg(uchar addr, uchar *buffer, uchar count)
{
unsigned char j,value;
PORTD&=0B01111111; //ZGB_CS = 0;
//==============
SO_data=PIND;
while(( SO_data&0B00000100 ) == 0B00000100) //ZGB_SO);
SO_data=PIND;
addr|=READ_BURST;
SPI_write(addr);
for(j=0;j<count;j++)
{
value=SPI_read();
buffer[j]=value;
}
NOP(1);
PORTD|=0B10000000; //ZGB_CS = 1;
}
//===========================================================
// 写多个值到寄存器里
// 起始地址:addr
// 数量:count
// 数据来源:*buffer
//
//============================================================
void WriteBurstReg(uchar addr, uchar *buffer, uchar count)
{
unsigned char i,j,value;
PORTD&=0B01111111; //ZGB_CS = 0;
//PORTB&=0B11011111;
SO_data=PIND;
while( ( SO_data&0B00000100 ) == 0B00000100 ) //ZGB_SO);
SO_data=PIND;
addr |= WRITE_BURST;
SPI_write(addr);
for(j=0;j<count;j++)
{
value=buffer[j];
SPI_write(value);
for(i=0;i<100;i++);
}
NOP(1);
PORTD|=0B10000000; //ZGB_CS = 1;
}
//===========================================================
// 写一个命令到RF里
//===========================================================
uchar Strobe(uchar command)
{
uchar status;
PORTD &= 0B01111111; //ZGB_CS = 0;
//==============
SO_data=PIND;
while( ( SO_data&0B00000100 ) == 0B00000100) //ZGB_SO);
SO_data=PIND;
status = SPI_write(command);
NOP(100);
PORTD |= 0B10000000; //ZGB_CS = 1;
return(status);
}
//=========================================================
// 发送数据包(查询方式)
// 数据来源:*txBuffer
// 数据包长度:size
//=========================================================
uchar SendPacket(uchar *txBuffer, uchar size)
{
stx_en = 0;
Strobe(CC2500_SIDLE); //退出
// Dly1mS(1);
Strobe(CC2500_SFTX); //Flush the TX FIFO buffer
// Dly1mS(1);
WriteBurstReg(CC2500_TXFIFO, txBuffer, size);
// Dly1mS(1);
Strobe(CC2500_STX); //用STX 开启TX
stx_en = 1;
rxtx_time = size*100;
while(stx_en)
{
//Delay_5_us();
rxtx_time--;
if(rxtx_time==0)//仅执行一次
{
Strobe(CC2500_SIDLE); //发射失败,退出
return 1;
}
//===============================
}
Strobe(CC2500_SIDLE);
return 0;
}
//=========================================================
// 接收数据包(查询方式)
// 保存在:*rxBuffer
// 数据包长度:length
//=========================================================
uchar ReceivePacket(uchar *rxBuffer, uchar length)
{
// uchar i;
if(ReadStatus(CC2500_RXBYTES)==0) //接收是否下溢
{
return 0;
}
rxtx_time=length*100;
while (srx_en)
{
Delay_5_us();
rxtx_time--;
if(rxtx_time==0)
{
Strobe(CC2500_SIDLE);//接收失败,退出
return 0;
}
}
packetLength = ReadReg(CC2500_RXFIFO);//读取接收的字节数
if (packetLength == length)
{
ReadBurstReg(CC2500_RXFIFO, rxBuffer, packetLength);
ReadBurstReg(CC2500_RXFIFO, status, 2);
Strobe(CC2500_SFRX);
return (status[LQI] & CRC_OK);//连接质量的解调器估计
}
else
{
Strobe(CC2500_SIDLE);//退出
Strobe(CC2500_SFRX);//刷新缓冲
return 0;
}
}
//==========================================================
void POWER_UP_RESET_CC2500()
{
PORTD |= 0B00000010; //ZGB_SCLK = 1;
NOP(100);
PORTD &= 0B11111110; //ZGB_SI = 0;
NOP(100);
PORTD |= 0B10000000; //ZGB_CS = 1;
NOP(100);
PORTD &= 0B01111111; //ZGB_CS = 0;
NOP(10);
PORTD |= 0B10000000; //ZGB_CS = 1;
NOP(200);
PORTD &= 0B01111111; //ZGB_CS = 0;
//==============
SO_data=PIND;
while( ( SO_data&0B00000100 ) == 0B00000100) //ZGB_SO 等待变低
SO_data=PIND;
Strobe(CC2500_SRES); /*重启芯片当电源供应遵守表12 的要求时,便可保证合适的重启功率。然而,应该
假设芯片含有未知的状态,直到在SPI 接口上传递一个SRES 滤波为止。任何情况下,
在开始工作之后,应该传送一个SRES 滤波。*/
SO_data=PIND;
while( (SO_data&0B00000100 ) == 0B00000100) //ZGB_SO);
SO_data=PIND;//==============
//Strobe(CC2500_SIDLE);////进入空闲模式,SIDLE 命令滤波总能用来强制通信控制装置进入空闲状态
PORTD|=0B10000000; //ZGB_CS = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -