C#写电机驱动程序

前几天实验室做关于电机驱动的实验,用C#写的控制程序

程序如下:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.ComponentModel;
 4 using System.Data;
 5 using System.Drawing;
 6 using System.Linq;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using System.Windows.Forms;
10 using Sys;              //添加新的命名空间,PCI8620的命名空间
11 namespace WindowsFormsApplication3
12 {
13 public partial class Form1 : Form
14 {
15 IntPtr hDevice;
16 short DA;
17 double a;
18 byte[] ret = new byte[16];     //
19 public Form1()
20 {
21 InitializeComponent();
22 }
23
24 private void button1_Click(object sender, EventArgs e)
25 {
26 hDevice = PCI8620.PCI8620_CreateDevice(0);
27 button1.Enabled = false;             //button1和button2的互锁
28 button2.Enabled = true;              //button1和button2的互锁
29 timer1.Enabled = true;
30 }
31
32 private void button2_Click(object sender, EventArgs e)
33 {
34 PCI8620.PCI8620_ReleaseDevice(hDevice);
35 button1.Enabled = true;
36 button2.Enabled = false;
37 }
38
39 private void button3_Click(object sender, EventArgs e)
40 {
41 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, DA, 0);
42 }
43
44 private void button4_Click(object sender, EventArgs e)
45 {
46 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, 2048, 0);
47 }
48
49 private void textBox1_TextChanged(object sender, EventArgs e)
50 {
51 a = Convert.ToDouble(textBox1.Text);
52 DA = (short)(a / 20.00 * 4096 + 2048.00);
53 }
54
55 private void timer1_Tick(object sender, EventArgs e)
56 {
57 PCI8620.PCI8620_GetDeviceDI(hDevice, ret);
58 if(ret[7]==0)             //当电机驱动的直线行程模块到达左端的时候,有传感器把DA采集信号反馈到程序中,程序作出判断变向向右运动
59 {
60 a = Math.Abs(a);
61 DA = (short)(a / 20.00 * 4096 + 2048.00);
62 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, DA, 0);      //0x04在PCI8620中代表-10——10v的电压
63 }
64 if(ret[9]==0)           //同上,这是行程模模块到达右端的时候
65 {
66 a = -Math.Abs(a);
67 DA = (short)(a / 20.00 * 4096 + 2048.00);
68 PCI8620.PCI8620_WriteDeviceDA(hDevice, 0x04, DA, 0);
69 }
70 }
71 }
72 }

把PCI8620.cs添加到程序中

打开PCI8620板卡后程序才会取得对电机的控制指令,关闭后不再控制电机

在这里输入电压应该在-10-10之间,在程序中定义了0x04,,

PCI8620.cs程序如下:

using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices ;

namespace Sys
{
    public partial class PCI8620
    {
        //#################### AD硬件参数PCI8620_PARA_AD定义 #####################
        // 用于AD采样的实际硬件参数
        public struct PCI8620_PARA_AD
        {
            public Int32 ADMode;            // AD模式选择(连续/分组方式)
            public Int32 FirstChannel;      // 首通道[0,15]
            public Int32 LastChannel;       // 末通道[0,15],要求末通道必须大于或等于首通道
            public Int32 Frequency;         // 采集频率,单位为Hz, [31, 250000]
            public Int32 GroupInterval;     // 分组时的组间间隔(单位:微秒)[1, 419430]
            public Int32 LoopsOfGroup;        // 组内循环次数[1, 65535]
            public Int32 Gains;                // 增益设置
            public Int32 InputRange;        // 模拟量输入量程范围
            public Int32 TriggerMode;       // 触发模式选择
            public Int32 TriggerSource;        // 触发源选择
            public Int32 TrigLevelVolt;        // 触发电平(0~10000mV)
            public Int32 TriggerType;        // 触发类型
            public Int32 TriggerDir;        // 触发方向选择(正向/负向触发)
            public Int32 ClockSource;        // 时钟源选择(内/外时钟源)
            public Int32 bClockOutput;      // 允许时钟输出
            public Int32 GroundingMode;        // 接地模式
        }

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的ADMode所使用工作模式选项
        public const Int32 PCI8620_ADMODE_SEQUENCE        = 0x00; // 连续采样
        public const Int32 PCI8620_ADMODE_GROUP            = 0x01; // 分组采样

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的InputRange模拟量输入范围所使用的选项
        public const Int32 PCI8620_INPUT_N10000_P10000mV= 0x00; // ±10000mV
        public const Int32 PCI8620_INPUT_N5000_P5000mV    = 0x01; // ±5000mV
        public const Int32 PCI8620_INPUT_N2500_P2500mV    = 0x02; // ±2500mV
        public const Int32 PCI8620_INPUT_0_P10000mV        = 0x03; // 0~10000mV

