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:检查对要使用该器件的软件的一般理解

Guru**** 1927770 points
Other Parts Discussed in Thread: TCA9543A
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1401445/tca9543a-check-general-understanding-of-software-to-use-the-device

器件型号:TCA9543A

工具与软件:

我正在评估 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、

    恭喜您找到解决方案!

    如果您需要任何其他帮助、请告诉我!