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.

[参考译文] Linux/AM3351:I2C 上支持 SMBus

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/664224/linux-am3351-smbus-support-on-i2c

器件型号:AM3351

工具/软件:Linux

您好!

USB 集线器2517仅支持 smbus 块读取/写入。

我正在使用以下应用程序、但不会发生写入/读取。

/*
 *简单 I2C 示例
 *
 *版权所有2017 Joel Stanley
 *
 *此程序是免费软件;您可以重新分发和/或修改
 *根据发布的 GNU 通用公共许可证的条款
 *免费软件基础;许可证的版本2、或
 *(可选)任何后续版本。
 *

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

静态内联__s32 i2c_smbus_access (int 文件、char read_write、__u8命令、
                                    int 大小、union i2c_smbus_data *数据)

   struct i2c_smbus_ioctl_data args;

   args.read_write = read_write;
   args.command =命令;
   args.size =大小;
   args.data =数据;
   返回 ioctl (file、I2C_SMBus、&args);



静态内联__s32 i2c_smbus_read_Byte_data (int file、__u8命令)

   union i2c_smbus_data;
   if (i2c_smbus_access (file、I2C_SMBus_read、command、
                       I2C_SMBus_Byte_data (&data)))
      返回-1;
   其他
      返回0x0FF 和 data.byte;


静态内联__s32 i2c_smbus_read_block_data (int 文件、__u8命令、
                                             _u8 *值)

   union i2c_smbus_data;
   int i;
   if (i2c_smbus_access (file、I2C_SMBus_read、command、
                       I2C_SMBus_BLOCK_DATA、和数据))
      返回-1;
   否则{
      对于(i = 1;i <= data.block[0];i++)
         values[I-1]= data.block[i];
         返回 data.block[0];
   }


静态内联__s32 i2c_smbus_write_block_data (int 文件、__u8命令、
                                              __u8长度,__u8 *值)

   union i2c_smbus_data;
   int i;
   如果(长度> 32)
      长度= 32;
   对于(i = 1;i <= length;i++)
      data.block[i]=值[i-1];
   data.block[0]=长度;
   返回 i2c_smbus_access (file、I2C_SMBus_write、command、
                          I2C_SMBus_BLOCK_DATA、&DATA);



int main (int argc、char ** argv)

   uint8_t data=0x00、addr = 0x00、reg = 0x00;
   _u8 read_data[32]={0x00}、write_data[32]={0x00}、offset=0;
   const char * path = argv[1];
   int 文件、rc、i=0、r_w=0;

   如果(argc = 1)
      errx (-1、"路径[i2c 地址][寄存器]");

   如果(argc > 2)
      Addr = strtol (argv[2]、NULL、0);
   如果(argc > 3)
      reg = strtoul (argv[3]、NULL、0);

   File = open (path、O_RDWR);
   如果(文件< 0)
      ERR (errno、"尝试打开'%s'、路径);

   RC = ioctl (file、I2C_slave、addr);
   如果(RC < 0)
   {
      printf ("未检测到从属设备\n");
           Close (file);
      返回0;    
   }
       printf ("请输入0/1以进行读取/写入\n");
       scanf ("%d"、&r_w);
       如果(r_w=1)
       {

    for (i=0;i<32;i++)
    {
           write_data[i]=(_u8) i;
         }
    rc=i2c_smbus_write_block_data (file、reg、8、write_data);
         if (rC<0)
           printf ("写入失败\n");
       }
       //data = i2c_smbus_read_Byte_data (file、reg);
       //printf ("%s":地址0x%02x 上的器件0x%02x:0x%02x\n"、   路径、地址、寄存器、数据);
       其他
       {
    rc=i2c_smbus_read_block_data (file、reg、read_data);
   //rc=i2c_smbus_read_Byte_data (file、reg);
         if (rC<0)
         {
           printf ("读取失败\n");     
         }
         其他
         {
     // printf ("value returned from read%x\n",rc);
           for (i=0;i<32;i++)
            printf ("%x "、read_data[i]);
           printf ("\n");
         }
       }
       Close (file);



///opt/sdk_ti/linux-devkit/sysroots/x86_64-arago-linux/usr/bin/arm-linux-gnueabihf-gcc /opt/sdk_ti/hub_config.c -o hub_block_read_2c

/www.linux-mag.com/...

   

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

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、yordan、感谢您的回复。
    我使用的是"ti-processor-sdk-linux-am335x-evm-03.00.04"
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您能否共享您的 defconfig 和 dts/dtsi 文件?

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

    您好、请访问 attachment.e2e.ti.com/.../dts.tar.gz

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

    您好!

    I2C 接口设置正确。 您能否验证您是否在/dev/dev 中看到了 I2C 接口?

    如果是、您能否尝试使用命令行访问 I2C2 (我假设您正在访问 i2c2上的 USB 集线器)、请参阅 www.acmesystems.it/user_i2c。 使用 i2c_detect、i2c_get 和 i2c_set。 之后、尝试从同一链路执行简单的读/写程序、以验证内核是否正确设置了 i2c2接口。

    然后、在您的程序中、我看不到 i2c 地址集。 您定义 uint8_t data=0x00、addr = 0x00、reg = 0x00;并且在内核中定义:
    LM75@48、usb2517@2C、TPS@24和 goodix_ts@14、但在您的用户空间程序中、您永远不会引用这些地址中的任何一个。

    编辑:内核文档也很好地解释了如何使用 I2C 器件:
     

    此致、
    Yordan

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

    您好、yordan、

     我的从器件地址0x2C、使用 i2cget 我正在读取数据、i2cset 未返回任何错误、但写入未发生。

    请检查以下日志。

    root@AM335x-EVM:~# ls /dev/i2c-
    I2C-0 i2c-2.  
    root@AM335x-EVM:~# i2cdetect -y 2.
    错误:无法在此总线上使用 SMBus 快速写入命令
    root@AM335x-EVM:~# i2cdetect -r 2.                                                                                                              
    警告! 该程序会使您的 I2C 总线混淆、导致数据丢失和更糟糕的情况!
    我将使用读取字节命令探测文件/dev/i2c-2。
    我将探测地址范围0x03-0x77。
    继续? [y/n]、是
        0 1 2 3 4 5 6 7 8 9 A b c d e f
    00:         ------------ ------------ ------
    10:------------ ------------ ------------ --
    20:------------ ------------ ------------ --
    30:------------ ------------ ------------ --
    40:------------ ---- 48 ---------------- ----
    50:---------- ------------ ------------ --
    60:------------ ------------ ------------ --
    70:------------ ------                         

    root@AM335x-EVM:/home# i2cdump -f -y 2 0x2C //它读取整个芯片

    未指定大小(使用字节数据访问)
        0 1 2 3 4 5 6 7 8 9 A b c d e f   0123456789abcdef
    00:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    10:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    20:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    30:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    40:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    50:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    60:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    70:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    80:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    90:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    A0:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    B0:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    C0:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    D0:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    E0:20 1f 1e 1D 1b 1a 19 18 17 16 15 14 12 11    ?????????????????
    F0:10 0f 0e 0d 0c 0b 0A 09 08 07 06 05 04 03 02 01   ?????????????????


    root@AM335x-EVM:/home# i2cget -y 2 0x2C 0xff b //从0xff 偏移读取
    0x01
    root@AM335x-EVM:/home# i2cget -y 2 0x2C 0x00 b   //从0x00偏移读取                                                                                         
    0x20


    root@AM335x-EVM:/home# i2cset -f -y 2 0x2C 0xff 2   //写入2 0xff 偏移                                                
    root@AM335x-EVM:/home# i2cdump -f -y 2 0x2C
    未指定大小(使用字节数据访问)
        0 1 2 3 4 5 6 7 8 9 A b c d e f   0123456789abcdef
    00:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    10:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    20:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    30:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    40:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    50:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    60:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    70:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    80:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    90:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    A0:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    B0:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    C0:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    D0:20 20 20 20 20 20 20 20 20 20 20 20 20 20 20.                    
    E0:20 1f 1e 1D 1b 1a 19 18 17 16 15 14 12 11    ?????????????????
    F0:10 0f 0e 0d 0c 0b 0A 09 08 07 06 05 04 03 02 01   ?????????????????

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    您能否尝试此主题中的建议:
    e2e.ti.com/.../379901

    此致、
    Yordan