下面是整个接收数据的程序:
void CNO_SDRAM_DAQDlg::OnRecieveT()
{
// TODO: Add your control notification handler code here
// No search criteria, select all devices
GetDlgItem(IDC_Start_Receive)->EnableWindow(FALSE);
GetDlgItem(IDC_Start_Save)->EnableWindow(TRUE);
GetDlgItem(IDC_Stop_Receive)->EnableWindow(TRUE);
DWORD EventStatus;
framecount = 0;
int i = 0;
WaitIntr = 1;
b_write = 0;
ReceiveFlag = 0xF0;
rc = PlxBusIopWrite(hDevice,IopSpace1,0x00001000,TRUE,&ReceiveFlag,1,BitSize8);
if(rc == ApiSuccess)
{
m_status.Format("PlxBusIopWrite成功");
}
else
{
m_status.Format("PlxBusIopWrite失败");
}
SetDlgItemText(IDC_status,m_status);
memset(
&DmaDesc,
0,
sizeof(DMA_CHANNEL_DESC)
);
// Set up DMA configuration structure
DmaDesc.EnableReadyInput = 1;
DmaDesc.EnableBTERMInput = 0;
DmaDesc.EnableIopBurst = 1;
DmaDesc.EnableWriteInvalidMode = 0;
DmaDesc.EnableDmaEOTPin = 0;
DmaDesc.DmaStopTransferMode = AssertBLAST;
DmaDesc.HoldIopAddrConst = 1;
DmaDesc.DemandMode = 0;
DmaDesc.EnableTransferCountClear = 0;
DmaDesc.WaitStates = 0;
DmaDesc.IopBusWidth = 2; // 32-bit
DmaDesc.DmaChannelPriority = Rotational;
rc = PlxDmaSglChannelOpen(
hDevice,
PrimaryPciChannel0,
&DmaDesc
);
if (rc == ApiSuccess)
m_status.Format("成功打开DMA通道0");
else
m_status.Format("无法打开DMA通道0");
SetDlgItemText(IDC_status,m_status);
DmaData.u.UserVa = (U32)buffer;
DmaData.LocalAddr = 0x00008000;
DmaData.TransferCount = sizeof(buffer);
DmaData.LocalToPciDma = 1;// Local to PCI
DmaData.TerminalCountIntr = 0;
while(WaitIntr)
{
memset(
&buffer,
0,
sizeof(buffer)
);
// Clear INTR descriptor structure
memset(
&PlxInterrupt,
0,
sizeof(PLX_INTR)
);
rc=PlxIntrStatusGet(hDevice,&PlxInterrupt);
PlxInterrupt.PciDmaChannel0 = 1;
PlxInterrupt.PciMainInt = 1;
PlxInterrupt.IopToPciInt = 1;
rc = PlxIntrAttach(
hDevice,
PlxInterrupt,
&hInterruptEvent
);
rc = PlxIntrEnable(
hDevice,
&PlxInterrupt
);
EventStatus = WaitForSingleObject(
hInterruptEvent,
1000
);
switch(EventStatus)
{
case WAIT_OBJECT_0:
flag = 1;
m_status.Format("获取中断");
break;
case WAIT_TIMEOUT:
flag = 0;
m_status.Format("等待超时");
break;
case WAIT_FAILED:
flag = 0;
m_status.Format("等待失败");
break;
default:
flag = 0;
break;
}
SetDlgItemText(IDC_status,m_status);
if(flag == 1)
{
rc = PlxDmaSglTransfer(
hDevice,
PrimaryPciChannel0,
&DmaData,
0 // Wait for completion
);
if (rc == ApiSuccess)
{ i++;
m_status.Format("成功进行DMA传输");
m_TRANSFERTIME.Format("%d\n",i);
if(b_write)
{
FIFODATA.Write(buffer,buf_len);
m_status.Format("成功进行数据保存");
}
}
else if(rc == ApiDmaInProgress)
{
m_status.Format("ApiDmaInProgress");
}
else if(rc == ApiDmaChannelInvalid)
{
m_status.Format("ApiDmaChannelInvalid");
}
else if(rc == ApiPciTimeout)
{
m_status.Format("ApiPciTimeout");
}
else
m_status.Format("没有进行DMA传输");
SetDlgItemText(IDC_EDIT_TRANSFERTIME,m_TRANSFERTIME);
SetDlgItemText(IDC_status,m_status);
}
else break;
}
}
下面是调试时的图,我觉得可能在DMAData或者buffer里面,但是两个里面的数据都不变化,buffer里打开后有时候会出现乱码,大多数时候就像图中的样子是0‘’这样的。[/b]
各位大神懂得帮我分析下,多谢啦!如果需要其他数据我再贴上来。
9 个解决方案
#1
虽然没有看懂 但是顶一下
#2
你的bufffer是怎么定义的?
另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?
另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?
#3
#define buf_len 223*16
#define FileLength 1024
U8 buffer[buf_len];
这应该是buffer的定义吧?参数设定我感觉应该没问题,这是源码例程,能正常跑起来,MFC程序上也能接收到数据,但是现在的程序只是显示传输的次数,没有显示具体的数值。我就想找到这个数据。
#4
你确定这个PlxDmaSglTransfer接口函数调用无误?且数据能够保存在DMADATA结构体中?
#5
应该没有错误,这是源码,我调试的时候也能进入函数,运行后接收也正常,数据能不能保存在DMAData中?是不是应该在DMAData中,这也是我发帖想弄清楚的。
#6
楼主,你这个能执行Dma通道传输的接口吗?
#7
什么意思啊?
#8
求问楼主如何从计算机向9054发送数据
#9
同样的问题 楼主 dma的数据存在哪了,我也是用采集卡的,不知道程序的数据到底存在哪了
#1
虽然没有看懂 但是顶一下
#2
你的bufffer是怎么定义的?
另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?
另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?
#3
#define buf_len 223*16
#define FileLength 1024
U8 buffer[buf_len];
这应该是buffer的定义吧?参数设定我感觉应该没问题,这是源码例程,能正常跑起来,MFC程序上也能接收到数据,但是现在的程序只是显示传输的次数,没有显示具体的数值。我就想找到这个数据。
#4
你确定这个PlxDmaSglTransfer接口函数调用无误?且数据能够保存在DMADATA结构体中?
#5
应该没有错误,这是源码,我调试的时候也能进入函数,运行后接收也正常,数据能不能保存在DMAData中?是不是应该在DMAData中,这也是我发帖想弄清楚的。
#6
楼主,你这个能执行Dma通道传输的接口吗?
#7
什么意思啊?
#8
求问楼主如何从计算机向9054发送数据
#9
同样的问题 楼主 dma的数据存在哪了,我也是用采集卡的,不知道程序的数据到底存在哪了