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

超级无敌黄金炒饭 2016-07-20 10:05:16
我想将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]



各位大神懂得帮我分析下,多谢啦!如果需要其他数据我再贴上来。
...全文
1476 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bifeng8467 2017-07-27
  • 打赏
  • 举报
回复
同样的问题 楼主 dma的数据存在哪了,我也是用采集卡的,不知道程序的数据到底存在哪了
wuhuaiya 2017-03-08
  • 打赏
  • 举报
回复
求问楼主如何从计算机向9054发送数据
  • 打赏
  • 举报
回复
引用 6 楼 u012158162 的回复:
楼主,你这个能执行Dma通道传输的接口吗?
什么意思啊?
hard_沁尘 2016-08-11
  • 打赏
  • 举报
回复
楼主,你这个能执行Dma通道传输的接口吗?
Eleven 2016-07-20
  • 打赏
  • 举报
回复
你确定这个PlxDmaSglTransfer接口函数调用无误?且数据能够保存在DMADATA结构体中?
  • 打赏
  • 举报
回复
引用 2 楼 VisualEleven 的回复:
你的bufffer是怎么定义的?
另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?


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


这应该是buffer的定义吧?参数设定我感觉应该没问题,这是源码例程,能正常跑起来,MFC程序上也能接收到数据,但是现在的程序只是显示传输的次数,没有显示具体的数值。我就想找到这个数据。
  • 打赏
  • 举报
回复
引用 4 楼 VisualEleven 的回复:
你确定这个PlxDmaSglTransfer接口函数调用无误?且数据能够保存在DMADATA结构体中?
应该没有错误,这是源码,我调试的时候也能进入函数,运行后接收也正常,数据能不能保存在DMAData中?是不是应该在DMAData中,这也是我发帖想弄清楚的。
Eleven 2016-07-20
  • 打赏
  • 举报
回复
你的bufffer是怎么定义的? 另外你需要确认你的DmaData这个结构体数据填充没有问题?PlxDmaSglTransfer()参数正确?
「已注销」 2016-07-20
  • 打赏
  • 举报
回复
虽然没有看懂 但是顶一下

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