        //***********************************************************
        // AD参数PCI8620_PARA_AD中的Gains使用的硬件增益选项
        public const Int32 PCI8620_GAINS_1MULT            = 0x00; // 1倍增益
        public const Int32 PCI8620_GAINS_2MULT            = 0x01; // 2倍增益
        public const Int32 PCI8620_GAINS_4MULT            = 0x02; // 4倍增益
        public const Int32 PCI8620_GAINS_8MULT            = 0x03; // 8倍增益

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的TriggerMode成员变量所使用触发模式选项
        public const Int32 PCI8620_TRIGMODE_SOFT        = 0x00; // 软件触发(属于内触发)
        public const Int32 PCI8620_TRIGMODE_POST        = 0x01; // 硬件触发(属于外触发)

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的TriggerSource触发源信号所使用的选项
        public const Int32 PCI8620_TRIGSRC_ATR            = 0x00; // 选择外部ATR作为触发源
        public const Int32 PCI8620_TRIGSRC_DTR            = 0x01; // 选择外部DTR作为触发源

        // AD硬件参数PCI8620_PARA_AD中的TriggerType触发类型所使用的选项
        public const Int32 PCI8620_TRIGTYPE_EDGE        = 0x00; // 边沿触发
        public const Int32 PCI8620_TRIGTYPE_PULSE        = 0x01; // 电平触发

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的TriggerDir触发方向所使用的选项
        public const Int32 PCI8620_TRIGDIR_NEGATIVE        = 0x00; // 负向触发(低电平/下降沿触发)
        public const Int32 PCI8620_TRIGDIR_POSITIVE        = 0x01; // 正向触发(高电平/上升沿触发)
        public const Int32 PCI8620_TRIGDIR_POSIT_NEGAT    = 0x02; // 正负向触发(高/低电平或上升/下降沿襦发)

        //***********************************************************
        // AD硬件参数PCI8620_PARA_AD中的ClockSource时钟源所使用的选项
        public const Int32 PCI8620_CLOCKSRC_IN            = 0x00; // 内部时钟
        public const Int32 PCI8620_CLOCKSRC_OUT            = 0x01; // 外部时钟

        // AD硬件参数PCI8620_PARA_AD中的bClockOutput成员变量所使用内部和外部时钟源选项
        public const Int32 PCI8620_CLOCKOUT_DISABLE        = 0x00; // 禁止本卡上的自带时钟向外输出
        public const Int32 PCI8620_CLOCKOUT_ENABLE        = 0x01; // 允许本卡上的自带时钟向外输出

        //***********************************************************
        // AD参数(PCI8620_PARA_AD)中的GroundingMode使用的模拟信号接地方式选项
        public const Int32 PCI8620_GNDMODE_SE            = 0x00;    // 单端方式(SE:Single end)
        public const Int32 PCI8620_GNDMODE_DI            = 0x01;    // 双端方式(DI:Differential)

        //*************************************************************************************
        // 用于AD采样的实际硬件参数
        public struct PCI8620_STATUS_AD
        {
            public Int32  bNotEmpty;            // 板载FIFO存储器的非空标志,=TRUE非空, = FALSE 空
            public Int32  bHalf;                // 板载FIFO存储器的半满标志,=TRUE半满以上, = FALSE 半满以下
            public Int32  bOverflow;            // 板载FIFO存储器的溢出标志,= TRUE已发生溢出, = FALSE 未发生溢出
        }

