最近正在用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_CFG 1-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_ADR RX_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<Temp3;i++)
Temp4=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[i]=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<Temp3;i++)
Temp4=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[i]=Receive_From_Cyrf[i];
}
}
else if(DataCount==1)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+16]=Receive_From_Cyrf[i];
}
}
else if(DataCount==2)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+32]=Receive_From_Cyrf[i];
}
}
else if(DataCount==3)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+48]=Receive_From_Cyrf[i];
}
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_ADR RX_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<Temp3;i++)
Temp4=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[i]=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<Temp3;i++)
Temp4=Read_Reg(0x21); //读出错误的数据
IsHaveData=0; //标志位置0
}
else
{
IsHaveData=0;
}
}
if(IsHaveData==1)
{
IsHaveData=0;
if(DataCount==0)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i]=Receive_From_Cyrf[i];
}
}
else if(DataCount==1)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+16]=Receive_From_Cyrf[i];
}
}
else if(DataCount==2)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+32]=Receive_From_Cyrf[i];
}
}
else if(DataCount==3)
{
for(i=0;i<16;i++)
{
ToSendDataBuffer[i+48]=Receive_From_Cyrf[i];
}
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;
}
两种接收方式的接收程序附在上面,请高手帮忙看看,如何接收数据接收的问题?能够使所有的数据都能够接收到。谢谢 |
|