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#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @retval 函数执行状态小于0函数执行出错
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_SlaveContinueWriteReadStop(Int32 DevHandle,Int32 SPIIndex);
/**
* @brief 读写SPI-Flash初始化配置
* @param DevHandle 设备句柄
* @param SPIIndex SPI通道号取值0或者1
* @param ClockSpeed SPI时钟信号频率单位为Hz,最大为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-Flash芯片的ID号
* @param DevHandle 设备句柄
* @param SPIIndex SPI通道号取值0或者1
* @param pID 芯片ID号存储首地址其长度由SPI_FLASH_CONFIG中的ID_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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @retval 函数执行状态小于0函数执行出错
*/
[DllImport("USB2XXX.dll")]
public static extern Int32 SPI_FlashEraseChip(Int32 DevHandle,Int32 SPIIndex);
/**
* @brief 向SPI-Flash写数据
* @param DevHandle 设备句柄
* @param SPIIndex SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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 SPI通道号取值0或者1
* @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);
}
}