        public const Int32 PCI8620_MAX_SEGMENT_COUNT = 64;
        public struct PCI8620_STATUS_DMA
        {
            public Int32 iCurSegmentID;            // 当前段缓冲ID,表示DMA正在传输的缓冲区段
            public Int32 bSegmentSts0;
            public Int32 bSegmentSts1;
            public Int32 bSegmentSts2;
            public Int32 bSegmentSts3;
            public Int32 bSegmentSts4;
            public Int32 bSegmentSts5;
            public Int32 bSegmentSts6;
            public Int32 bSegmentSts7;
            public Int32 bSegmentSts8;
            public Int32 bSegmentSts9;
            public Int32 bSegmentSts10;
            public Int32 bSegmentSts11;
            public Int32 bSegmentSts12;
            public Int32 bSegmentSts13;
            public Int32 bSegmentSts14;
            public Int32 bSegmentSts15;
            public Int32 bSegmentSts16;
            public Int32 bSegmentSts17;
            public Int32 bSegmentSts18;
            public Int32 bSegmentSts19;
            public Int32 bSegmentSts20;
            public Int32 bSegmentSts21;
            public Int32 bSegmentSts22;
            public Int32 bSegmentSts23;
            public Int32 bSegmentSts24;
            public Int32 bSegmentSts25;
            public Int32 bSegmentSts26;
            public Int32 bSegmentSts27;
            public Int32 bSegmentSts28;
            public Int32 bSegmentSts29;
            public Int32 bSegmentSts30;
            public Int32 bSegmentSts31;
            public Int32 bSegmentSts32;
            public Int32 bSegmentSts33;
            public Int32 bSegmentSts34;
            public Int32 bSegmentSts35;
            public Int32 bSegmentSts36;
            public Int32 bSegmentSts37;
            public Int32 bSegmentSts38;
            public Int32 bSegmentSts39;
            public Int32 bSegmentSts40;
            public Int32 bSegmentSts41;
            public Int32 bSegmentSts42;
            public Int32 bSegmentSts43;
            public Int32 bSegmentSts44;
            public Int32 bSegmentSts45;
            public Int32 bSegmentSts46;
            public Int32 bSegmentSts47;
            public Int32 bSegmentSts48;
            public Int32 bSegmentSts49;
            public Int32 bSegmentSts50;
            public Int32 bSegmentSts51;
            public Int32 bSegmentSts52;
            public Int32 bSegmentSts53;
            public Int32 bSegmentSts54;
            public Int32 bSegmentSts55;
            public Int32 bSegmentSts56;
            public Int32 bSegmentSts57;
            public Int32 bSegmentSts58;
            public Int32 bSegmentSts59;
            public Int32 bSegmentSts60;
            public Int32 bSegmentSts61;
            public Int32 bSegmentSts62;
            public Int32 bSegmentSts63;
            public Int32 bBufferOverflow;        // 返回溢出状态
        } 

        //***********************************************************
        // DA输出函数WriteDeviceDA的模拟量输出范围参数OutputRange所使用的选项
        public const Int32 PCI8620_OUTPUT_0_P5000mV            = 0x00;        // 0~5000mV
        public const Int32 PCI8620_OUTPUT_0_P10000mV        = 0x01;        // 0~10000mV
        public const Int32 PCI8620_OUTPUT_0_P10800mV        = 0x02;        // 0~10800mV
        public const Int32 PCI8620_OUTPUT_N5000_P5000mV        = 0x03;        // ±5000mV
        public const Int32 PCI8620_OUTPUT_N10000_P10000mV    = 0x04;        // ±10000mV
        public const Int32 PCI8620_OUTPUT_N10800_P10800mV    = 0x05;        // ±10800mV

        //***********************************************************
        // 用于计数器CNT的参数
        // 硬件参数ControlMode控制字模式选项
        public const Int32 PCI8620_GATEMODE_POSITIVE_0    = 0x00;        // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数
                                                            // 计数结束产生中断:写入初值开始计数时OUT开始为0,当计数到0时OUT为1

        public const Int32 PCI8620_GATEMODE_RISING_1    = 0x01;        // COUNTER:GATE上边沿触发计数,计数中出现GATE上升沿重新装入初值计数
                                                            // 可编程单拍脉冲:当写入初值时OUT为1,当开始计数时OUT为0,当计数到0时OUT再次为1

        public const Int32 PCI8620_GATEMODE_POSITIVE_2    = 0x02;        // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数
                                                            // 频率发生器:计数期间OUT为1,计数到0后输出一个周期的0,并重新装入计数值计数

        public const Int32 PCI8620_GATEMODE_POSITIVE_3    = 0x03;        // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数
                                                            // 方波发生器:计数期间OUT为1,计数到0后输出一个周期的0,并重新装入计数值计数

        public const Int32 PCI8620_GATEMODE_POSITIVE_4    = 0x04;        // COUNTER:GATE高电平时计数,低电平时停止计数,计数时重新写入初值,按初值计数
                                                            // 软件触发选通:写入初值OUT为1, 计数结束OUT输出一个周期低电平信号

