用C#怎么写UART、SPI、I2C、CAN总线上测试时的数据程序

用C#怎么写UART、SPI、I2C、CAN总线上测试时的数据程序,第1张

针对 树莓派 封装的 UWP应用 类,以下代码未经测试,聊以抛砖引玉:

using System;

using SystemCollectionsGeneric;

using SystemLinq;

using SystemText;

using SystemThreadingTasks;

using WindowsDevicesGpio;

using WindowsStorageStreams;

using WindowsDevicesEnumeration;

using WindowsDevicesSerialCommunication;

using WindowsDevicesI2c;

using WindowsDevicesSpi;

namespace SlotAgentAppServices

{

public class DevicesHelper

{

public static void GPIO(int eLevel=0, int ioPortNumber = 5)

{

// 获得系统板载缺省GPIO controller

GpioController gpio = GpioControllerGetDefault();

if (gpio == null)

return; // 如果系统板载无可用GPIO,则返回

// 打开指定的GPIO

using (GpioPin pin = gpioOpenPin(ioPortNumber))

{

// Latch HIGH value first This ensures a default value when the pin is set as output

pinWrite(eLevel==0 GpioPinValueLow: GpioPinValueHigh);

// 设置IO为输出方向

pinSetDriveMode(GpioPinDriveModeOutput);

} //关闭 pin - will revert to its power-on state

}

#region 示例代码

/

(一)GPIO接口使用

/

public void GPIO()

{

// Get the default GPIO controller on the system

GpioController gpio = GpioControllerGetDefault();

if (gpio == null)

return; // GPIO not available on this system

// Open GPIO 5

using (GpioPin pin = gpioOpenPin(5))

{

// Latch HIGH value first This ensures a default value when the pin is set as output

pinWrite(GpioPinValueHigh);

// Set the IO direction as output

pinSetDriveMode(GpioPinDriveModeOutput);

} // Close pin - will revert to its power-on state

}

/

(二) UART接口

Pin 8 - UART0 TX

Pin 10- UART0 RX

下面的例子先是初始化UART0,然后做了一次读 *** 作和一次写 *** 作

/

public async void Serial()

{

string aqs = SerialDeviceGetDeviceSelector("UART0"); / Find the selector string for the serial device /

var dis = await DeviceInformationFindAllAsync(aqs); / Find the serial device with our selector string /

SerialDevice SerialPort = await SerialDeviceFromIdAsync(dis[0]Id); / Create an serial device with our selected device /

/ Configure serial settings /

SerialPortWriteTimeout = TimeSpanFromMilliseconds(1000);

SerialPortReadTimeout = TimeSpanFromMilliseconds(1000);

SerialPortBaudRate = 9600;

SerialPortParity = SerialParityNone;

SerialPortStopBits = SerialStopBitCountOne;

SerialPortDataBits = 8;

/ Write a string out over serial /

string txBuffer = "Hello Serial";

DataWriter dataWriter = new DataWriter();

dataWriterWriteString(txBuffer);

uint bytesWritten = await SerialPortOutputStreamWriteAsync(dataWriterDetachBuffer());

/ Read data in from the serial port /

const uint maxReadLength = 1024;

DataReader dataReader = new DataReader(SerialPortInputStream);

uint bytesToRead = await dataReaderLoadAsync(maxReadLength);

string rxBuffer = dataReaderReadString(bytesToRead);

}

/

使用上面的例子时,需要在Packageappxmanifest 中修改下权限修改如下

<Capabilities>

<DeviceCapability Name="serialcommunication">

<Device Id="any">

<Function Type="name:serialPort" />

</Device>

</DeviceCapability>

</Capabilities>

/

/

(三)I2C 总线

Pin 3 - I2C1 SDA

Pin 5 - I2C1 SCL

下面的例子首先初始化I2C1 然后向地址为0x40的I2C设备写数据

/

public async void I2C()

{

// Get a selector string for bus "I2C1"

string aqs = I2cDeviceGetDeviceSelector("I2C1");

// Find the I2C bus controller with our selector string

var dis = await DeviceInformationFindAllAsync(aqs);

if (disCount == 0)

return; // bus not found

// 0x40 is the I2C device address

var settings = new I2cConnectionSettings(0x40);

// Create an I2cDevice with our selected bus controller and I2C settings

using (I2cDevice device = await I2cDeviceFromIdAsync(dis[0]Id, settings))

{

byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };

deviceWrite(writeBuf);

}

}

/

(四) SPI 总线

Pin 19 - SPI0 MOSI

Pin 21 - SPI0 MISO

Pin 23 - SPI0 SCLK

Pin 24 - SPI0 CS0

Pin 26 - SPI0 CS1

下面的例子向SPI0 做了一次写 *** 作

/

public async void SPI()

{

// Get a selector string for bus "SPI0"

string aqs = SpiDeviceGetDeviceSelector("SPI0");

// Find the SPI bus controller device with our selector string

var dis = await DeviceInformationFindAllAsync(aqs);

if (disCount == 0) ;

return; // "SPI0" not found on this system

// Use chip select line CS0

var settings = new SpiConnectionSettings(0);

// Create an SpiDevice with our bus controller and SPI settings

using (SpiDevice device = await SpiDeviceFromIdAsync(dis[0]Id, settings))

{

byte[] writeBuf = { 0x01, 0x02, 0x03, 0x04 };

deviceWrite(writeBuf);

}

}

#endregion

}

}

