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.

[参考译文] TCA6424A:使用从 TCA6424A 输入寄存器读取的 python smbus2时出现问题

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1082111/tca6424a-issues-using-python-smbus2-read-to-read-from-tca6424a-input-register

部件号:TCA6424A
“线程”中讨论的其它部件: TCA6424

您好,

我正在尝试通过 i2c 使用 pysmbus2和 Raspberry Pi 4与两台 TCA6424A 设备通信。

因此 ,smbus2 读取和 写入 i2c 函数不例外 。  

但是,读取函数似乎无法从配置为这样的输入寄存器中读取

总线= SMBus (1)

  TCA_Slave_Address = 0x22
  TCA_ReG_Address = 0x8C
  TCA_Data4B =[0x00,0x00,0x00]# 所有端口输出    
   bus.write_i2c_block_data (TCA_Slave_Address,TCA_Re_Address,TCA_Data4B)
  时间睡眠(0.3)   
  TCA_Slave_Address = 0x23
  TCA_ReG_Address = 0x8C
  TCA_Data4B =[0x00,0x00,0xFF]# 16端口输出,8端口输入
  bus.write_i2c_block_data (TCA_Slave_Address,TCA_Re_Address,TCA_Data4B)
  时间睡眠(0.3)

 接下来,我将数据写入 设备地址   0x23输出端口-0

  TCA_Slave_Address = 0x23
  TCA_ReG_Address = 0x84
  TCA_Data4B =[0x02,0x02,0x02]  
   
  I2C.BMP_Write (TCA_Slave_Address,TCA_ReG_Address,TCA_Data4B)
  时间睡眠(0.3)
 当我从设备0x23输入寄存器读取数据时 ,我会得到 上一步中刚刚写入输出端口0的数据   
  
  写入= i2c_msg.write (0x23,0x02)
  读取= i2c_msg.read (0x23,3)         
  尝试:
    打印(bus.i2c_rdr (写入,读取)  )>> [2,2,2]
  例外情况除外:e:
      
i2c_rdwr (写入,读取) 函数将生成逻辑分析器图的以下内容。  如果有任何帮助或建议,我们将不胜感激。   谢谢。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    逻辑分析器显示“i2c_msg.write(0x23,0x02)"消息写入两个零字节,这使得以下读取访问输出端口。

    调用 i2c_msg.write 时,请始终为其提供一个字节列表或一个包含字节的字符串:I2C_msg.write (0x23,[0x02])。

    (为什么要读同一个寄存器三次?)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的快速响应, 我会根据  您的建议尝试 i2c_msg.writ(0x23,[0x02])。  
    目的是读取输入 Port-2 ,因此  i2c_msg.write(0x23,0x02) 应将0x2写入 TCA6424命令字节,以便从输入 Port-2读取。 如果我没有弄错的话。  

    我不确定是否三次阅读同一个注册表。 我只是用 Python 模仿原 MCU STM32 C 代码 读取功能,效果很好。 唯一的区别是 :C 代码使用8位地址 ,smbus2 python 只 能使用7位地址。 但是,使用 带有8位寻址的 i2c 嗅探器,我可以看到我的 python 读取函数  读取= i2c_msg.read (0x23,3)正在从地址0x47读取(应该是,正确吗?)

    作废 TCA_READ (作废)

    读取状态= 0;
    I2C2->CR1 |= 0x00000040;//传输完全中断已启用 TCIE
    I2C2->CR2 &= 0x00000000;
    I2C2->CR2 |= 0x00010046;//AUTOEND=0,nbytes=1,写入请求,添加[7:1]=从地址=0x46
    }
    开关(读取状态)

    案例0:
    I2C2->CR2 |= 0x00002000; //Start 条件
    读取状态= 1;
    休息;

    案例1:
    读取状态= 2;
    I2C2->TXDR = 0x02;
    休息;

    案例2:
    I2C2->CR1 &= 0xFFFFFFBF;//传输完全中断已禁用 TCIE
    I2C2->CR2 &= 0x00000000;
    I2C2->CR2 |= 0x00010000;
    I2C2->CR2 |= 0x02000446; //AUTOEND=1,nbytes=2 (3字节),读取请求,添加[7:0]=从属写入地址=0x46
    I2C2->CR2 |= 0x00002000; //重新启动条件

    读取状态= 3;
    休息;

    案例3:
    TCA_Temp_buy[TCA_Temp_Sample_Count]= I2C2->RXDR;

    读取状态= 0;
    休息;

    默认值:
    read_error_set();
    休息;
    }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    “I2C_msg.read (0x23,3)”指示其读取三个字节。 因为以前写入的命令字节是0x02 (而不是0x82),所以寄存器索引不会自动递增,因此您将获得三次相同的值。

    n ü I²C 地址始终有七位。 I²C 事务的第一个字节包含地址和 R/W 位。 该字节有时被称为“地址字节”,但这不会使地址成为八位。 (某些微控制器有一个寄存器,该寄存器还将地址和 R/W 位组合在一起,例如在您的示例中。)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    再次感谢您的解释。
    将来我会尝试使用正确的术语,但 我的问题仍然存在,为什么它不是从输入端口-2读取的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    因为命令字节为零(如逻辑分析器所示)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嗨,迈克,

    我同意克塞姆人的评论。 您的逻辑分析器图像显示,您正在写入命令字节0x00h,然后读取命令字节将读取事务设置为从输入端口0读取。 如果要从输入端口2读取数据,则需要设置 write 命令以发送命令字节0x02h。  

    -鲍比

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    问题是逻辑分析器为什么显示0x00而不是0x02。  
    Clemens 建议在   i2c_msg.write (0x23,[0x02])中为单个字节0x02使用括号是正确的。  

    再次感谢克莱门斯 。