        public const Int32 PCI8620_GATEMODE_RISING_5    = 0x05;        // COUNTER:GATE上边沿触发计数,计数中出现GATE上升沿重新装入初值计数
                                                            // 硬件触发选通:写入初值OUT为1, 计数结束OUT输出一个周期低电平信号

        //***********************************************************
        // CreateFileObject所用的文件操作方式控制字(可通过或指令实现多种方式并操作)
        public const Int32 PCI8620_modeRead                    = 0x0000;    // 只读文件方式
        public const Int32 PCI8620_modeWrite                = 0x0001;    // 只写文件方式
        public const Int32 PCI8620_modeReadWrite            = 0x0002;    // 既读又写文件方式
        public const Int32 PCI8620_modeCreate                = 0x1000;    // 如果文件不存可以创建该文件,如果存在,则重建此文件,并清0
        public const Int32 PCI8620_typeText                    = 0x4000;    // 以文本方式操作文件

        //######################## 常规通用函数 #################################
        // 适用于本设备的最基本操作
        [DllImport("PCI8620_64.DLL")]
        public static extern IntPtr  PCI8620_CreateDevice(Int32 DeviceID );            // 创建设备对象

        [DllImport("PCI8620_64.DLL")]
        public static extern IntPtr  PCI8620_CreateDeviceEx(Int32 DevicePhysID );   // 用物理号创建设备对象

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDeviceCount(IntPtr hDevice);            // 取得设备总台数

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDeviceCurrentID(IntPtr hDevice,        // 取得当前设备相应的ID号
                                                        ref Int32 DeviceLgcID,
                                                        ref Int32 DevicePhysID);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ListDeviceDlg(IntPtr hDevice);            // 列表系统当中的所有的该PCI设备

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ReleaseDevice(IntPtr hDevice);            // 关闭设备,禁止传输,且释放资源

        //####################### AD数据读取函数 #################################
        // 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备
        // 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面的初始化设备和读取
        // AD数据两个函数便能轻松高效地实现高速、连续的数据采集
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_InitDeviceProAD(                                        // 初始化设备,当返回TRUE后,设备即刻开始传输.
                                                                IntPtr hDevice,                        // 设备对象
                                                                ref PCI8620_PARA_AD pADPara);        // 硬件参数, 它仅在此函数中决定硬件状态

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_StartDeviceProAD(                                        // 在初始化之后,启动设备
                                                                IntPtr hDevice);                    // 设备对象句柄

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ReadDeviceProAD_Npt(                                    // 用非空标志读取设备上的AD数据
                                                                IntPtr hDevice,                        // 设备句柄
                                                                UInt32[] ADBuffer,                // 将用于接受数据的用户缓冲区
                                                                UInt32 nReadSizeWords,                // 读入的数据长度
                                                                ref Int32 nRetSizeWords);            // 是否检测FIFO溢出状态(默认为不检测)

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDevStatusProAD(
                                                                IntPtr hDevice,                        // 设备句柄
                                                                ref PCI8620_STATUS_AD pADStatus);    // AD状态
        ///////////////////////////////////////////////////////////////////////
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ReadDeviceProAD_Half(                                    // FIFO半满读AD数据
                                                                IntPtr hDevice,                        // 设备句柄
                                                                UInt32[] ADBuffer,                // 将用于接受数据的用户缓冲区(该区必须开辟65536个字的空间)
                                                                Int32 nReadSizeWords,
                                                                ref Int32 nRetSizeWords);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_StopDeviceProAD(                                        // 在启动设备之后,暂停设备
                                                                IntPtr hDevice);                    // 设备对象句柄

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ReleaseDeviceProAD(                                        // 关闭AD设备,禁止传输,且释放资源
                                                                IntPtr hDevice);                    // 设备句柄

