8我使用Beaglebone Black(运行Ubuntu)和i2c尝试控制多个4位七段显示器。
SSD是Byvac BV4614&完整的数据表is available here。
我已经使用Beaglebone上的引脚P9_19和P9_20正确连接了电路。我已经包含了上拉电阻,我使用i2c logic converter来增加安全性。
我已经使用i2cdetect(它的0x31是正确的)验证了设备,并且该设备很好地启动并进入它的i2c模式。
但是我不明白如何使用Python SMBbus读取或写入数据到设备。 SSD手册说
此设备使用的格式包含一个命令,这是一个 number,后跟其他字节,具体取决于该命令。方法 使用I2C协议写入器件遵循一致性 格式,通常:S-Addr的地方 启动条件后跟设备地址(0x62)。命令就是一个 表中给出的命令。数据是一个或多个字节并停止 是停止条件。
(在7位寻址设备处于0x31,这是我正在使用的)。
因此,如果我想让SSD在数字1上显示一个数字,那么手册说我必须这样做
命令5 - 名称:将数字发送到数字 - 格式:其中; S-ADDR>&LT 5个;<数字><字节><停止>
我的问题是,如何使用Python编写该命令?我想我正在寻找类似的东西
import smbus
b = smbus.SMBus(1)
b.write_byte_data(0x31, 0x35, 0x30, 0x38)
我想表示"将命令5(0x35)发送到设备0x31,数字0(0x30)并显示数字8(0x38)"但是wrrite_byte_data不接受这么多的参数。我也尝试过使用write_i2c_block_data()看起来更有希望,但我再也无法弄清楚如何正确使用这些函数。
我觉得我在这里遇到了BCK问题但是我们将不胜感激。
修改的 好的,我试过了
b.write_block_data(0x31,5,[8,0x38])
使数字8出现在数字3上
b.write_block_data(0x31,5,[2])
让2出现在数字2上。我还没有弄清楚如何在数字1或4上放置任何东西。
b.write_block_data(0x31,4,[44])#现在只是输入随机内容
增加亮度,然后使SSD无响应。
所以我越来越近了,
编辑并已解决
最后这很容易。
b.write_i2c_block_data(0x31, 5, [0, 8]) # write number 8 to digit 0
b.write_i2c_block_data(0x31, 5, [4, 5]) # write number 5 to digit 4 etc etc
根据http://www.raspberry-projects.com/pi/programming-in-python/i2c-programming-in-python/using-the-i2c-interface-2函数write_block_data不是很好。
write_block_data(int addr,char cmd,long vals [])
最多可写入32个字节到设备。此函数添加一个初始字节 指示valls数组之前的vals数组的长度。使用 write_i2c_block_data而不是!
答案 0 :(得分:3)
b.write_i2c_block_data(0x31, 5, [0, 8]) # write number 8 to digit 0
b.write_i2c_block_data(0x31, 5, [4, 5]) # write number 5 to digit 4 etc etc
为我解决了这个问题!规范中的所有其他命令现在都按预期运行!
http://www.raspberry-projects.com/pi/programming-in-python/i2c-programming-in-python/using-the-i2c-interface-2的页面告诉我,我使用的功能并不理想。