This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具与软件:
我正在评估 TCA9543A、允许我们将具有相同 I2C 地址的多个称重传感器连接到 BeagleBone Black MCU。
我想确认 我对该器件所用软件的总体理解。 我将在 Linux 系统上用 C 语言编写代码、但这只是伪代码说明。
硬件配置为负载单元1在 IC 的通道0上、负载单元2在 IC 的通道1上。 两个称重传感器都具有 I2C 地址0x28。
TCA9543A 开箱即用、位于地址0x70。
是什么
1.设置 BeagleBone Black I2C 总线
2.确认 TCA9543A 在地址0x70。
3.要读取通道0上的称重传感器1、请通过向 I2C 总线写入0x01来启用通道0。
读取加载单元1、从地址0x28读取(与直接连接到 BeagleBone 的 I2C 总线时相同)。
5.为了下一次读取加载电芯2、通过向 I2C 总线写入0x10来启用 TCA9543A 的通道1。
6.读取加载电池2、从地址0x28读取(同样、与直接连接到 BeagleBone 的 I2C 总线的方法相同。)
一般来说、使用该器件的逻辑是什么?
最后、还有一个问题、芯片上的地址线与它的 I2C 地址之间的关系是什么? 我在文档中看不到任何提供此功能的内容。 例如、如果我希望 TCA9543A 的地址为0x71、这是怎么工作的? 我是否可以将 A0连接到 Vcc、将 A1连接到接地?
提前感谢!
通过将0x02写入器件地址0x70来启用第二个通道。
有关该地址、请参阅数据表的第8.6.1节。
不错的地方 复制并粘贴此处。 那么、这些步骤通常是否正确?
我将通过 Mikroe 生产的名为 I2C 多路复用器4 Click 的板使用该器件。 我知道 TI 不支持其他产品、但我对板上的 TCA9543A 有几个问题。
我可以 在地址0x70处看到 TCA9543A;我使用 C 写入它的操作成功。 我可以成功写入0x01、0x02和0x99。 (0x99只是一个测试值;我意识到这不是一个有效的设置。 )
一旦我发送了一个有效的通道选择值(例如0x01)、我就没有看到0x28处的加载单元符合预期。 我没有将 INT 或 RST 连接到任何地方。 他们必须是谁? 我曾尝试把它们绑在高和低,结果没有区别。
我已经将 TCA9543A (地址0x70)和称重传感器(地址0x28)直接连接到 I2C 总线、我可以成功读取这两个、因此我知道称重传感器工作正常、接线对称重传感器良好。
以下是我的 C 代码、以防它对您有所帮助。
// Basic & generic includes #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> // includes for time #include <time.h> #include <sys/time.h> // includes for I2C #include <linux/i2c-dev.h> #include <sys/ioctl.h> int main() { int fd2; int fd1; int args; int x; char buf[3]; // clear buffers buf[0] = 0x00; buf[1] = 0x00; int result; // Configure BeagleBone system("config-pin P9_19 i2c"); // reserved for I2C bus, SDA /dev/i2c-2 system("config-pin P9_20 i2c"); // reserved for I2C bus, SCL /dev/i2c-2 system("config-pin P9_26 i2c"); // reserved for I2C bus, SDA /dev/i2c-1 system("config-pin P9_24 i2c"); // reserved for I2C bus, SCL /dev/i2c-1 usleep(200000); if ((fd2 = open("/dev/i2c-2", O_RDWR)) < 0) { printf("Failed to open I2C bus 2."); exit(1); } if (ioctl(fd2, I2C_SLAVE, 0x70) < 0) { printf("Failed to acquire bus 2 access and/or talk to slave.\n"); exit(1); } // Repeat reading every second until CTRL-Break to stop or bus / device unreachable buf[0] =0x01; buf[1] =0x01; result = write(fd2,buf,1); if (result != 1) { printf("Unable to write to device on channel.\n"); exit(-9); } printf("Result of writing to set channel was %d\n",result); if (ioctl(fd1, I2C_SLAVE, 0x28) < 0) { printf("Failed to acquire bus 2, mux channel 0 access and/or talk to slave.\n"); exit(2); } while(1) { // Drive a reading to start result = read(fd1,buf,1); if (result !=1) //Assume this will return 0 on success { printf("Read_MR command on bus failed. Result=%d\n",result); exit(1); } // wait usleep(500000); if (read(fd1,buf, 2) !=2) { printf("Read_F2 command on bus failed.\n"); exit(1); } else { printf("Values read from bus are:%2x %2x\n",buf[0]&0x3F,buf[1]); } } }
负载单元连接到通道0时、这里是输出。
写入 SET 通道的结果为1
无法获取总线2、多路复用器通道0访问和/或与从器件通信。
make:***[/var/lib/cloud9/common/Makefile:173:Start]错误2.
你好、Walter、
根据数据表、我认为最好通过上拉电阻器将 RESET 和 INT 引脚连接到 VCC。
当 Load Cell(目标器件)没有从总线控制器接收到数据时,您是否在 I2C (SDA 和 SCL)线路上看到了一个称为 NACK 位的东西?(您是否会碰巧遇到此错误的范围? 这将是 来自负载单元(目标)的输入信号的示波器快照波形、以及返回到控制器的输出信号
这里是一份 很好的应用手册 、可以帮助调试 I2C。
我同意上面 Clemens 的意见,你,我和 Clemens 可以一起工作,以帮助你的系统。
此致、
Kameron
我不熟悉/dev/i2c 界面的细节。 使用 i2c-tools 软件包中的工具会更容易、例如"i2cset 2 0x70 0x01"。
供参考-我复查了连接是否正常、以防其中一根跳线损坏。 他们都很好。
第一个图像是示波器捕获的将通道设置为0的写入操作。 这似乎是正确的、是一个良好的信号。
我使用了 Linux 命令
i2cset -y 2 0x70 0x01
选择通道0。 不会生成任何错误。
下一个图像是发送命令以读取0x28处的加载单元的示波器捕获。 连接到通道0。
此操作通过 linux 命令来完成
i2cget -y 2 0x28
Linux 的响应方式为
错误:读取失败。
我使负载单元连接到通道、并使用以下命令将多路复用器的通道设置为通道1。
i2cset -y 2 0x70 0x02
示波器引线与之前基本相同。
然后,我再次尝试读取称重传感器,它失败了,在示波器上没有任何东西。
尚不清楚输出通道是否需要上拉电阻器。 (请记住、TI IC 位于 Mikroe 提供的开发板上。 我在通道0 (负载单元连接的位置)上从 SDA 和 SCA 向 Vdd 添加了10K 上拉电阻器。 然后、我使用命令行将通道设置为0并再次运行我的代码。 我从称重传感器获得了读数! 在代码连续读取称重传感器时、我使用命令行将多路复用器通道更改为通道1。 当我进行更改时、称重传感器读数失败。 多路复用器工作正常。 我需要添加上拉电阻器。 哇哦!
您好、Walter、
恭喜您找到解决方案!
如果您需要任何其他帮助、请告诉我!