somelee
驱动牛犊
驱动牛犊
  • 注册日期2007-08-29
  • 最后登录2009-02-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
阅读:1244回复:1

问下老手关于FLAGB占空比的问题 老丢数据

楼主#
更多 发布于:2007-08-29 22:16

我用的是SLAVE FIFO模式,发现FULL标志(也就是FLAGB)大多数时间是满,很少时间是不满

前端通过FPGA用11K的时钟写入16位数据时后面得到的数据基本正确。再快点就会丢数据
奇怪的时如果FPGA写入时钟SLWR变慢了之后虽说FIFO不空的时间变长了,但是空的时间也变长了,总体看来:占空比不变。

再一个问题:
驱动从FIFO的BUFFER里面读出来之后是不是直接写再PC的一个BUFFER里面了?如果是的话,当PC的BUFFER写满了会出现什么情况呢?怎么样才能知道PC里面的BUFFER的状态以便及时读取。
我现在用的是一个循环不断的读,还是感觉跟不上速度啊。读得太慢了

大致读取程序是这样的

int cnt=100;
while(--cnt){
doRead(1024);//一次读取1024Bytes.
}

谢谢大家不吝指教先。


下面是VC的界面读取和保存代码,这样得到得结果很搞笑,就是如果doRead(1022)(只要小于1024就会)读出得数据就是上一次的重复,真奇怪,我是从1写到65535的,如果每次只读1022字节的话,读出来的数据就会是1-511,1-511,1-511,。
如果设成1024就会丢数据,固件设的是1024×2缓存的  SLAVEFIFO  芯片用的68013A

void CUSBDlg::OnRead()
{
    // TODO: Add your control notification handler code here
    int cnt=100;
    while(--cnt){
                                          m_bRead = true;
        Delayu(100000);
        doRead(1024);
    }
}

void CUSBDlg::doRead(int n)
{
    
    ULONG   i = 0;
    unsigned char    *bufOutPut=NULL;
    ULONG    nRead = 0;
    ULONG    nOutput = 0;
    CHAR    bufInput[1] = {0x00};
    CString tempStrH = "";//用于临时保存每一个16位数据的高字节和低字节
    CString tempStrL = "";
    CString tempStr = "";
    CString m_strBGSave= "";
    CString bgfilename="E:\\bg_usb_data.txt";
    nRead = n;
    if(m_bRead)
    {
        bufOutPut = new unsigned char[nRead+1];
        memset(bufOutPut,0,sizeof(unsigned char)*nRead);
        if (bufOutPut == NULL)
        {
            MessageBox("Failed to allocate buffer for read");
        }
        else //successfully to allocate the buffer
        {
            if (!DeviceIoControl(m_hUsb,
                             DRIVER_IOCTL_802,
                             bufInput,
                             1,
                             bufOutPut,
                             nRead,
                             &nOutput,
                             NULL)
                )
                {
                    MessageBox("Failed to open the handle!");
                }
            else   //successfully to open the handle
            {
                ReadFile(m_hUsb, bufOutPut, nRead, &nOutput, NULL);
                m_bRead = false;
                m_strBGSave="";
                for(i=0;i<nRead;i+=2)
                {
                    tempStrL.Empty();
                    tempStrH.Empty();


                    if (*bufOutPut< 16)//前面补0//驱动先读出的是低字节)
                    
                    {
                        tempStrL = "0";
                        tempStr.Format("%X",*(bufOutPut));
                        tempStrL += tempStr;
                        bufOutPut++;
                        
                    }
                    else
                    {
                        tempStrL.Format("%X",*(bufOutPut));
                        bufOutPut++;
                    }
                    if (*bufOutPut< 16)//前面补0//高字节
                        
                    {
                        tempStrH = "0";
                        tempStr.Format("%X",*(bufOutPut));
                        tempStrH += tempStr;
                        bufOutPut++;
                    }
                    else
                    {
                        tempStrH.Format("%X",*(bufOutPut));
                        bufOutPut++;
                    }
                      m_strBGSave = m_strBGSave + tempStrH + tempStrL + " ";
                      //m_strDisData = m_strDisData + tempStrH + tempStrL + " ";
                     // m_strReadData = m_strReadData+ tempStrH + tempStrL + " ";
                }
                BGSave(bgfilename,m_strBGSave);
                UpdateData(FALSE);
            }
        }
        
    }
}
void CUSBDlg::BGSave(CString bgfilename,CString m_strBGSave)
{
    ULONG    m_length = 0;
    CFile BGFile;
    CFileFind finder;
    CFileException e;
    m_length =m_strBGSave.GetLength() ;
    if(!finder.FindFile(bgfilename))
        BGFile.Open(bgfilename,CFile::modeCreate|CFile::modeWrite,&e);
    else
    //BGFile.Open(bgfilename,CFile::modeWrite|CFile::modeCreate,&e);
    BGFile.Open(bgfilename,CFile::modeWrite,&e);
    BGFile.SeekToEnd();
    BGFile.Write(m_strBGSave,m_length);
    BGFile.Close();
}
somelee
驱动牛犊
驱动牛犊
  • 注册日期2007-08-29
  • 最后登录2009-02-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望7点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-08-29 22:20
void CUSBDlg::OnRead()
{
    // TODO: Add your control notification handler code here
    int cnt=100;
    while(--cnt){
                                          m_bRead = true;
        Delayu(100000);
        doRead(1024);
    }
}
我的这个地方的Delayu(1000000)实际是没用的哈,刚才写错了 而且这个Delayu就是
void Delayu(int n){
    for (int i=0;i<n;i++);
}
不知道这个该怎么读取
游客

返回顶部