这是我复制的,一搜一大堆

#include <reg52h>

sbit SPI_DI =P0^1; //MMC数据输入

sbit SPI_DO =P0^0;//MMC数据输出,可不接

sbit SPI_SCL=P0^2;//时钟线

void Write_Byte(unsigned char value)

{

unsigned char i;

for (i=0;i<8;i++)

{

if (((value>>(7-i))&0x01)==0x01)

SPI_DI=1;

else SPI_DI=0;

SPI_SCL=0;

delay(5);

//必须要加延时,否则会因为 *** 作太快而不响应。

SPI_SCL=1;

delay(5);

//必须要加延时,否则会因为 *** 作太快而不响应。

}

}

unsigned char Read_Byte()

{

unsigned char temp=0;

unsigned char i;

for (i=0;i<8;i++)

{

SPI_DO=1;

SPI_SCL=0;

delay(5);

temp=(temp<<1)+(unsigned char)SPI_DO;

SPI_SCL=1;

delay(5);

}

return (temp);

}

配置SPI硬件等。

1、配置SPI硬件:首先需要配置SPI硬件,包括时钟、数据位宽、传输模式等参数,可以使用RT-Thread提供的SPI驱动框架,或者自行编写SPI驱动程序

2、配置中断:在SPI传输过程中,可以使用中断来处理数据的接收和发送,需要配置中断,包括中断优先级、中断服务函数等参数,可以使用RT-Thread提供的中断管理框架,或者自行编写中断服务程序。

3、编写SPI驱动程序:在SPI驱动程序中,需要实现SPI数据的发送和接收功能,可以使用RT-Thread提供的SPI驱动框架,或者自行编写SPI驱动程序,在SPI驱动程序中,需要使用中断服务函数来处理数据的接收和发送。

4、编写应用程序:在应用程序中,可以使用SPI驱动程序来进行数据的传输,可以使用RT-Thread提供的SPI应用程序接口,或者自行编写应用程序,在应用程序中,需要使用RT-Thread提供的线程管理框架来实现多线程 *** 作。

这是 读写pcf2127a的程序。用spi接口。

cpu 是51兼容系列 cy7c68013

#define spi_read 0x20

#define spi_write 0xa0

void spi_start(void)

{ OEE|=spi_ce+spi_di+spi_clk;

OEE &= ~spi_do;

SYNCDELAY;

IOE&=~(spi_ce|spi_clk);

SYNCDELAY;

}

void spi_stop(void)

{

IOE |=spi_ce;

SYNCDELAY;

}

