我是嵌入式编程领域的新手,我正在寻找有关使用 I2C、USB、UART、CAN 等与微控制器接口的信息。有人知道关于这个主题的任何好的链接、书籍、教程吗?因为我是这个主题的真正新手,所以我更喜欢它尽可能基本。
3 回答
Wikipedia 确实是一个很好的起点,可以学习围绕这些机制中的每一个的基础知识。
一旦掌握了,我建议您查看具有其中一些功能的微控制器的实际数据表和用户指南。例如,这款16 位 PIC 具有专用的 UART、I2C 和 SPI 总线。查看文档的相关部分,借助您对基本原理的新知识,您将开始了解如何设计使用它们的系统。
下一步是为这种设备购买一个开发板,然后使用示例代码(其中有很多),自己编写一些数据链路。顺便说一句,UART 无疑是最容易测试的,因为所有 PC 都可以使用 RS-232 协议从终端进行传输,因此在这种情况下,您可以编写一个环回来相对轻松地传输和接收字符。但是,对于 I2C 和 SPI,我认为您需要购买专用的主机加密狗以允许您使用协议进行传输,尽管我认为 Windows 8 可能会引入本机支持(但不要引用我的话)。
我没有使用 CAN 实现数据链路,所以我不能具体评论,虽然我只是做了一个快速的谷歌搜索并且有一个支持它的 PIC 系列,所以我相信你可以遵循类似的方法。至于 USB,我认为它有点像魔法,所以我会让其他人来回答这个问题 - 虽然我知道你可以为 PIC 获得 USB 软件堆栈,所以同样,可能会遵循类似的方法.
最后一点,我只提到了 PIC 作为示例微控制器。如果您一般不熟悉微控制器,您很快就会意识到 Microchip、TI 和 Atmel 等公司的所有主要微控制器系列通常都遵循相同的设计,所以我会浏览并选择为您提供文档的系列最舒服(或者最不不舒服,正如马丁詹姆斯所建议的那样!)。
由于您已经是桌面开发人员,因此您可能会跳到中间的某个地方。下载您计划使用的控制器的用户手册。从制造商等网站获取更简单的外围设备之一的示例代码 - UART 很好。
获取一个开发板和一个 Eclipse/Crossworks/任何支持您的开发板的开发系统,并让一些东西工作 - 闪光灯 LED、UART 回声等。不要尝试首先使用多任务程序和中断驱动程序 - 只需使用尽可能少的代码行轮询 UART。为什么——因为仅仅获得一个开发设置来编译、链接、下载和运行一行代码本身就是一项相当大的练习,而复杂的代码不会带来任何复杂性。在您可以有效地编写/调试控制器的任何代码之前,您首先要调试您的开发设置和硬件。仅仅获得仅仅让板载 LED 闪烁即可工作的“闪烁”代码是向前迈出的一大步:)
大多数控制器都有专门的组/博客,要么在 uC 制造商网站上,要么从它链接 - 加入他们。
如果您想有效地进行此操作,请获得一块板并尝试让它做某事-没有更好的方法。一旦您可以让 LED 闪烁或 UART 发出一串字符,您就可以参加比赛了:)
开发简单的 'blinky' 或 UART-polling 函数不会浪费——你可以在以后有更复杂的代码时继续使用它们。使 LED 闪烁(延迟循环被 OS 睡眠取代)是一个很好的指标,表明代码正在运行,我一直将其保留在交付的系统中。UART 轮询也很有用 - 它将在没有任何中断的情况下运行,因此您可以从数据/预取/任何中止向量中调用它来发出许多“严重错误 - 系统暂停”消息,您将在正在进行的开发过程中收到这些消息:)
在大多数情况下,您想要使用的微控制器的数据表或参考手册就是您所需要的。每个供应商都将以不同的方式实现这些接口,因此这是您获得低级编程信息的唯一权威来源。
I 2 C和UART比较简单,没有标准的高层协议栈;这将由您或您可能连接的设备定义。您的微控制器供应商几乎肯定会提供示例代码和/或应用说明。
CAN 更复杂,通常 CAN 网络使用更高级别的应用协议,其中有几个用于不同的应用领域,例如 CANopen、NMEA2000、DeviceNet、IEC J1939 等。大多数情况下,第三方库是实现应用程序协议栈的最具成本效益的方法,但如果网络仅包含您正在实现的设备,则可能不需要这种复杂性。同样,您的微控制器供应商可能有示例。
USB实施者论坛对 USB进行了非常严格的定义,并且协议栈是不平凡的。大多数具有片上 USB 接口的微控制器供应商都会提供至少设备级 USB 的示例代码和应用说明。USB 主机堆栈更复杂,而且使用第三方库(相对昂贵)也是最快的上市方式。否则您必须支付 USB IF 的费用可能会使编写您自己的主机堆栈的成本不低。即使是 USB 设备接口,您也需要 USB IF 提供 2000 美元的 USB 供应商 ID。一些微控制器和库供应商将允许您以很少或免费的成本将他们的供应商 ID 用于定义的产品 ID 子集,但就数量而言,您可能必须是重要客户。对于内部实验,您可能无需官方 VID 就可以逃脱,