找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 7584|回复: 2

NXC I2C HowTo (1).NXT I2C裝置的特性

[复制链接]
发表于 2010-1-14 12:31:08 | 显示全部楼层 |阅读模式
开发3rd Party NXT周边装置RobotC API的Xander日前发表了ROBOTC I2C How To, 以Step by step的方式教导如何撰写RobotC程式来控制NXT的I 2C周边, 这使我回想起2007年第一次尝试使用NXC来撰写NXTCam程式时的摸索过程, 虽然当时John Hansen的NXC Programmer's Guide中已经有Low speed communication API的介绍, 然而NXT的I 2C功能对于我而言仍是全新的探索领域, 而在当时也很难找到实际使用这些API的NXC范例, 最后好不容易参考到了Mindsensors MTRMX-Nx的RobotC sample code, 将程式的写法套用到NXC之后再加上一些摸索与测试, 终于才弄清楚了实作以及API的用法, 从此藉由对NXC使用的逐渐熟悉, 也同时对于NXT I 2C装置特性的掌握始有了一个豁然开朗的认识.

NXT具备的I 2C处理能力相较于前一代的RCX算是相当程度的功能升级, 这也促使自NXT上市以来各式有趣又好玩的I 2C周边不断的推陈出新, 无论Mindsensors或HiTechnic常会有意想不到的新产品推出, 使用方面虽然原厂都会有NXT-G block可供下载, 不过对于一些较复杂的进阶产品, 这些NXT-G block往往只有提供到部分特定的功能而未能充分的发挥产品的特性. 所以惟有使用能够对于装置直接进行I 2C操作的程式软体才能有机会突破这一层的限制, 也因此具有完整的I 2C API呼叫函数同时免费又容易上手的NXC就成为一窥NXT的这个强大功能的最佳入门工具了!

