打印

请教高手CYRF6936数据接收问题

[复制链接]
17367|27
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
blue0432|  楼主 | 2010-4-1 15:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近正在用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;

}

两种接收方式的接收程序附在上面,请高手帮忙看看,如何接收数据接收的问题?能够使所有的数据都能够接收到。谢谢
沙发
msucl| | 2010-4-2 00:34 | 只看该作者
cypress有USB和6936 2合1的产品,型号是CYRF69213, 这里有很多资料可以下载: https://secure.cypress.com/?app= ... amp;applicationID=0

使用特权

评论回复
板凳
blue0432|  楼主 | 2010-4-2 08:15 | 只看该作者
2# msucl
这个我知道,但是现在不可能再换方案了

使用特权

评论回复
地板
god_like| | 2010-4-2 13:29 | 只看该作者
不懂,帮LZ顶一个

使用特权

评论回复
5
jxin| | 2010-4-3 18:32 | 只看该作者
轮询的时候, 你是如何保证在接收和发送的逻辑正确的?就是说在接收的时候是否有的地址的数据没有被读取就已经被新发送的数据覆盖了?

使用特权

评论回复
6
blue0432|  楼主 | 2010-4-6 11:45 | 只看该作者
5# jxin
这个系统的任务就是接收无线数据,然后放到USB缓冲器中发送到上位机上,其他什么事情都不做,而发送端是4ms中断一次并发送16个字节。单片机4ms轮询一次接收数据和处理数据,时间是够的,即使我把中断时间设的长一点,还是会有数据丢失,请问这是什么原因?

使用特权

评论回复
7
linhai2009| | 2010-4-6 12:11 | 只看该作者
好长的程序,没看明白~~~

使用特权

评论回复
8
jxin| | 2010-4-6 18:10 | 只看该作者
for (i=0; i<16; i++)
Receive_From_Cyrf[i]=Read_Reg(0x21);
这里的Read_reg 是用来读这16bytes 数据的么?

使用特权

评论回复
9
虎虎生威| | 2010-4-6 21:24 | 只看该作者
学习了

使用特权

评论回复
10
blue0432|  楼主 | 2010-4-7 10:54 | 只看该作者
8# jxin
是的,判断没有错误后,就读取BUF里面的16字节的数据。读取后再做相应的处理

使用特权

评论回复
11
jxin| | 2010-4-7 18:17 | 只看该作者
虽然不能换方案,最好的办法还是参考用psoc 做主控器的方案,读懂了参考的,再做自己的

使用特权

评论回复
12
blue0432|  楼主 | 2010-4-8 16:42 | 只看该作者
11# jxin
请问有没有psoc 做主控器的电路图和程序下载?最好是C语言的,汇编的看不懂。

使用特权

评论回复
13
jxin| | 2010-4-8 17:31 | 只看该作者
CY4672, CY4636, Example_Receive_CYRF6936,在cypress.com都可以找到

使用特权

评论回复
14
chuxh| | 2010-4-8 20:35 | 只看该作者
为啥不能换方案了?

使用特权

评论回复
15
jxin| | 2010-5-25 15:41 | 只看该作者
问题解决了吗。。

使用特权

评论回复
16
淡蓝的天空| | 2010-5-25 22:48 | 只看该作者
应该解决了,都这么长时间了

使用特权

评论回复
17
五谷道场| | 2010-5-26 23:02 | 只看该作者
大伙一般都是没解决老来问,一解决了就消失了

使用特权

评论回复
18
rocky_bian| | 2010-5-27 11:04 | 只看该作者
替楼主回答:
重要还是PCB layout的问题,导致数据的丢失

使用特权

评论回复
19
jxin| | 2010-5-27 12:48 | 只看该作者
替楼主回答:
重要还是PCB layout的问题,导致数据的丢失
rocky_bian 发表于 2010-5-27 11:04
楼主授权给你全权负责这个案子?:lol

使用特权

评论回复
20
skypoet| | 2010-5-29 16:26 | 只看该作者
程序真长,看着也费劲,没用过CY的无线芯片,不过可以提几点建议。
你的发送和接收是否匹配啊?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

10

帖子

1

粉丝