        //##################### AD数据读取函数(DMA方式)(上层用户函数) ###########################
        // AD直接内存(DMA)方式函数
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_InitDeviceDmaAD(                                        // 初始化设备,当返回TRUE后,设备即准备就绪.
                                                                IntPtr hDevice,                        // 设备对象,它由CreateDevice函数创建
                                                                IntPtr hDmaEvent,                    // DMA事件句柄,它由CreateSystemEvent创建
                                                                UInt32[,] ADBuffer,                    // 用户缓冲区,最好为两维数组
                                                                Int32 nReadSizeWords,                // 每次DMA时,用户从指定缓冲应读取的实际长度(要小于或等于nSegmentSizeWords)
                                                                Int32 nSegmentCount,                // 缓冲分段的数量,取值范围为2-64
                                                                Int32 nSegmentSizeWords,            // 缓冲区分段的段长(必须等于FIFO半满长度)
                                                                ref PCI8620_PARA_AD pADPara);        // 硬件参数, 它仅在此函数中决定硬件状态

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_StartDeviceDmaAD(IntPtr hDevice);                    // 设备对象句柄,它由CreateDevice函数创建

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_GetDevStatusDmaAD(                                        // 在AD采样过程中取得DMA的有关状态,返回值表示函数是否成功
                                                                IntPtr hDevice,                        // 设备句柄,它由CreateDevice函数创建
                                                                ref PCI8620_STATUS_DMA pDMAStatus); // 获得的DMA工作状态

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_SetDevStatusDmaAD(                                        // 在AD采样过程中设置DMA的有关状态,返回值表示函数是否成功
                                                                IntPtr hDevice,                        // 设备句柄,它由CreateDevice函数创建
                                                                Int32 iClrBufferID);                // 要清除的缓冲区ID,将其置为0

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_StopDeviceDmaAD(                                        // 在启动设备之后,暂停设备
                                                                IntPtr hDevice);                    // 设备对象句柄,它由CreateDevice函数创建

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_ReleaseDeviceDmaAD(                                        // 关闭AD设备,禁止传输,且释放资源
                                                                IntPtr hDevice);                    // 设备句柄,它由CreateDevice函数创建

        //################# AD的硬件参数操作函数 ########################
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_SaveParaAD(IntPtr hDevice,ref PCI8620_PARA_AD pADPara);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_LoadParaAD(IntPtr hDevice, ref PCI8620_PARA_AD pADPara);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_ResetParaAD(IntPtr hDevice, ref PCI8620_PARA_AD pADPara);

        //####################### DA数据输出函数 #################################
        // 适于大多数普通用户,这些接口最简单、最快捷、最可靠,让用户不必知道设备
        // 低层复杂的硬件控制协议和繁多的软件控制编程,仅用下面一个函数便能轻
        // 松实现高速、连续的DA数据输出

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_WriteDeviceDA(                                // 写DA数据
                                                            IntPtr hDevice,                // 设备对象句柄,它由CreateDevice函数创建
                                                            Int32 OutputRange,            // 输出量程,具体定义请参考上面的常量定义部分
                                                            Int16 nDAData,                // 输出的DA原始数据[0, 4095]
                                                            Int32 nDAChannel);            // DA输出通道[0, 3]    

        //####################### 计数器与定时器操作函数 #########################
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_SetDeviceCNT(                            // 设置计数器的初值
                                                            IntPtr hDevice,            // 设备对象句柄,它由CreateDevice函数创建
                                                            UInt32 ContrlMode,        // 计数器控制模式
                                                            UInt32 CNTVal,            // 计数初值, COUNTER: 计数初值,TIMER:延时初始脉冲宽度(16位)
                                                            UInt32 ulChannel);        // 宽度初值, COUNTER: 无效, TIMER:输出脉冲宽度(16位)

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDeviceCNT(                            // 取得各路计数器的当前计数值
                                                            IntPtr hDevice,            // 设备对象句柄,它由CreateDevice函数创建
                                                            ref UInt32  pCNTVal,    // 返回计数值
                                                            UInt32 ulChannel);  // 返回宽度值

        //####################### 数字I/O输入输出函数 #################################
        // 用户可以使用WriteRegisterULong和ReadRegisterULong等函数直接控制寄存器进行I/O
        // 输入输出,但使用下面两个函数更省事,它不需要您关心寄存器分配和位操作等,而只
        // 需象VB等语言的属性操作那么简单地实现各开关量通道的控制。
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_SetDeviceDO(                    // 输出开关量状态
                                                            IntPtr hDevice, // 设备句柄
                                                            Byte[] bDOSts);    // 开关状态

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_GetDeviceDI(                    // 取得开关量状态
                                                            IntPtr hDevice,    // 设备句柄
                                                            Byte[] bDISts);    // 开关状态    

