博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在.Net Micro Framework中访问硬件 - part2
阅读量:5995 次
发布时间:2019-06-20

本文共 2964 字,大约阅读时间需要 9 分钟。

相关文章

 

在.Net Micro Framework中访问硬件 - part2

 

摘要:本文介绍了.Net Micro Framework中对硬件的简单而独特的访问方式。涉及I2C,SPI等。通过简明的例程说明了如何在.Net MF中创建并访问I2C和SPI设备

Keywords:
.Net Micro framework, I2C, SPI, Embedded, C#

 

I²C Bus

尽管MCU采用I²CInter-Integrated Circuit)总线的方式与外设通信会比很多其他总线系统要慢(最高100kbps),但是由于其成本低,对可插拔的设备支持较好,在很多场合它仍是作为标准的feature得到支持。

那么如何在.Net Micro Framework中访问I2C方式连接的设备呢?

.Net MF提供了一个Microsoft.SPOT.Hardware.I2CDevice的类来实现访问IIC设备的功能。首先,你需要为每个IIC设备创建一个I2CDevice的实例,和之前提到的SerialPort类似的,你需要为它的构造函数传入一个I2CDevice.Configuration的配置对象。在这个配置对象里面你需要指定该设备的地址和通信速度(khz)。接着,你需要创建一组事务对象(CreateReadTransactionCreateWriteTransaction)来进行读写操作,具体的事务类型自然是取决于你的具体组件的作用了。当你创建事务时,你需要传入一个待读()的缓冲区。

然后,你需要把这组事务以数组的形式传递给Execute方法供执行并开始进行通信。Execute方法将会在所有事务执行完毕或者方法超时的时候返回。

下面的代码演示了如何对地址编号为58I2C设备进行通信。

 

using
 System;
using
 Microsoft.SPOT;
using
 Microsoft.SPOT.Hardware;
namespace
 I2CSample
ExpandedBlockStart.gifContractedBlock.gif
{
public class Program
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif
{
I2CDevice.Configuration config 
=
new I2CDevice.Configuration(
58//地址号
100 //100khz的时钟频率
);
I2CDevice device 
= new I2CDevice(config);
ExpandedSubBlockStart.gifContractedSubBlock.gif
byte[] outBuffer = new byte[] 0xAA }//待写buffer
byte[] inBuffer = new byte[4];//待读buffer
I2CDevice.I2CWriteTransaction writeTransaction 
=
device.CreateWriteTransaction(outBuffer);
I2CDevice.I2CReadTransaction readTransaction 
=
device.CreateReadTransaction(inBuffer);
//创建一个事务数组
I2CDevice.I2CTransaction[] transactions 
=
ExpandedSubBlockStart.gifContractedSubBlock.gif
new I2CDevice.I2CTransaction[] {
writeTransaction,
readTransaction
}
;
int transferred = device.Execute(
transactions,
100 //超时时间设为100ms
);
//transferred bytes should be 1 + 4 = 5
}
}
}

 

SPI BUS

SPI(Serial peripheral interface)连接需要三条线:时钟(SCLK),输入(MISO)和输出(MOSI),支持全双工的通信方式。对SPI的设备来说,不存在地址的概念,它们与MCU之间通过一个单独的引脚相连,在这条连线上的信号即所谓的片选信号(SSCSSTE)。MCUSPI设备提供时钟信号,每一个时钟周期(总线时钟)内MCUSPI之间发送一位(1 bit)数据(在片选信号到来之后)

.Net Microframework中提供了Microsoft.SPOT.Hardware.SPI类来访问SPI设备。对于每一台SPI的设备,你首先需要为之创建一个SPI类的实例。和前面提到的其他连接方式的设备类似,在构造函数中你同样需要传递给它一个SPI.Confuguration实例来配置它,当然,在完成这个配置之前,需要先参考一下你的SPI组件的Data Sheet了.

下面的代码演示了如何在.NET MF中使用SPI:

 

SPI.Configuration config 
=
 
new
 SPI.Configuration(
chipSelectPin, 
//
片选引脚号
false
//
片选信号为低时访问SPI设备
1
//
在传输数据前,片选信号setup的时间(ms)
1
//
芯片的片选保持时间(ms)
true
//
在设备没有被选择的时候,SCKL设置为高电平
false
//
数据在下降沿采集
15000
//
时钟频率为15000khz(即15MHz)
SPI.SPI_module1 
//
使用的MCU的哪一组SPI
);
SPI spi 
=
 
new
 SPI(config);
//
使用上述配置构造SPI实例

 

在创建好这个spi的实例之后,数据的传输可以通过它的Write或者WriteRead方法来实现.片选的运作由.NET MF维持,你不需要按一定的时许手动从GPIO读写。下面的代码段演示了如何从MCU发送一个16位的命令并读取数据(反馈结果):

 

ushort
 writeBuffer 
=
 
new
 
ushort
[
1
=
 
0xAAAA
;
ushort
 readBuffer 
=
 
new
 
ushort
[
1
];
spi.WriteRead(writeBuffer, readBuffer);

 

SPI的HardwareProvider

我们同样可以为SPI注册HardwareProvider来保留相应的3个管脚。你需要重载HardverProvider的GetSpiPins虚方法并传递给相应的SPI总线需要的三个Cpu的引脚号:

 

public
 
override
 
void
 GetSpiPins(SPI.SPI_module spi_mod,
out
 Cpu.Pin msk,
out
 Cpu.Pin miso,
out
 Cpu.Pin mosi)
ExpandedBlockStart.gifContractedBlock.gif
{
msk 
= Cpu.Pin.GPIO_Pin1;//serial clock line(SCKL)
miso 
= Cpu.Pin.GPIO_Pin2;//master in/slave out line(MISO)
mosi = Cpu.Pin.GPIO_Pin3;//master out/slave in line(MOSI)
}

 

参考资源:

 

 

enjoy it!

 

黄季冬

 

 

 

你可能感兴趣的文章
在Ubuntu14.4(32位)中配置I.MX6的QT编译环境
查看>>
BZOJ 3530: [Sdoi2014]数数 [AC自动机 数位DP]
查看>>
墨卡托投影、高斯-克吕格投影、UTM投影及我国分带方法
查看>>
Android中通过反射来设置Toast的显示时间
查看>>
Vysor Pro破解助手
查看>>
翻译Beginning iOS 7 Development中文版
查看>>
理顺FFT
查看>>
003-spring结合java类调用quartz
查看>>
Idea 常用功能汇总,工作中常用技巧,移出请说明原因,笔记花了好长时间汇总的...
查看>>
php给图片加入文字水印
查看>>
iOS开发-sqlite3使用
查看>>
(5)QlikView中的RowNo()函数
查看>>
SiteMesh2-示例工程
查看>>
poj 1087 A Plug for UNIX 【最大流】
查看>>
Phoenix与Squirrel 是什么?
查看>>
Photoshop制作的ico图标方法
查看>>
HDU 1241 Oil Deposits (DFS)
查看>>
【翻译自mos文章】注意: ASMB process exiting due to lack of ASM file activity
查看>>
ucgui界面设计演示样例2
查看>>
蓝桥杯练习系统——基础练习 十六进制转十进制
查看>>