PCI9054 Scatter/Gather DMA 模式从采集卡上传的数据放在什么地方?应该怎么提取?

时间:2021-12-23 11:06:21
我想将DMA传输的数据从内存中提取出来,然后我才能作计算,但是不知道这些数据在哪,怎么提取,我的采集卡发送的数据是每次加1递增的。

下面是整个接收数据的程序:

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]

PCI9054 Scatter/Gather DMA 模式从采集卡上传的数据放在什么地方?应该怎么提取?PCI9054 Scatter/Gather DMA 模式从采集卡上传的数据放在什么地方?应该怎么提取?

各位大神懂得帮我分析下,多谢啦!如果需要其他数据我再贴上来。

9 个解决方案

#1


虽然没有看懂 但是顶一下

#2


你的bufffer是怎么定义的?
另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?

#3


本帖最后由 VisualEleven 于 2016-07-20 10:43:32 编辑
引用 2 楼 VisualEleven 的回复:
你的bufffer是怎么定义的?
另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?


#define buf_len 223*16
#define FileLength  1024
U8 buffer[buf_len];


这应该是buffer的定义吧?参数设定我感觉应该没问题,这是源码例程,能正常跑起来,MFC程序上也能接收到数据,但是现在的程序只是显示传输的次数,没有显示具体的数值。我就想找到这个数据。

#4


你确定这个PlxDmaSglTransfer接口函数调用无误?且数据能够保存在DMADATA结构体中?

#5


引用 4 楼 VisualEleven 的回复:
你确定这个PlxDmaSglTransfer接口函数调用无误?且数据能够保存在DMADATA结构体中?


应该没有错误,这是源码,我调试的时候也能进入函数,运行后接收也正常,数据能不能保存在DMAData中?是不是应该在DMAData中,这也是我发帖想弄清楚的。

#6


楼主,你这个能执行Dma通道传输的接口吗?

#7


引用 6 楼 u012158162 的回复:
楼主,你这个能执行Dma通道传输的接口吗?
什么意思啊?

#8


求问楼主如何从计算机向9054发送数据

#9


同样的问题 楼主 dma的数据存在哪了,我也是用采集卡的,不知道程序的数据到底存在哪了

#1


虽然没有看懂 但是顶一下

#2


你的bufffer是怎么定义的?
另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?

#3


本帖最后由 VisualEleven 于 2016-07-20 10:43:32 编辑
引用 2 楼 VisualEleven 的回复:
你的bufffer是怎么定义的?
另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?


#define buf_len 223*16
#define FileLength  1024
U8 buffer[buf_len];


这应该是buffer的定义吧?参数设定我感觉应该没问题,这是源码例程,能正常跑起来,MFC程序上也能接收到数据,但是现在的程序只是显示传输的次数,没有显示具体的数值。我就想找到这个数据。

#4


你确定这个PlxDmaSglTransfer接口函数调用无误?且数据能够保存在DMADATA结构体中?

#5


引用 4 楼 VisualEleven 的回复:
你确定这个PlxDmaSglTransfer接口函数调用无误?且数据能够保存在DMADATA结构体中?


应该没有错误,这是源码,我调试的时候也能进入函数,运行后接收也正常,数据能不能保存在DMAData中?是不是应该在DMAData中,这也是我发帖想弄清楚的。

#6


楼主,你这个能执行Dma通道传输的接口吗?

#7


引用 6 楼 u012158162 的回复:
楼主,你这个能执行Dma通道传输的接口吗?
什么意思啊?

#8


求问楼主如何从计算机向9054发送数据

#9


同样的问题 楼主 dma的数据存在哪了,我也是用采集卡的,不知道程序的数据到底存在哪了