在树莓派上通过I2C连续传输,使用python smbus
我想通过I2C从树莓派传输AVR或Arduino等设备的数据。现在我在用Python编程。
我已经成功使用smbus模块中的write_data()函数进行通信了。但我想连续传输多个字节的数据。
请告诉我如何在I2C通信中传输多个字节的数据。我发现了write_block_data()函数,但我不太明白第二个参数CMD是什么意思。这个CMD是什么?我需要指定CMD的值吗?
谢谢。
1 个回答
在树莓派(RPi)和Arduino之间通过I2C通信时,如果你使用的是Wire.h库,那就会遇到很多麻烦。简单来说,树莓派使用的是重复启动信号,而Arduino则没有使用这个信号。
I2C接口上的重复启动信号是告诉从设备(比如Arduino)开始响应请求的信号。而在Arduino中,发送请求和接收响应是分开进行的。因此,你不能一次性发送数据块。
我写了两篇博客文章,介绍如何通过I2C连接这两种设备。第一篇是关于如何使用遥控器的PWM信号:http://distantorion.com/2014/10/24/rc-signals-pwm-to-i2c-with-arduino/。第二篇是关于如何在I2C上驱动一个128x64的LCD显示屏:http://distantorion.com/2014/11/01/i2c-display-with-arduino/
在第二篇中,我使用Python发送数据块:
bus.write_i2c_block_data(0x05,0x10,buff)
0x05是设备地址,0x10是“命令”,buff包含要显示的字符。
关于命令。在I2C中,从设备是通过命令或寄存器来工作的。这两种方法看起来差不多。如果你使用重复启动信号,通信就像是在读取和写入寄存器。而如果没有重复启动信号,通信就像是命令-响应系统。在我的例子中,我发送0x10,这个命令是“把字符显示到屏幕上”。而0x01是清屏命令,0x02则是打开背光。