提到NXC不免要对开发的John Hansen致敬与感激, 除了提供好用的IDE外, 而他所著的Lego Mindstorms NXT power programming应该是目前对于NXT的official firmware解说最详细完整的书, 而这本书的2nd版在上个月也收到了, 主要增加了NXT 2.0新功能(float资料类型'Lego new color sensor…)以及第一版之后上市的几个新I 2C装置API的介绍,以后会找机会整理,在此先回到本文讨论的主题.

本文主要将对于过去在NXT I 2C操作方式以及NXC AP I用法等的使用经验作一个整理, 一方面除了可以提供作为笔记参考之外, 亦方便后续若有新资料补充时能有一个现成的架构可以利用, 内容方面则预计将分成3个部分:

(1) 首先对于NXT I 2C装置的特性与用途先建立基本的认识.

(2) 接下来以NXT firmware中Lowspeed Module的3个System call methods来说明NXT如何进行I 2C操作的方式与步骤.

(3) 最后说明NXC I 2C API的实作用法.



NXT I 2C装置简介

虽然NXT的I 2C装置都是连接在input port, 不过以装置所实际具备的功能而言, 则未必仅作为NXT读取资讯的输入来源, 事实上部分装置还可以由NXT写入控制指令以执行特定的功能, 反而应该界定成为output device. 这是由于NXT的4个input ports具备I 2C的通讯处理能力, 因此可以对于具备同样介面的周边装置进行读取以及写入资料的动作, 所以只要是使用标准的I 2C通讯协定也就能发展出各式各样NXT可以运用的周边装置, 以下几个之前的测试文可以用来说明部分NXT I 2C周边的应用实例:.

l 读取I 2C装置资料的应用:
测试Hitechnic IR Receiver的回传状态及行为

l 写入控制指令资料到I 2C装置的应用:
mindsensors NXTHID 人性化介面装置测试( Lego mindstorms NXT based HID)
Hitechnic IRLink I2C details(NXC实作范例)
Mindsensors MagicWand 组装测试

l 有些I 2C装置则同时兼具回馈资讯以及输出控制的功能, 如Mindsensors的NXTServo,除了可以控制RC Servo的动作外, 还可以回馈它的位置资讯.



NXT I 2C通讯的特性

I 2C通讯是产业标准, LEGO在导入到NXT时再加上部分规范并对外公开, 提供3rd party厂商能够开发适用于NXT的I 2C装置, 这里先摘要说明NXT处理I 2C通讯的一些特性, 以对于后续的讨论先有一个初步的了解:

1. I 2C通讯在NXT也称之为Digital I/O Communication或Lowspeed Communication, 为运用NXT firmware中Lowspeed Module功能来进行相关操作.

2. I 2C 通讯是Master-Slave架构, Lego界定NXT必为Master端, 而I 2C装置则为Slave端, 因此会由NXT来主控双边间的资料通讯(包含:初始化'读'写等动作), 而装置则被动的回应来自NXT的相关要求.

3. NXT I 2C通讯每一次操作时最大的资料传输量为16 Bytes, 对于存取拥有大量资讯的周边装置时, 必须留意这个限制.(如:Mindsensors NXTCam' NXTServo)

4. 每一个I 2C装置都具有一个特定位址, 称为Device address (或I 2C bus address), 会在出厂时由厂商预设, 当NXT对Slave装置进行I 2C读写操作时, 它的”通讯标的”即为:Slave装置所接的input port 装置的Device address.

l 每一种装置的Device address设定值通常可以由厂商的产品文件/网页中取得, 不过, 有些I 2C装置因为功能复杂, 原厂可能会因为支援能力问题只提供NXT-G block而不提供NXC API所需的Device address资讯.

l Lego定义的I 2C Device address为7-bits编码, 所以最多可以有127组编码, 而在I 2C通讯时传送的data payload会放在bit 1-bit 7, bit 0则作为R/W动作指示, 因此, 原厂所公布的Device address事实上已经是left shift 1之后的值(也就是乘以2), NXC为采用原厂值, 但于LeJOS若需要自行撰写I 2C Device Class时, 必须将原厂值除以2还原成真正的Device address.

5. 每一个I 2C装置事实上都是具体而微可以执行特订功能的微型设备, 因此会有内部记忆体用来存放所需的资料称为Internal register(或register), 而装置对于记忆体中资料存放的布置方式称为Register Layout, 至于每一个特定资讯在记忆体的参照位置则称之为register address, 因此, 若NXT需要对于装置存取特定的资讯时, 也就是对通讯标的(Port Device address )内资讯所在的register address参照位置进行存取.

l Lego对于register layout有特定的memory model, 亦即会规范特定的资讯应存放的register address, 如: 0x00-0x07 存放装置的软体版本(Sensor version number), 0x08-0x 0F 存放厂商ID(Manufacturer) , 0x10-0x17 存放装置ID(Sensor type).

l 参考Hitechnic IRReceiver Sensor的register layout, 表格中的每一列代表存放于装置记忆体内的特定资讯, 举例: 当IRReceiver若侦测到Channel 1' Output A的IR控制信号时, 会将之转换成对应值后存放至0x42的register address(Motor 1A control), 所以, 我们就可以透过I 2C Read读取这个位置的值来得知IRReceiver侦测到的结果


     IRReceiver Register Layout

     Address Type Contents
======= ====== ====================
00 – 07H chars Sensor version number
08 – 0FH chars Manufacturer
10 – 17H chars Sensor Type
18 – 3DH bytes Not used
3E – 41H chars Reserved
42H byte Motor 1A control
43H byte Motor 1B control
44H byte Motor 2A control
45H byte Motor 2B control
46H byte Motor 3A control
47H byte Motor 3B control
48H byte Motor 4A control
49H byte Motor 4B control
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2010-4-25 11:46:11 | 显示全部楼层
谢唐大大了,正需要!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-11-18 15:03:11 | 显示全部楼层
好文章。哈哈哈哈
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-5-2 11:51 , Processed in 0.242812 second(s), 18 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表