求助:请教高手CYRF6936数据接收问题
来源: 评论:0 点击:
最近正在用CYRF6936做数据无线收发的一个东西,控制器使用的是PIC18F14K50,这个单片机带USB接口的,把接收到的无线数据通过USB接口发送到上位机上去。现在遇到一些问题如下:
1、我用的是两种方式进行接收,一个是轮询,一个是中断。发送端我是定时发送的,每秒发送4K个字节。接收端用轮询的时候数据能够接收,但是很多数据会丢失,不能够完全接收到,请问这个是什么原因?初始化配置我是配置接收能够覆盖的,如果不覆盖就收不到数据,而且不覆盖的话也不知道程序怎么写。不知道怎么搞才能接收到所有的数据?
2、用中断接收的话就响应不到中断,单片机的中断设置完全没有问题了,用示波器检测也检测不到IRQ管脚的低电平,初始化配置和接收程序我会贴在下面,。这个问题困扰了一个星期了,请高手指教一下。谢谢。我的QQ:170469401
程序如下:
接收的初始化配置:
Write_Reg(0x1D,0x01); // MODE_OVERRIDE, RST (Reset module)
Write_Reg(0x00,0x48); // CHANNEL.
// Write_Reg(0x03,0x2F); // TX_CFG
// Write_Reg(0x03,0x27); // TX_CFG1-Mbps GFSK 4dBm
Write_Reg(0x05,0x00); // 禁止所有接收中断未启动接收 接收完成中断开启
Write_Reg(0x06,0x4A); // 01001010 RX_CFG_ADR, (RXOW EN)
Write_Reg(0x0B,0x00); // 禁止PMU
Write_Reg(0x0D,0x00); //使能IRQ,低电平触发
Write_Reg(0x0F,0x83); //
Write_Reg(0x10,0xEE); // FRAMING_CFG, LEN EN 11101110
Write_Reg(0x11,0x05); // DATA32_THOLD
Write_Reg(0x12,0x0E); // DATA64_THOLD
Write_Reg(0x15,0x14); // CRC_SEED_LSB
Write_Reg(0x16,0x14); // CRC_SEED_MSB
Write_Reg(0x1B,0x55); // TX_OFFSET_LSB
Write_Reg(0x1C,0x05); // TX_OFFSET_MSB
Write_Reg(0x27,0x02); // RXF =1
Write_Reg(0x28,0x02); // RXF =1
Write_Reg(0x32,0x3C); // 典型值
Write_Reg(0x35,0x14); // 典型值
Write_Reg(0x39,0x01); // ALL SLOW=1
Write_Reg(0x24,0x10); // PREAMBLE
Write_Reg(0x24,0x33); // PREAMBLE
Write_Reg(0x24,0x33); // PREAMBLE
// Write_Reg(0x05,0x82); //中断接收时这里打开,轮询是不用
轮询的接收程序:
unsigned char i,NewData,Temp,Temp2,Temp3,Temp4,Number;
// /*接收程序
NewData=0;
Number=0;
Write_Reg(0x05,0x80); //启动接收
while((!NewData)&&(Number<10))
{
Number++;
Temp=Read_Reg(0x07); //读取RX_IRQ_STATUS_ADR
if(!Read_Reg(0x05)) //RX_GO发生了变化,变为0,自动退出接收状态
{
Temp2=Read_Reg(0x08);//读取RX_STATUS_ADRRX_GO自动清零后需要读一下
if((Temp&(0x02))&&(!((Temp)&(0x01)))) //如果RXC IRQ为1且RXE IRQ为0
{
if(((Read_Reg(0x07))&0x01)) //如果第二次读RXE为1有错误发生
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
Temp3=Read_Reg(0x09);
for(i=0;iTemp4=Read_Reg(0x21); //读出错误的数据 长度为RX_COUNT_ADR
NewData=0;
}
else //无错误发生,读取有效数据
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
for (i=0; i<16; i++)
Receive_From_Cyrf=Read_Reg(0x21); //读数据
NewData=1; //标志位置1把收到的数据通过USB发送到上位机上去
}
}
else if((Temp&(0x02))&&(((Temp)&(0x01)))) //如果RXC IRQ为1且RXE IRQ为1 有错误发生
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
Temp3=Read_Reg(0x09);
for(i=0;iTemp4=Read_Reg(0x21); //读出错误的数据
NewData=0; //标志位置0
}
else
{
NewData=0;
}
}
}
if(NewData==1) //接收到数据 进行处理,放到USB发送缓冲器中
{
NewData=0;
if(DataCount==0)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer=Receive_From_Cyrf;
}
}
else if(DataCount==1)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+16]=Receive_From_Cyrf;
}
}
else if(DataCount==2)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+32]=Receive_From_Cyrf;
}
}
else if(DataCount==3)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+48]=Receive_From_Cyrf;
}
USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64); //启动USB发送
}
DataCount++;
if(DataCount==4)
{
DataCount=0;
}
DataInc++;
}
if(DataInc==16) //闪灯
{
DataInc=0;
LATCbits.LATC2=(LATCbits.LATC2);
}
中断接收的程序:
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{
unsigned char i,Temp,Temp2,Temp3,Temp4,Number;
INTCON3bits.INT1IE=0;
if(INTCON3bits.INT1IF==1)
{
INTCON3bits.INT1IF=0;
Temp=Read_Reg(0x07);
Temp2=Read_Reg(0x08);//读取RX_STATUS_ADRRX_GO自动清零后需要读一下
if((Temp&(0x02))&&(!((Temp)&(0x01)))) //如果RXC IRQ为1且RXE IRQ为0
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
if(((Read_Reg(0x07))&0x01)) //如果第二次读RXE为1有错误发生
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
Temp3=Read_Reg(0x09);
for(i=0;iTemp4=Read_Reg(0x21); //读出错误的数据 长度为RX_COUNT_ADR
IsHaveData=0;
}
else //无错误发生,读取有效数据
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
for (i=0; i<16; i++)
Receive_From_Cyrf=Read_Reg(0x21); //读数据
IsHaveData=1; //标志位置1把收到的数据通过USB发送到上位机上去
}
}
else if((Temp&(0x02))&&(((Temp)&(0x01)))) //如果RXC IRQ为1且RXE IRQ为1 有错误发生
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
Temp3=Read_Reg(0x09);
for(i=0;iTemp4=Read_Reg(0x21); //读出错误的数据
IsHaveData=0; //标志位置0
}
else
{
IsHaveData=0;
}
}
if(IsHaveData==1)
{
IsHaveData=0;
if(DataCount==0)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer=Receive_From_Cyrf;
}
}
else if(DataCount==1)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+16]=Receive_From_Cyrf;
}
}
else if(DataCount==2)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+32]=Receive_From_Cyrf;
}
}
else if(DataCount==3)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+48]=Receive_From_Cyrf;
}
USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64); //启动USB发送
}
DataCount++;
if(DataCount==4)
{
DataCount=0;
}
DataInc++;
}
if(DataInc==32)
{
DataInc=0;
LATCbits.LATC2=(LATCbits.LATC2);
}
Write_Reg(0x05,0x83); //再次启动接收
INTCON3bits.INT1IE=1;
}
两种接收方式的接收程序附在上面,请高手帮忙看看,如何接收数据接收的问题?能够使所有的数据都能够接收到。谢谢
1、我用的是两种方式进行接收,一个是轮询,一个是中断。发送端我是定时发送的,每秒发送4K个字节。接收端用轮询的时候数据能够接收,但是很多数据会丢失,不能够完全接收到,请问这个是什么原因?初始化配置我是配置接收能够覆盖的,如果不覆盖就收不到数据,而且不覆盖的话也不知道程序怎么写。不知道怎么搞才能接收到所有的数据?
2、用中断接收的话就响应不到中断,单片机的中断设置完全没有问题了,用示波器检测也检测不到IRQ管脚的低电平,初始化配置和接收程序我会贴在下面,。这个问题困扰了一个星期了,请高手指教一下。谢谢。我的QQ:170469401
程序如下:
接收的初始化配置:
Write_Reg(0x1D,0x01); // MODE_OVERRIDE, RST (Reset module)
Write_Reg(0x00,0x48); // CHANNEL.
// Write_Reg(0x03,0x2F); // TX_CFG
// Write_Reg(0x03,0x27); // TX_CFG1-Mbps GFSK 4dBm
Write_Reg(0x05,0x00); // 禁止所有接收中断未启动接收 接收完成中断开启
Write_Reg(0x06,0x4A); // 01001010 RX_CFG_ADR, (RXOW EN)
Write_Reg(0x0B,0x00); // 禁止PMU
Write_Reg(0x0D,0x00); //使能IRQ,低电平触发
Write_Reg(0x0F,0x83); //
Write_Reg(0x10,0xEE); // FRAMING_CFG, LEN EN 11101110
Write_Reg(0x11,0x05); // DATA32_THOLD
Write_Reg(0x12,0x0E); // DATA64_THOLD
Write_Reg(0x15,0x14); // CRC_SEED_LSB
Write_Reg(0x16,0x14); // CRC_SEED_MSB
Write_Reg(0x1B,0x55); // TX_OFFSET_LSB
Write_Reg(0x1C,0x05); // TX_OFFSET_MSB
Write_Reg(0x27,0x02); // RXF =1
Write_Reg(0x28,0x02); // RXF =1
Write_Reg(0x32,0x3C); // 典型值
Write_Reg(0x35,0x14); // 典型值
Write_Reg(0x39,0x01); // ALL SLOW=1
Write_Reg(0x24,0x10); // PREAMBLE
Write_Reg(0x24,0x33); // PREAMBLE
Write_Reg(0x24,0x33); // PREAMBLE
// Write_Reg(0x05,0x82); //中断接收时这里打开,轮询是不用
轮询的接收程序:
unsigned char i,NewData,Temp,Temp2,Temp3,Temp4,Number;
// /*接收程序
NewData=0;
Number=0;
Write_Reg(0x05,0x80); //启动接收
while((!NewData)&&(Number<10))
{
Number++;
Temp=Read_Reg(0x07); //读取RX_IRQ_STATUS_ADR
if(!Read_Reg(0x05)) //RX_GO发生了变化,变为0,自动退出接收状态
{
Temp2=Read_Reg(0x08);//读取RX_STATUS_ADRRX_GO自动清零后需要读一下
if((Temp&(0x02))&&(!((Temp)&(0x01)))) //如果RXC IRQ为1且RXE IRQ为0
{
if(((Read_Reg(0x07))&0x01)) //如果第二次读RXE为1有错误发生
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
Temp3=Read_Reg(0x09);
for(i=0;i
NewData=0;
}
else //无错误发生,读取有效数据
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
for (i=0; i<16; i++)
Receive_From_Cyrf=Read_Reg(0x21); //读数据
NewData=1; //标志位置1把收到的数据通过USB发送到上位机上去
}
}
else if((Temp&(0x02))&&(((Temp)&(0x01)))) //如果RXC IRQ为1且RXE IRQ为1 有错误发生
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
Temp3=Read_Reg(0x09);
for(i=0;i
NewData=0; //标志位置0
}
else
{
NewData=0;
}
}
}
if(NewData==1) //接收到数据 进行处理,放到USB发送缓冲器中
{
NewData=0;
if(DataCount==0)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer=Receive_From_Cyrf;
}
}
else if(DataCount==1)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+16]=Receive_From_Cyrf;
}
}
else if(DataCount==2)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+32]=Receive_From_Cyrf;
}
}
else if(DataCount==3)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+48]=Receive_From_Cyrf;
}
USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64); //启动USB发送
}
DataCount++;
if(DataCount==4)
{
DataCount=0;
}
DataInc++;
}
if(DataInc==16) //闪灯
{
DataInc=0;
LATCbits.LATC2=(LATCbits.LATC2);
}
中断接收的程序:
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode()
{
unsigned char i,Temp,Temp2,Temp3,Temp4,Number;
INTCON3bits.INT1IE=0;
if(INTCON3bits.INT1IF==1)
{
INTCON3bits.INT1IF=0;
Temp=Read_Reg(0x07);
Temp2=Read_Reg(0x08);//读取RX_STATUS_ADRRX_GO自动清零后需要读一下
if((Temp&(0x02))&&(!((Temp)&(0x01)))) //如果RXC IRQ为1且RXE IRQ为0
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
if(((Read_Reg(0x07))&0x01)) //如果第二次读RXE为1有错误发生
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
Temp3=Read_Reg(0x09);
for(i=0;i
IsHaveData=0;
}
else //无错误发生,读取有效数据
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
for (i=0; i<16; i++)
Receive_From_Cyrf=Read_Reg(0x21); //读数据
IsHaveData=1; //标志位置1把收到的数据通过USB发送到上位机上去
}
}
else if((Temp&(0x02))&&(((Temp)&(0x01)))) //如果RXC IRQ为1且RXE IRQ为1 有错误发生
{
Write_Reg(0x07,0x80);//对RXOW IRQ写1 读receive buffer 之前要写1
Temp3=Read_Reg(0x09);
for(i=0;i
IsHaveData=0; //标志位置0
}
else
{
IsHaveData=0;
}
}
if(IsHaveData==1)
{
IsHaveData=0;
if(DataCount==0)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer=Receive_From_Cyrf;
}
}
else if(DataCount==1)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+16]=Receive_From_Cyrf;
}
}
else if(DataCount==2)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+32]=Receive_From_Cyrf;
}
}
else if(DataCount==3)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+48]=Receive_From_Cyrf;
}
USBInHandle = HIDTxPacket(HID_EP,(BYTE*)&ToSendDataBuffer[0],64); //启动USB发送
}
DataCount++;
if(DataCount==4)
{
DataCount=0;
}
DataInc++;
}
if(DataInc==32)
{
DataInc=0;
LATCbits.LATC2=(LATCbits.LATC2);
}
Write_Reg(0x05,0x83); //再次启动接收
INTCON3bits.INT1IE=1;
}
两种接收方式的接收程序附在上面,请高手帮忙看看,如何接收数据接收的问题?能够使所有的数据都能够接收到。谢谢
自己先顶一下,不然要沉了,麻烦用过这个芯片的人指导一下
上一篇:电子自动开关
下一篇:嵌入式移动终端内置WIFI 的低功耗设计
评论排行
- ·HFSS天线设计入门中文视频教程(1)
- ·CST2013破解文件,和谐万岁(1)
- ·关于打不开ADS帮助文档(1)
- ·基于左手介质的小型微带天线(1)
- ·HFSS10中仿真出现的错误(1)
- ·HFSS仿真螺旋天线模型的脚本程序(1)
- ·HFSS能仿真线圈天线吗?(1)
- ·Momentum中无法设置Substrate?(1)
- ·大家ADS2008中PIN二极管如何设定啊(1)
- ·请教ADS中的MSub个参数的意思(1)
- ·HFSS中怎么设置一个平面波激励啊(1)
- ·Hfss局部加密网格(1)
- ·HFSS使用心得(1)
- ·HFSS设计微带发夹型滤波器,求耦合系数请教(1)
- ·Microstrip Antenna Technology (Ke...(0)
- ·跟大家分享个宽频带90度功分移相网络(0)
- ·求教ADS中倍频器与频率源设置(0)
- ·30多个ADS视频教程在线观看(0)
- ·微波射频电路仿真100例(0)
- ·射频功率放大器设计资料(0)