        //################# 内存映射寄存器直接操作及读写函数 ########################
        // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的
        // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_GetDeviceBar(                            // 取得指定的指定设备寄存器组BAR地址
                                                            IntPtr hDevice,            // 设备对象句柄,它由CreateDevice函数创建
                                                            UInt32[] pulPCIBar);    // 返回PCI BAR所有地址,具体PCI BAR中有多少可用地址请看硬件说明书

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_GetDevVersion(                            // 取得指定的指定设备ID号的映射寄存器的线性基地址,返回设备总数
                                                            IntPtr hDevice,            // 设备对象句柄
                                                            ref UInt32 pulFmwVersion,    // 固件版本
                                                            ref UInt32 pulDriverVersion);    //  驱动版本

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WriteRegisterByte(                        // 往设备的映射寄存器空间指定端口写入单节字数据
                                                            IntPtr hDevice,            // 设备对象
                                                            UInt32 LinearAddr,        // 指定映射寄存器的线性基地址
                                                            UInt32 OffsetBytes,        // 相对于基地址的偏移位置
                                                            Byte Value);            // 往指定地址写入单字节数据(其地址由线性基地址和偏移位置决定)
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WriteRegisterWord(                        // 写双字节数据(其余同上)
                                                            IntPtr hDevice,
                                                            UInt32 LinearAddr,
                                                            UInt32 OffsetBytes,
                                                            UInt16 Value);
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WriteRegisterULong(                // 写四节字数据(其余同上)
                                                            IntPtr hDevice,
                                                            UInt32 LinearAddr,
                                                            UInt32 OffsetBytes,
                                                            UInt32 Value);
        [DllImport("PCI8620_64.DLL")]
        public static extern Byte  PCI8620_ReadRegisterByte(                // 读入单字节数据(其余同上)
                                                            IntPtr hDevice,
                                                            UInt32 LinearAddr,
                                                            UInt32 OffsetBytes);
        [DllImport("PCI8620_64.DLL")]
        public static extern UInt16  PCI8620_ReadRegisterWord(                // 读入双字节数据(其余同上)
                                                            IntPtr hDevice,
                                                            UInt32 LinearAddr,
                                                            UInt32 OffsetBytes);
        [DllImport("PCI8620_64.DLL")]
        public static extern UInt32  PCI8620_ReadRegisterULong(                // 读入四字节数据(其余同上)
                                                            IntPtr hDevice,
                                                            UInt32 LinearAddr,
                                                            UInt32 OffsetBytes);

        //################# I/O端口直接操作及读写函数 ########################
        // 适用于用户对本设备更直接、更特殊、更低层、更复杂的控制。比如根据特殊的
        // 控制对象需要特殊的控制流程和控制效率时,则用户可以使用这些接口予以实现。
        // 但这些函数主要适用于传统设备,如ISA总线、并口、串口等设备,不能用于本PCI设备
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WritePortByte(IntPtr hDevice, UInt32 nPort, Byte Value);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WritePortWord(IntPtr hDevice, UInt32 nPort, UInt16 Value);

        [DllImport("PCI8620_64.DLL")]
        public static extern Int32  PCI8620_WritePortULong(IntPtr hDevice, UInt32 nPort, UInt32 Value);

        [DllImport("PCI8620_64.DLL")]
        public static extern Byte    PCI8620_ReadPortByte(IntPtr hDevice, UInt32 nPort);

        [DllImport("PCI8620_64.DLL")]
        public static extern UInt16  PCI8620_ReadPortWord(IntPtr hDevice, UInt32 nPort);

        [DllImport("PCI8620_64.DLL")]
        public static extern UInt32  PCI8620_ReadPortULong(IntPtr hDevice, UInt32 nPort);

        //############################ 线程操作函数 ################################
        [DllImport("PCI8620_64.DLL")]
        public static extern IntPtr PCI8620_CreateSystemEvent();     // 创建内核系统事件对象
        [DllImport("PCI8620_64.DLL")]
        public static extern Int32 PCI8620_ReleaseSystemEvent(IntPtr hEvent); // 释放内核事件对象

    }
}
时间: 11-05

C#写电机驱动程序的相关文章

S3C2440 nor_flash驱动程序

20150418 S3C2440 nor_flash驱动程序 2015-04-18 Lover雪儿 和前面的nandflash差不多,我们此处来重新学习一下norflash驱动. 1 /* 2 * 参考 drivers\mtd\maps\Physmap.c 3 */ 4 5 #include <linux/module.h> 6 #include <linux/types.h> 7 #include <linux/kernel.h> 8 #include <lin

