This section contains information specific to the Windows product.
// PXIVisaSample
// An example of how to use Keysight VISA to get/set attributes
// and access memory on a PXI device.
//
// Error checking should always be done when making VISA calls.
// To simplify this example and make it easier to read,
// most error checking has been eliminated.
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
#include <stdio.h>
#include <windows.h>
#include "visa.h"
///////////////////////////////////////////////////////////////////////////////////
// Finding all VISA PXI resources
///////////////////////////////////////////////////////////////////////////////////
void VisaFindRsrc()
{
ViStatus status;
ViSession drm;
printf("VISA viFindRsrc / viFindNext\n");
printf("============================\n");
// Open a session to the VISA default resource manager
status = viOpenDefaultRM(&drm);
// Find all PXI resources
char *searchExpression = "PXI?*";
ViSession viFindSession;
ViUInt32 findCount = 0;
ViChar findName[1024];
status = viFindRsrc(drm, searchExpression, &viFindSession, &findCount, findName);
if (status >= VI_SUCCESS)
{
printf("viFindRsrc of '%s' found %d device(s)\n", searchExpression, findCount);
for (ViUInt32 index = 1; index <= findCount; index++)
{
printf(" %2d: %s\n", index, findName);
if (index < findCount)
{
status = viFindNext(viFindSession, findName);
}
}
status = viClose(viFindSession);
}
status = viClose(drm);
printf("\n");
}
void VisaLowLevelMemoryAccess(char *visaName)
{
ViStatus status;
ViSession drm;
printf("VISA Low Level Memory Access Example\n");
printf("====================================\n");
// Open a session to the VISA default resource manager
status = viOpenDefaultRM(&drm);
// Open a session to the PXI device
ViSession vi;
status = viOpen(drm, visaName, VI_NULL, VI_NULL, &vi);
printf("Opening '%s' returned status=0x%x\n", visaName, status);
// Get the manufacturer and model name
ViChar manfName[1024];
ViChar modelName[1024];
status = viGetAttribute(vi, VI_ATTR_MANF_NAME, manfName);
status = viGetAttribute(vi, VI_ATTR_MODEL_NAME, modelName);
printf(" Manufacturer Name: '%s'\n", manfName);
printf(" Model Name: '%s'\n", modelName);
// Get the size of the BAR0 memory
ViAttr mapAttr = VI_ATTR_PXI_MEM_SIZE_BAR0;
ViUInt16 mapSpace = VI_PXI_BAR0_SPACE;
ViBusSize mapSize = 0;
status = viGetAttribute(vi, mapAttr, &mapSize);
// Map BAR0 memory - Note: only one map at a time is allowed per VISA session
ViBusAddress mapOffset = 0;
ViAddr mapAddress = 0;
status = viMapAddress(vi, mapSpace, mapOffset, mapSize, VI_NULL, VI_NULL, &mapAddress);
if (sizeof(void*)==8)
{
// ViBusSize and viBusAddress are 64-bit values in 64-bit applications
printf(" Size of BAR0 memory = %I64d bytes\n", mapSize);
printf(" BAR0 Map Address = 0x%016I64x\n", mapAddress);
}
else
{
// ViBusSize and viBusAddress are 32-bit values in 32-bit applications
printf(" Size of BAR0 memory = %d bytes\n", mapSize);
printf(" BAR0 Map Address = 0x%08x\n", mapAddress);
}
// Find out if BAR0 memory can be dereferenced directly
ViUInt16 winAccess;
status = viGetAttribute(vi, VI_ATTR_WIN_ACCESS, &winAccess);
if (winAccess == VI_DEREF_ADDR)
{
printf(" BAR0 memory can be directly dereferenced\n");
}
else if (winAccess == VI_USE_OPERS)
{
printf(" BAR0 memory cannot be directly dereferenced.\n");
}
else if (winAccess == VI_NMAPPED)
{
printf(" BAR0 memory is not currently mapped.\n");
}
if (winAccess == VI_DEREF_ADDR)
{
printf(" Dereferencing BAR0 memory\n");
// Here are some examples of direct memory dereferencing:
ViUInt32 memValue0 = *((ViUInt32 *)mapAddress);
ViUInt32 memValue1 = *((ViUInt32 *)mapAddress+1);
printf(" memValue0 = 0x%08x, memValue1 = 0x%08x\n", memValue0, memValue1);
ViChar memValueArray[16];
memcpy(memValueArray, mapAddress, sizeof(memValueArray));
printf(" memValueArray = ");
for (int index = 0; index < sizeof(memValueArray); index++)
{
printf("%02x", memValueArray[index]);
}
printf("\n");
}
if ((winAccess == VI_USE_OPERS) || (winAccess == VI_DEREF_ADDR))
{
printf(" Using viPeek on BAR0 memory\n");
// Some examples of using viPeek for memory access:
ViUInt32 memValue0;
ViUInt32 memValue1;
viPeek32(vi, mapAddress, &memValue0);
viPeek32(vi, ((ViUInt32 *)mapAddress)+1, &memValue1);
printf(" memValue0 = 0x%08x, memValue1 = 0x%08x\n", memValue0, memValue1);
}
status = viUnmapAddress(vi);
status = viClose(vi);
status = viClose(drm);
printf("\n");
}
void VisaHighLevelMemoryAccess(char *visaName)
{
ViStatus status;
ViSession drm;
printf("VISA High Level Memory Access Example\n");
printf("=====================================\n");
// Open a session to the VISA default resource manager
status = viOpenDefaultRM(&drm);
// Open a session to the PXI device
ViSession vi;
status = viOpen(drm, visaName, VI_NULL, VI_NULL, &vi);
printf("Opening '%s' returned status=0x%x\n", visaName, status);
// Get the manufacturer and model name
ViChar manfName[1024];
ViChar modelName[1024];
status = viGetAttribute(vi, VI_ATTR_MANF_NAME, manfName);
status = viGetAttribute(vi, VI_ATTR_MODEL_NAME, modelName);
printf(" Manufacturer Name: '%s'\n", manfName);
printf(" Model Name: '%s'\n", modelName);
ViUInt16 mapSpace = VI_PXI_BAR0_SPACE;
ViUInt32 memValue0;
ViUInt32 memValue1;
ViUInt32 memValueArray[4];
// viIn example
status = viIn32(vi, mapSpace, 0, &memValue0);
status = viIn32(vi, mapSpace, sizeof(ViUInt32) * 1, &memValue1);
printf(" viIn32 from BAR0 memory\n");
printf(" memValue0 = 0x%08x, memValue1 = 0x%08x\n", memValue0, memValue1);
// Show the default DMA value and set it to VI_TRUE so viMoveIn32 will use DMA if
// the device supports it.
ViBoolean allowDma;
status = viGetAttribute(vi, VI_ATTR_DMA_ALLOW_EN, &allowDma);
printf(" Current value of VI_ATTR_DMA_ALLOW_EN is %s\n",
(allowDma == VI_TRUE)? "VI_TRUE" : "VI_FALSE");
status = viSetAttribute(vi, VI_ATTR_DMA_ALLOW_EN, VI_TRUE);
status = viGetAttribute(vi, VI_ATTR_DMA_ALLOW_EN, &allowDma);
printf(" After setting it VI_ATTR_DMA_ALLOW_EN is %s\n",
(allowDma == VI_TRUE)? "VI_TRUE" : "VI_FALSE");
// viMoveIn example
status = viMoveIn32(vi, mapSpace, 0,
sizeof(memValueArray)/sizeof(memValueArray[0]),
memValueArray);
printf(" viMoveIn32 from BAR0 memory\n");
printf(" memValueArray = ");
for (int index = 0; index < sizeof(memValueArray)/sizeof(memValueArray[0]); index++)
{
printf("0x%08x ", memValueArray[index]);
}
printf("\n");
status = viClose(vi);
status = viClose(drm);
printf("\n");
}
void main()
{
VisaFindRsrc();
char *visaName = "pxi0::1-1.0::instr";
VisaLowLevelMemoryAccess(visaName);
VisaHighLevelMemoryAccess(visaName);
}