
针对 树莓派 封装的 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用中断应该怎么实现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)