You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

452 lines
24 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace USB2XXX
{
class USB2SPI
{
//定义SPI通道
public const Int32 SPI1 = (0x00);
public const Int32 SPI1_CS0 = (0x00);
public const Int32 SPI1_CS1 = (0x10);
public const Int32 SPI1_CS2 = (0x20);
public const Int32 SPI1_CS3 = (0x30);
public const Int32 SPI1_CS4 = (0x40);
public const Int32 SPI2 = (0x01);
public const Int32 SPI2_CS0 = (0x01);
public const Int32 SPI2_CS1 = (0x11);
public const Int32 SPI2_CS2 = (0x21);
public const Int32 SPI2_CS3 = (0x31);
public const Int32 SPI2_CS4 = (0x41);
//定义工作模式
public const Byte SPI_MODE_HARD_FDX = 0; //硬件控制(全双工模式)
public const Byte SPI_MODE_HARD_HDX = 1; //硬件控制(半双工模式)
public const Byte SPI_MODE_SOFT_HDX = 2; //软件控制(半双工模式)
public const Byte SPI_MODE_SOFT_ONE_WIRE = 3; //单总线模式数据线输入输出都为MOSI
//定义主从机模式
public const Byte SPI_MASTER = 1; //主机
public const Byte SPI_SLAVE = 0; //从机
//定义数据移位方式
public const Byte SPI_MSB = 0; //高位在前
public const Byte SPI_LSB = 1; //低位在前
//定义片选输出极性
public const Byte SPI_SEL_LOW = 0; //片选输出低电平
public const Byte SPI_SEL_HIGH = 1; //片选输出高电平
//定义函数返回错误代码
public const Int32 SPI_SUCCESS = (0); //函数执行成功
public const Int32 SPI_ERR_NOT_SUPPORT = (-1); //适配器不支持该函数
public const Int32 SPI_ERR_USB_WRITE_FAIL = (-2); //USB写数据失败
public const Int32 SPI_ERR_USB_READ_FAIL = (-3); //USB读数据失败
public const Int32 SPI_ERR_CMD_FAIL = (-4); //命令执行失败
public const Int32 SPI_ERR_PARAMETER = (-5); //参数错误
//定义从机模式下连续读取数据的回调函数
public delegate Int32 SPI_GET_DATA_HANDLE(Int32 DevHandle, Int32 SPIIndex, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 3)]Byte[] pData, Int32 DataNum);//接收数据回掉函数
//定义初始化SPI的数据类型
public struct SPI_CONFIG
{
public Byte Mode; //SPI控制方式:0-硬件控制(全双工模式),1-硬件控制半双工模式2-软件控制(半双工模式),3-单总线模式数据线输入输出都为MOSI
public Byte Master; //主从选择控制:0-从机1-主机
public Byte CPOL; //时钟极性控制:0-SCK空闲时为低电平1-SCK空闲时为高电平
public Byte CPHA; //时钟相位控制:0-第一个SCK时钟采样1-第二个SCK时钟采样
public Byte LSBFirst; //数据移位方式:0-MSB在前1-LSB在前
public Byte SelPolarity; //片选信号极性:0-低电平选中1-高电平选中
public UInt32 ClockSpeedHz; //SPI时钟频率:单位为HZ硬件模式下最大50000000最小390625频率按2的倍数改变
}
//定义SPI Flash器件配置参数数据类型
public struct SPI_FLASH_CONFIG
{
public Byte CMD_WriteEnable; //使能写命令
public Byte CMD_WriteDisable; //禁止写命令
public Byte CMD_WritePage; //写数据命令
public Byte WritePageAddressBytes; //写数据时的地址宽度,单位为字节
public Byte CMD_EraseSector; //扇区擦出命令
public Byte EraseSectorAddressBytes; //扇区擦出的地址宽度,单位为字节
public Byte CMD_EraseBulk; //块擦出命令
public Byte CMD_EraseChip; //整片擦出命令
public Byte CMD_ReadID; //读芯片ID命令
public Byte CMD_ReadData; //读数据命令
public Byte ReadDataAddressBytes; //读数据时的地址宽度,单位为字节
public Byte CMD_ReadFast; //快速模式读数据命令
public Byte ReadFastAddressBytes; //快速读数据时的地址宽度,单位为字节
public Byte CMD_ReadStatus; //读取状态寄存器命令
public Byte CMD_WriteStatus; //写状态寄存器命令
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public Byte[] ID; //芯片ID存储数组
public Byte ID_Length; //ID长度单位为字节
public Int32 PageSize; //页大小,单位为字节
public Int32 NumPages; //芯片总的页数
public Int32 SectorSize; //扇区大小,单位为字节
}
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pConfig SPI
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_Init(Int32 DevHandle,Int32 SPIIndex, ref SPI_CONFIG pConfig);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param WriteLen
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_WriteBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 WriteLen);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param WriteLen
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_WriteBytesAsync(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 WriteLen);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pReadData
* @param ReadLen
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_ReadBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pReadData,Int32 ReadLen);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param WriteLen
* @param pReadData
* @param ReadLen
* @param IntervalTime
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_WriteReadBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 WriteLen,Byte[] pReadData,Int32 ReadLen,Int32 IntervalTimeUs);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param WriteLen
* @param EventPin GPIO
* @param EventType 0x00-0x11-0x10-沿0x01沿
* @param TimeOutOfMs
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_WriteBytesOfEvent(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 WriteLen,Int32 EventPin,Byte EventType,Int32 TimeOutOfMs);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pReadData
* @param ReadLen
* @param EventPin GPIO
* @param EventType 0x00-0x11-0x10-沿0x01沿
* @param TimeOutOfMs
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_ReadBytesOfEvent(Int32 DevHandle,Int32 SPIIndex,Byte[] pReadData,Int32 ReadLen,Int32 EventPin,Byte EventType,Int32 TimeOutOfMs);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param WriteLen
* @param pReadData
* @param ReadLen
* @param IntervalTime
* @param EventPin GPIO
* @param EventType 0x00-0x11-0x10-沿0x01沿
* @param TimeOutOfMs
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_WriteReadBytesOfEvent(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 WriteLen,Byte[] pReadData,Int32 ReadLen,Int32 IntervalTimeUs,Int32 EventPin,Byte EventType,Int32 TimeOutOfMs);
/**
* @brief bit
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteBitStr "100110011"
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_WriteBits(Int32 DevHandle,Int32 SPIIndex,StringBuilder pWriteBitStr);
/**
* @brief bit
* @param DevHandle
* @param SPIIndex SPI01
* @param pReadBitStr "100110011"
* @param ReadBitsNum bit
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_ReadBits(Int32 DevHandle,Int32 SPIIndex,StringBuilder pReadBitStr,Int32 ReadBitsNum);
/**
* @brief bit
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteBitStr "100110011"
* @param pReadBitStr "100110011"
* @param ReadBitsNum bit
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_WriteReadBits(Int32 DevHandle,Int32 SPIIndex,StringBuilder pWriteBitStr,StringBuilder pReadBitStr,Int32 ReadBitsNum);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param WriteLen
* @param TimeOutMs 0
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_SlaveWriteBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 WriteLen,Int32 TimeOutMs);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pReadData
* @param pReadLen
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_SlaveReadBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pReadData,Int32 ReadLen,Int32 TimeOutMs);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param pReadData
* @param pReadReadLen
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_SlaveWriteReadBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 WriteDataLen,Byte[] pReadData,Int32 ReadDataLen,Int32 TimeOutMs);
/**
* @brief SPI,SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pSlaveReadDataHandle
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_SlaveContinueRead(Int32 DevHandle,Int32 SPIIndex,SPI_GET_DATA_HANDLE pSlaveReadDataHandle);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @param pReadData
* @param BufferSize
* @retval
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_SlaveGetBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pReadData,Int32 BufferSize);
/**
* @brief SPI
* @param DevHandle
* @param SPIIndex SPI01
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_SlaveContinueWriteReadStop(Int32 DevHandle,Int32 SPIIndex);
/**
* @brief SPI-Flash
* @param DevHandle
* @param SPIIndex SPI01
* @param ClockSpeed SPIHz,50MHz
* @param pConfig SPI-Flash
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_FlashInit(Int32 DevHandle,Int32 SPIIndex,Int32 ClockSpeed, ref SPI_FLASH_CONFIG pConfig);
/**
* @brief SPI-FlashID
* @param DevHandle
* @param SPIIndex SPI01
* @param pID IDSPI_FLASH_CONFIGID_Length
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_FlashReadID(Int32 DevHandle,Int32 SPIIndex,Byte[] pID);
/**
* @brief SPI-Flash
* @param DevHandle
* @param SPIIndex SPI01
* @param StartSector
* @param NumSector
* @param TimeOutMs
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_FlashEraseSector(Int32 DevHandle,Int32 SPIIndex,Int32 StartSector,Int32 NumSector,Int32 TimeOutMs);
/**
* @brief SPI-Flash
* @param DevHandle
* @param SPIIndex SPI01
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_FlashEraseChip(Int32 DevHandle,Int32 SPIIndex);
/**
* @brief SPI-Flash
* @param DevHandle
* @param SPIIndex SPI01
* @param StartAddr
* @param pWriteData
* @param WriteLen
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_FlashWrite(Int32 DevHandle,Int32 SPIIndex,Int32 StartAddr,Byte[] pWriteData,Int32 WriteLen);
/**
* @brief SPI-Flash
* @param DevHandle
* @param SPIIndex SPI01
* @param StartAddr
* @param pReadData
* @param ReadLen
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_FlashRead(Int32 DevHandle,Int32 SPIIndex,Int32 StartAddr,Byte[] pReadData,Int32 ReadLen);
/**
* @brief SPI-Flash
* @param DevHandle
* @param SPIIndex SPI01
* @param StartAddr
* @param pReadData
* @param ReadLen
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_FlashReadFast(Int32 DevHandle,Int32 SPIIndex,Int32 StartAddr,Byte[] pReadData,Int32 ReadLen);
/**
* @brief Block
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param BlockSize
* @param BlockNum
* @param IntervalTime
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_BlockWriteBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 BlockSize,Int32 BlockNum,Int32 IntervalTimeUs);
/**
* @brief Block
* @param DevHandle
* @param SPIIndex SPI01
* @param pReadData
* @param BlockSize
* @param BlockNum
* @param IntervalTime
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_BlockReadBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pReadData,Int32 BlockSize,Int32 BlockNum,Int32 IntervalTimeUs);
/**
* @brief Block
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param WriteBlockSize
* @param pReadData
* @param ReadBlockSize
* @param BlockNum
* @param IntervalTime
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_BlockWriteReadBytes(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 WriteBlockSize,Byte[] pReadData,Int32 ReadBlockSize,Int32 BlockNum,Int32 IntervalTimeUs);
/**
* @brief Block
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param BlockSize
* @param BlockNum
* @param EventPin GPIO
* @param EventType 0x00-0x11-0x10-沿0x01沿
* @param TimeOutOfMs
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_BlockWriteBytesOfEvent(Int32 DevHandle, Int32 SPIIndex, Byte[] pWriteData, Int32 BlockSize, Int32 BlockNum, Int32 EventPin, Byte EventType, Int32 TimeOutOfMs);
/**
* @brief Block
* @param DevHandle
* @param SPIIndex SPI01
* @param pReadData
* @param BlockSize
* @param BlockNum
* @param EventPin GPIO
* @param EventType 0x00-0x11-0x10-沿0x01沿
* @param TimeOutOfMs
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_BlockReadBytesOfEvent(Int32 DevHandle,Int32 SPIIndex,Byte[] pReadData,Int32 BlockSize,Int32 BlockNum,Int32 EventPin,Byte EventType,Int32 TimeOutOfMs);
/**
* @brief Block
* @param DevHandle
* @param SPIIndex SPI01
* @param pWriteData
* @param WriteBlockSize
* @param pReadData
* @param ReadBlockSize
* @param BlockNum
* @param EventPin GPIO
* @param EventType 0x00-0x11-0x10-沿0x01沿
* @param TimeOutOfMs
* @retval 0
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_BlockWriteReadBytesOfEvent(Int32 DevHandle,Int32 SPIIndex,Byte[] pWriteData,Int32 WriteBlockSize,Byte[] pReadData,Int32 ReadBlockSize,Int32 BlockNum,Int32 EventPin,Byte EventType,Int32 TimeOutOfMs);
}
}