logo资料库

反射内存卡收发示例及常用API说明.pdf

第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
资料共18页,剩余部分请下载后查看
http://www.vmic5565.com 反射内存卡收发示例及常用 API 说明
http://www.vmic5565.com 目录 一、 反射内存卡基本特征 .............................3 二、 中断式通信流程 .................................4 2.1 特点:.........................................4 2.2 注意事项:.....................................4 三、 代码 ...........................................5 3.1 收发一体的通信代码 .............................5 3.2 测试用代码段...................................6 3.3 常用 API......................................13
http://www.vmic5565.com 一、 反射内存卡基本特征 型号:vmipci-5565-11000 1. 板载内存 128MB ,地址空间:0x0 ~ 0x7FFFFFF 2. 4k FIFOs 3. Transmission Mode=Multimode 4. No Conformal Coating 保形[角]涂料
http://www.vmic5565.com 二、 中断式通信流程 RFM2gOpen RFM2gOpen RFM2gWrite RFM2gSendEvent RFM2gEnableEve nt RFM2gWaitForEven t RFM2gRead RFM2gClose RFM2gClose 图 1 中断式通信流程图 2.1 特点: 一、发送方和接收方通过事件进行同步,CPU 占用少; 二、发送方可以向多个指定的接收方发送数据,即1 对多方式;也可以实现广播方式。 2.2 注意事项: 1. 当接收方调用 RFM2gWaitForEvent 函数后,将挂起当前线程。直到有事件发生或 等待超时才能恢复,因此接收部分的代码应采用多线程编程;
http://www.vmic5565.com 2. RFM2gSendEvent 需要指定接收设备的 NodeID,该参数由板卡上的跳线决定(Each RFM2g device on an RFM2g network is uniquely identified by its node ID, which is manually set by jumpers on the device when the RFM2g network is installed. The driver determines the node ID when the device is initialized)。本机的 NodeID 可以通过 API RFM2gNodeID 获 取; 如果采 取 广播方式,则参数 NodeID 应指定为宏定 义 RFM2G_NODE_ALL; 3. 数据读写有两种方式:直接读写和内存映射。直接读写的相关函数有:RFM2gRead 和 RFM2gWrite 。内 存 映 射 的 相 关 函数有 : RFMUserMemory 和 RFMUnMapUserMemory。后者将板载内存按页(page)映射到程序的内存空间,对 映射内存的操作将直接反应到板载内存上。按照手册的解释:使用内存映射后,数 据的传输将使用 PIO 方式,不使用 DMA 方式。而直接读写函数的数据传输将尽可 能采取 DMA 方式。 三、 代码 3.1 收发一体的通信代码 (摘自例程 rfm2g_send.c,为便于理解,去掉了其中的错误处理代码): #include "rfm2g_windows.h" //屏蔽在 Vs2005 中编译时的警告 #include "rfm2g_api.h" //rfm API #define BUFFER_SIZE 256 // 缓冲区大小 256byte #define OFFSET_1 0x1000 // 写数据起始位置 4k #define OFFSET_2 0x2000 // 读数据起始位置 8k #define TIMEOUT 60000 // 超时时间 60s #define DEVICE_PREFIX "\\\\.\\rfm2g" //win 系统的 PCI 设备名前缀 RFM2G_STATUS result; // RFM2g API 调用的返回值,成功为 RFM2G_SUCCESS RFM2G_CHAR device[40]; // 完整的设备名由前缀和设备编号组成 RFM2GHANDLE Handle = 0; //设备操作句柄,由 RFM2gOpen 返回 //构造设备名,如"\\\\.\\rfm2g1" sprintf(device, "%s%d", DEVICE_PREFIX, numDevice); //打开设备 result = RFM2gOpen( device, &Handle ); //使网络中断可用。默认情况下,反射内存网的中断是不可用的,RFM2gEnableEvent 函数使得接收设备可以响应网络中断。如果发送方不需响应中断,则不必调用该函数 result = RFM2gEnableEvent( Handle, RFM2GEVENT_INTR2 ); //将数据写入反射内存卡的板载内存。 result = RFM2gWrite( Handle, OFFSET_1, (void *)outbuffer, BUFFER_SIZE*4 );
http://www.vmic5565.com /*在板载内存的有效范围之内,从第二个参数指定起始地址开始写入数据。写入的长度按 字节计算。 字长换算法则: 1 byte= 1 RFM2G_UINT8 1 word= 1 RFM2G_UINT16= 2* RFM2G_UINT8 1 long word= 1 RFM2G_UINT32= 4* RFM2G_UINT8 */ //发网络中断 result = RFM2gSendEvent( Handle, otherNodeId, RFM2GEVENT_INTR1, 0); //等待中断 RFM2GEVENTINFO EventInfo; EventInfo.Event = RFM2GEVENT_INTR2; //等待的网络中断类型 EventInfo.Timeout = TIMEOUT; // 等待多久即超时 result = RFM2gWaitForEvent( Handle, &EventInfo );//调用后程序挂起 //读数据.与 RFM2gWrite 函数类似,需要事先分配读取缓冲和指定读取数据的长度 result = RFM2gRead( Handle, OFFSET_2, (void *)inbuffer, BUFFER_SIZE*4); //关闭设备 RFM2gClose( &Handle ); //通用错误处理 if( result != RFM2G_SUCCESS ) { printf("Error: %s\n", RFM2gErrorMsg(result) ); RFM2gClose( &Handle ); return(result); } 3.2 测试用代码段 3.2.1 获取板卡配置信息 RFM2G_STATUS Status; RFM2GCONFIG Config; /* Get the board Configuration */ Status = RFM2gGetConfig( Handle, &Config ); if( Status != RFM2G_SUCCESS ) { printf( "Could not get the board Configuration.\n" );
http://www.vmic5565.com printf( "Error: %s.\n\n", RFM2gErrorMsg(Status)); return(-1); } /* Print board configuration */ printf (" Driver Part Number \"%s\"\n", Config.Name); printf (" Driver Version \"%s\"\n", Config.DriverVersion); printf (" Device Name \"%s\"\n", Config.Device); printf (" Board Instance %d\n", Config.Unit); printf (" Board ID 0x%02X\n", Config.BoardId); printf (" Node ID 0x%02X\n", Config.NodeId); printf (" Installed Memory %ud (0x%08X)\n", Config.MemorySize, Config.MemorySize); printf (" Memory Offset: "); switch (Config.Lcsr1 & 0x0030000 ) { case 0x00000000: printf ("0x00000000\n"); break; case 0x00010000: printf ("0x04000000\n"); break; case 0x00020000: printf ("0x08000000\n"); break; case 0x00030000: printf ("0x0c000000\n"); break; default: /* S/W Error */ printf("\n"); } printf (" Board Revision 0x%02X\n", Config.BoardRevision); printf (" PLX Revision 0x%02X\n", Config.PlxRevision); /* Display Board Configuration */
http://www.vmic5565.com printf (" Config.Lcsr1 0x%08x\n", Config.Lcsr1); printf("RFM2g Configuration:\n"); if (Config.Lcsr1 & 0x01000000) { printf (" Rogue Master 0 Enabled\n"); } if (Config.Lcsr1 & 0x02000000) { printf (" Rogue Master 1 Enabled\n"); } if (Config.Lcsr1 & 0x04000000) { printf (" Redundant Mode\n"); } else { printf (" Fast Mode\n"); } if (Config.Lcsr1 & 0x08000000) { printf (" Local Bus Parity Enabled\n"); } if (Config.Lcsr1 & 0x10000000) { printf (" Loopback Enabled\n"); } if (Config.Lcsr1 & 0x20000000) { printf (" Dark-on-Dark Enabled\n"); } if (Config.Lcsr1 & 0x40000000) { printf (" Transmitter Disabled\n"); } /* PCI Configuration Info */
分享到:
收藏