在2006春天参加在美国Las Vergas的MEDC就看到了Micro Framework创建的设备以及机器人,当然对微软使用Micro Framework创建的微软手表以及做笔记本的第二显示屏的Sideshow仰慕已久。我在Windows Mobile和Symbian等手机平台上做过多年C++/C#的开发,但从来没有写过设备驱动,但心里向往编写驱动程序但没有机会,所以一拿到Micro Framework的开发板,就开始自己的第一个设备驱动程序之旅。

基于.Net Micro Framework设备开发很简单,需要一台运行Visual Studio 2005的电脑,下载并安装免费的Microsoft .NET Micro Framework SDK( http://www.microsoft.com/downloads/details.aspx?FamilyId=32F5DF20-6C95-4FE8-A76C-0ED56A839AD2&displaylang=en ),然后选择一个开发板或者和微软签协议自己创建开发板,去一些芯片厂商或代理的网站订购GPS或传感器的芯片,就可以编写驱动和应用了。如果应用和设备都测试完成,就可以去找Design House设计外型,找工厂批量生产。如果只是学习如何开发应用,所有的工作都可以在模拟器上完成,包括编写模拟设备。

在这个入门的项目中,参考微软.Net Micro Framework团队的博客文章”Building a Thermostat with the Microsoft .NET Micro Framework”( http://blogs.msdn.com/netmfteam/archive/2007/11/12/building-a-thermostat-with-the-microsoft-net-micro-framework.aspx ), 选择Embedded Fusion的Tahoe开发板和AD7314开发一个温度计。首先介绍一下准备使用的Analog Devices公司的 AD7314,是一个MSOP-8封装的温度传感器,包含一个10位的带隙温度传感器和一个10位的A/D转换器。另外,AD7314还具有一个串行接口,其与SPI、QSPI和MICROWIRE及DSP总线协议兼容,使得它与微处理器接口十分方便。AD7314的外形也非常的小,这正是有一些手机和硬盘使用的这个芯片的原因。具体的技术特点如下:

(1)10位数字温度传感器;

(2)工作温度范围–35oC 至 +85oC;

(3)精度:+2oC;

(4)SPI和DSP兼容串行接口;

(5)休眠模式。

AD7314的图片如下,就是最下面的那个小黑块:

因为AD7314使用广泛,所以采购也很简单,在digikey.com的网站上就可以直接网上定购(定购可参考: http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail?name=AD7314ARMZ-ND)买一个需要1.63美元,因为我本人这段时间在温哥华,运费也很低,如果中国的朋友感兴趣,我可以购买之后让朋友带回去 。AD7314的图片:

PA300372

选择开发板

微软Micro Framework的主页上有很多公司提供硬件运行.NET Micro Framework,因为相比之下张欣告诉我的Embedded Fusion比较便宜,再加上他们公司有一个embedded MVP叫Steve Maillet非常热心,所以选择了Embedded Fusion的Tahoe开发板( http://www.embeddedfusion.com )。其实也可以选择飞思卡尔的i.MXS开发工具包,零售价499.10美元 (http://www.freescale.com/webapp/sps/site/overview.jsp?nodeId=02XPgQ8217297301A5).

PB060443

在编写驱动之前,需要把AD7314和开发板用线连起来。由于AD7314实在是太小了,像米粒那么小的芯片上引出八支脚,测试时连线比较困难,所以在digikey.com上购买了一个供AD7314使用的面包板33108CA-ND(定购可参考:http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail?name=33108CA-ND ), 虽然引脚间的距离很小,还是需要小心的每支脚都焊起来。

PB060444

连线

接下来就得连线了,AD7314温度传感器芯片引脚示意图如下:

PB060445 PA300399

在芯片上有一个小记号代表引脚1,通常习惯面包析朝下时,引脚1放在左上脚。因为AD7314使用SPI总线通讯,所以把AD7314 引脚和开发板上的SPI端口连起来。使用SPI需要一个引脚来激活,通常使用一个GPIO的引脚就行了,在这里可以选择一个在开发板上离SPI端口最近的PA7,也就是GPIO pin 5,一会儿在驱动程序中需要指定是Pin5来激活。

连线的任务很简单,VDD代表电源连到开发板的+3.3v, SCLK (serial clock,串口时钟)连到开发板的串口时钟,SDI (serial data in) 和 SDO (serial data out)分别连到开发板的MISO(master in, slave out)和MOSI(master out, slave in).

PB060435 PB060441

连线有个诀窍,除了必需使用焊接外在测试时尽量少用。在这里使用连线的诀窍有两个:一个是使用网线里的双绞线做连线,二是使用橡皮圈来连接引脚和电线。废弃的网线随处可得,使用双绞线的好处是里面的铜丝比较硬,连接时各自都有自己形状,不会互相干扰; 使用橡皮圈连接引脚和连线可以避免使用焊枪,一则可以重用连线,二则实现也简单,橡皮圈可以找气门芯或者粗一点的电线皮代替。

在下图中,在主板上使用了一个连接头S5682-ND,(定购参考:http://search.digikey.com/scripts/DkSearch/dksus.dll?Detail?name=S5682-ND ),这样可以直接把连线插到连接头里,双绞线比较坚硬,可以直接插到连接头里,而且很牢固,使用焊接是个体力活,做起来很花时间。

PB060437

创建驱动的项目

使用Embedded Fusion的Tahoe开发板另一个好处是提供了一系列模板,当然包括SPI Device Driver的模板,在VS2005中新建项目如下图:

NewDriver

项目创建完毕之后添加一个常量声明:

public partial class AD7314 : SPIDeviceDriver;

const int ClockRateKhz = 4000;

然后修改AD7314的构造函数为:

public AD7314()

{

SPI.Configuration cfg = new SPI.Configuration((Cpu.Pin)5

, true

, 0

, 0

, false

, false

, ClockRateKhz

, SPI.SPI_module.SPI1

);

base.Config = cfg;

}

注:第一个参数(Cpu.Pin)5是因为在上面文章中使用第5个引脚来激活温度传感器。

这样就可以使用基类中WriteRead函数的读取数据了:

public float ReadTemperature()

{

// Create the output and input arrays of bytes

byte[] bout = new byte[2];

byte[] bin = new byte[2];

// Set the output bytes both to 0

// This sensor doesn't need any commands. All this method does is read

// the input data, so the output is simply for SPI clocking

bout[0] = 0;

bout[1] = 0;

// Write the clocking info, then read the input data

base.WriteRead(bout, bin);

根据温度的数据格式转换数据格式:

table

代码如下:

// Convert the 2 byte value according to the AD7314 data sheet

// Put the raw bytes into an int

// Mask the upper bit, which is a sign indicator (+/-)

int s = (((bin[0] << 8) + bin[1]) & 0xBFFF);

// Convert to a float

float f = s;

// Shift right

f /= 128;

// Detect negative

if ((bin[0] & 0x40) == 0x40)

f = -f;

// Return the temperature

return f;

}

如果不想使用Embedded Fusion的Tahoe项目模板,也很简单,只需要在Class AD7314里根据cfg创建一个SPI的成员变量,调用SPI的WriteRead函数。

读取温度

在.Net Micro Framework中使用温度也非常的简单,只需要在项目中引用刚才创建的Class Library, 只需要在需要读取温度的地方如下调用:

// Make sure the sensor object is valid

if (_sensor == null)

_sensor = new AD7314();

// Read the value from the sensor

double temp = _sensor.ReadTemperature();

注:本文章参考微软.Net Micro Framework团队的博客文章”Building a Thermostat with the Microsoft .NET Micro Framework”:
http://blogs.msdn.com/netmfteam/archive/2007/11/12/building-a-thermostat-with-the-microsoft-net-micro-framework.aspx

有关.Net Micro Framework的开发的信息:

1. Mobile MVP张欣的第一个Digi开发板上的.Net Micro Framework程序:Hello Morse Code; Hello .NET Micro Framework.(http://mobileside.cn/blogs/breakstring/archive/2007/10/06/MorseCodeOnDotNETMF.aspx)

2. Embedded MVP刘洪峰的博客:http://blog.csdn.net/yefanqiu/,包括Digi开发板初探和模拟器改造一系列的文章

3. 微软.Net Micro Framework主页:http://msdn.microsoft.com/embedded/netmf

4. 微软.Net Micro Framework开发团队博客:http://blogs.msdn.com/netmfteam/

5. Windows Vista Sideshow:
http://www.microsoft.com/china/windowsvista/features/foreveryone/sideshow.mspx

6. 微软手表: http://direct.msn.com/

posted on 2007-12-12 17:35  小角色  阅读(504)  评论(0编辑  收藏  举报