|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|  |  | | | | | 与 MSP430 Launchpad 的 I2C 通信
在庞大的嵌入式应用系统中,没有哪个微控制器可以独自完成所有活动。在某些时候它必须与其他设备通信以共享信息,有许多不同类型的通信协议可以共享这些信息,但最常用的是 USART、IIC、SPI 和 CAN。每种通信协议都有自己的优点和缺点。现在让我们关注 I2C 部分,因为这是我们将在本教程中学习的内容。
什么是 I2C 通信协议?
IIC 一词代表“内部集成电路”。它通常表示为 I2C 或 I 平方 C,甚至在某些地方表示为 2 线接口协议 (TWI),但它们的意思都是一样的。 I2C 是一种同步通信协议,意味着共享信息的两个设备必须共享一个公共时钟信号。它只有两条线来共享信息,其中一条用于时钟信号,另一条用于发送和接收数据。
I2C 通信如何工作?
I2C 通信最先由 Phillips 推出。如前所述,它有两根电线,这两根电线将连接两个设备。这里一个设备称为主设备,另一个设备称为从设备。通信应该并且将始终发生在两个主站和从站之间。 I2C 通信的优点是一个主机可以连接多个从机。

完整的通信通过这两条线进行,即串行时钟 (SCL) 和串行数据 (SDA)。
串行时钟 (SCL):与从机共享主机生成的时钟信号
串行数据 (SDA):在主机和从机之间来回发送数据。
在任何给定时间,只有主机才能启动通信。由于总线上有多个从机,主机必须使用不同的地址来引用每个从机。当被寻址时,只有具有该特定地址的从机将回复信息,而其他人则保持退出。这样我们就可以使用同一条总线与多个设备进行通信。
I2C 的电压电平没有预定义。 I2C通信是灵活的,即5v电压供电的设备可以用5v进行I2C通信,3.3v的设备可以用3v进行I2C通信。但是,如果两个运行在不同电压下的设备需要使用 I2C 进行通信怎么办? 5V I2C 总线不能连接 3.3V 设备。在这种情况下,电压转换器用于匹配两条 I2C 总线之间的电压电平。
有一些条件可以构成交易。传输初始化从 SDA 的下降沿开始,这在下图中被定义为“开始”条件,其中主机将 SCL 保持为高电平,同时将 SDA 设置为低电平。
MSP430 中的 I2C:控制 AD5171 数字电位器
Energia IDE 是对我们的 MSP430 进行编程的最简单的软件之一。它与 Arduino IDE 相同。您可以在此处了解有关使用 Energia IDE 开始使用 MSP430 的更多信息。
因此,要在 Energia IDE 中使用 I2C,我们必须只包含 wire.h 头文件。引脚声明(SDA 和 SCL)在 wire 库中,所以我们不需要在设置函数中声明。
可以在 IDE 的示例菜单中找到示例示例。下面解释了其中一个示例:
此示例说明如何控制通过 I2C 同步串行协议进行通信的 Analog Devices AD5171 数字电位器。使用 MSP 的 I2C 线库,数字电位器将逐步通过 64 级电阻,使 LED 变暗。
首先,我们将包含负责 i2c 通信的库,即 wire 库
#include <Wire.h> In setup function, we will initiate the wire library by .begin() function. void setup() { Wire.begin(); } Then initialize a variable val to store values of potentiometer byte val = 0; In loop function, we will start transmission to the i2c slave device (in this case Digital potentiometer IC) by specifying the device address which is given in the datasheet of the IC. void loop() {Wire.beginTransmission(44); // transmit to device #44 (0x2c) Subsequently, queue bytes i.e. data you want to send to the IC for transmission with the write() function. Wire.write(byte(0x00)); // sends instruction byte Wire.write(val); // sends potentiometer value byte Then transmit them by calling endTransmission(). Wire.endTransmission(); // stop transmitting val++; // increment value if (val == 64) { // if reached 64th position (max) val = 0; // start over from lowest value } delay(500);}
|
|
|
| |  |  | | | | | | 这种回复不会计入在回复数量中的 可以选择发帖然后把帖子链接放在评论区~ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
 |  | | | | 看到大家对msp技术热情高涨 本次活动将延期一个月 希望大家继续积极发帖讨论~
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|  |  | | | | | 回帖:https://bbs.21dianyuan.com/thread-349642-1-1.html?fromuid=66369
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|