void spi_wr(unsigned char command)

{

char i;

for (i=0;i<8;i++)

{

if((command&0x80)==0x80) {IOE |=spi_di;}else {IOE &=~spi_di;}

command<<=1;

SYNCDELAY;

IOE |=spi_clk;

SYNCDELAY;

IOE &=~spi_clk;

SYNCDELAY;

SYNCDELAY;

}

}

unsigned char spi_rd(void)

{

unsigned char bret;

char i;

bret=0;

for (i=0;i<8;i++)

{IOE |=spi_clk;

bret<<=1;

SYNCDELAY;

SYNCDELAY;

if((IOE&spi_do)==spi_do){ bret++;}

IOE &= ~spi_clk;

SYNCDELAY;

SYNCDELAY;

}

return bret;

}

void spi_writedata(unsigned char address,unsigned char command)

{

address&=0x1f;

address|=0x20;

spi_start();

spi_wr(address);

SYNCDELAY;

spi_wr(command);

spi_stop();

}

unsigned char spi_readdata(unsigned char address)

{unsigned char bret;

address&=0x1f;

address |=0xa0;

spi_start();

spi_wr(address);

SYNCDELAY;

bret=spi_rd();

spi_stop();

return bret;

}

void read_time(unsigned char address)

{spi_start();

spi_wr(address|0xa0);

EP0BUF[8] =spi_rd();//秒

EP0BUF[9]= spi_rd();//分

EP0BUF[10]= spi_rd();//时

EP0BUF[11]= spi_rd();//日

EP0BUF[12]= spi_rd();

hEP0BUF[13]= spi_rd();//月

EP0BUF[14]= spi_rd();//年

spi_stop();

}

void write_ram(unsigned int address,unsigned int command)

{unsigned char addh,addl,commandh,commandl;

addh=(address&0xff00)>>8;

addl=address&0x00ff;

commandh=(command&0xff00)>>8;

commandl=command&0x00ff;

spi_writedata(0x1a,addh);

spi_writedata(0x1b,addl);

spi_writedata(0x1c,commandh);

spi_writedata(0x1c,commandl);

}

unsigned int read_ram(unsigned int address)

{

unsigned char addh,addl,commandh,commandl;

unsigned int command;

addh=(address&0xff00)>>8;

addl=address&0x00ff;

spi_writedata(0x1a,addh);

spi_writedata(0x1b,addl);

commandl=spi_readdata(0x1d);

commandh=spi_readdata(0x1d);

command=(commandh<<8)+commandl;

return command;

}

这种SPI程序用51单片机的I/O口线很好模拟的,仔细看芯片的文档,下面这个是用在NRF905的:uchar bdata DATA_BUF;sbit flag =DATA_BUF^7;sbit flag1 =DATA_BUF^0;////function SpiWrite();void SpiWrite(uchar byte){ uchar i; DATA_BUF=byte; // Put function's parameter into a bdata variable for (i=0;i<8;i++) // Setup byte circulation bits { if (flag) // Put DATA_BUF7 on data line MOSI_nRF905=1; else MOSI_nRF905=0; SCK=1; // Set clock line high DATA_BUF=DATA_BUF<<1; // Shift DATA_BUF SCK=0; // Set clock line low } MOSI_nRF905=1;}////function SpiRead();uchar SpiRead(void){ uchar i; for (i=0;i<8;i++) // Setup byte circulation bits { DATA_BUF=DATA_BUF<<1; // Right shift DATA_BUF SCK=1; // Set clock line high if (MISO_nRF905) flag1=1; // Read data else flag1=0; SCK=0; // Set clock line low } MISO_nRF905=1; return DATA_BUF; // Return function parameter}

以上就是关于用C#怎么写UART、SPI、I2C、CAN总线上测试时的数据程序全部的内容,包括:用C#怎么写UART、SPI、I2C、CAN总线上测试时的数据程序、写一个51单片机模拟SPI总线的代码、rtthread适配spi用中断应该怎么实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10129940.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存