嵌入式系统最小驱动框架(类似linux驱动程序架构)

2010年就打算把linux里的驱动框架核心代码抠出来的,但是由于懒而且linux代码量大,一直下不了手.最近调试的intel curie里驱动架构也类似linux,代码就少多了,由于工作需要不得不梳理一下这一堆代码,今天花了一下午,把整个BSP部分的驱动核心抽离出来了,并且做了几个小sample. 最小驱动框架核心代码 1.设备管理 device.c #include <stdio.h> #include <stddef.h> #include <stdlib.h>

Linux 简单字符设备驱动程序 (自顶向下)

第零章:扯扯淡 特此总结一下写的一个简单字符设备驱动程序的过程,我要强调一下“自顶向下”这个介绍方法,因为我觉得这样更容易让没有接触过设备驱动程序的童鞋更容易理解,“自顶向下”最初从<计算机网络 自顶向下方法>这本书学到的,我觉得有时候这是一种很好的方式. 第一章:测试程序 咦?你怎么跟别人的思路不一样???自顶向下嘛,我就直接从测试程序来说啦,这样那个不是更熟悉吗?看看下面的测试程序的代码,是不是很熟悉? 1 #include <stdio.h> 2 #include <u

C语言经典面试题目(转的,不过写的的确好!)

第一部分:基本概念及其它问答题 1.关键字static的作用是什么? 这个简单的问题很少有人能回答完全.在C语言中,关键字static有三个明显的作用: 1). 在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变. 2). 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问.它是一个本地的全局变量. 3). 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用.那就是,这个函数被限制在声明它的模块的本地范围内使用. 大多

2.制作第一个驱动程序

先讲解驱动框架,然后写出first_drv驱动程序,来打印一些信息 写出first_drv驱动程序需要以下几步: (1)写出驱动程序first_drv_open first_drv_write (2)需要定义file_operations结构体来封装驱动函数first_drv_open first_drv_write 对于字符设备来说,常用file_operations以下几个成员: (3)  模块加载函数,通过函数 register_chrdev(major, "first_drv"

IIC设备驱动程序

IIC设备是一种通过IIC总线连接的设备,由于其简单性,被广泛引用于电子系统中.在现代电子系统中,有很多的IIC设备需要进行相互之间通信 IIC总线是由PHILIPS公司开发的两线式串行总线,用于连接微处理器和外部IIC设备.IIC设备产生于20世纪80年代,最初专用与音频和视频设备,现在在各种电子设备中都广泛应用 IIC总线有两条总线线路,一条是串行数据线(SDA),一条是串行时钟线(SCL).SDA负责数据传输,SCL负责数据传输的时钟同步.IIC设备通过这两条总线连接到处理器的IIC总线控

i2c驱动程序全面分析,从adapter驱动程序到设备驱动程序

开发板    :mini2440 内核版本:linux2.6.32.2 驱动程序参考:韦东山老师毕业班i2c 内容概括: 1.adapter client 简介 2.adapter 驱动框架 2.1 设备侧 2.2 驱动侧 2.2.1 probe 函数 2.2.1.1 注册adapter new_device del_device board_info i2c_detect i2c_new_device 3.i2c 设备驱动框架 3.1 i2c_bus_type 3.2 i2c_driver 3

用DriverStudio开发USB驱动程序

很多写Windows Device Driver的开发人员基本上都是使用Windows DDK进行开发的.但是,现在也有不少人都开始借助一些辅助工具.笔者去年开始接触到DriverStudio,发现它真的是一个不错的开发工具,不仅写代码的时候思路清晰,而且和DDK的结合很好. 当然,也有很多人觉得用DriverStudio不够正宗,或者说不能很好的理解Windows Device Driver的架构.我感觉这就有点像MFC和SDK的关系,关于这个问题在很多地方都有争论,比如在万千新闻组上,就讨论

15年5月嵌入式学习笔记之驱动程序

poll机制(查询机制),隔一段时间查询-下有没有中断. 第四个驱动程序增加poll机制. 应用程序里面open() 函数,read() 函数,write ()函数,poll() 函数分别对应drv_open(),drv_read(),drv_write(),drv_poll()函数. 读取按键的多种方式, 1.查询方式,耗资源. 2.中断方式,如果没有按键按下,read()函数一直等待,永远不会返回. 3.poll机制,指定-段时间后返回. 这三种方法有-个共同的特点,都是应用程序主动去查询.