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.

[参考译文] PROCESSOR-SDK-J721E:使用 C 代码的 I2C 通信

Guru**** 2474710 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1456029/processor-sdk-j721e-i2c-communication-using-c-code

器件型号:PROCESSOR-SDK-J721E

工具与软件:

您好!

   我尝试使用 C 代码与 J721e EVM 板(通用板)中的 I2C 器件进行通信。 但无法访问器件。 我将代码附在这里。

void Config_value();                                                
int i2cfile = 0;                                                    
                                                                    
void main()                                                         
{                                                                   
        char *bus = "/dev/i2c-3"; // assigning a pointer to the path
                                                     
        //Opening the bus                            
        if((i2cfile = open(bus, O_RDWR)) < 0)        
        {                                            
                printf("Failed to open the bus. \n");
                exit(1);                     
        }                                    
        // Get I2C device,                   
        if(ioctl(i2cfile, I2C_SLAVE, 0x28)<0)
        {                                    
                printf("Error\n");           
                exit(1);                     
        }                                    
        printf("\nCommunication Started\n"); 
        Config_value();
}
void Config_value()                             
{                                               
        char i2cconfig[3] = {0};                
        i2cconfig[0] = 0x0E;//Configuration register 14
        i2cconfig[1] = 0x3F;                           
        write(i2cfile,i2cconfig,2);                    
}

执行上述代码后、我使用命令"i2cget -f -y 3 0x22 0x0E b"检查寄存器。 值不变。

我可以使用"i2cset -f -y 3 0x22 0x0E 0x3F b"更改值。 从器件地址为0x22。

此致、

Rejin

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

    由于节假日、将从12月25日到1月2日推迟答复。 感谢您的耐心

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

    尊敬的 Rejin:

    写入地址0x28而不是0x22。

    此致!
    Jared

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

    尊敬的 Jared:

     当我提供的地址为0x22时、代码会将其显示为错误。 我将展示代码和输出。

    void main()               
    {                         
            char *bus = "/dev/i2c-3"; // assigning a pointer to the path
                                                                        
            //Opening the bus                                           
            if((i2cfile = open(bus, O_RDWR)) < 0)                       
            {                                                           
                    printf("Failed to open the bus. \n");               
                    exit(1);                                            
            }                                                           
            // Get I2C device,                                          
            if(ioctl(i2cfile, I2C_SLAVE, 0x22)<0)                       
            {                                                           
                    printf("Error in assigning slave address\n");       
                    exit(1);                                            
            }                                                           
            printf("\nCommunication Started\n");                        
                                                                        
            Config_value();
    }
    

    这就是我给出0x28的原因。 我尝试使用地址0x24。 我想知道我必须提供0x28或0x24的地址。 原理图中指定为0x22。 但是、为什么当我将值设为0x22时会出现该错误。

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

    尊敬的 Regin:

    您可以在相关的 i2c 总线上运行 i2cdetect 吗?

    此致!
    Jared

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

    尊敬的 Jared:

    我在此附上 i2cdetect 的屏幕截图。

    提前感谢

    此致、

    Rejin

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

    尊敬的 Rejin:

    我的意思是运行类似以下内容的代码:

    root@am69-sk:~# i2cdetect -y -r 0
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:                         -- -- -- -- -- -- -- -- 
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    40: 40 -- -- 43 -- -- -- -- UU 49 4a 4b -- -- -- -- 
    50: -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    70: -- -- -- -- -- -- -- --

    此外、您使用的 SDK 版本是什么?

    此致!
    Jared

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

    尊敬的 Jared:

    很抱歉耽误你的时间。 我附上 i2cdetect 的屏幕截图

    我使用的是 SDK 版本8.06.01

    我可以通过 Linux 用户空间访问此 i2cbus 中分配的用户 LED (2个 NO)和用户开关。

    此致、

    Rejin

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

    尊敬的 Rejin:

    您是否尝试在0x22处访问器件? 您能做到吗?

    此致!
    Jared

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

    尊敬的 Jared:

    很抱歉耽误你的时间。 是的、我尝试使用0x22、但代码显示为错误。

     

    此致、

    Rejin

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

    尊敬的 Rejin:

    如果该器件已被其他人使用、我认为您无法访问该地址。 如果 禁用当前拥有设备的任何驱动程序、您是否能够分配地址?

    此致!
    Jared

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

    尊敬的 Jared:

    我可以更改用户 LED 状态、并使用相同的地址0x22从 Linux 用户空间中的 i2c 器件获取用户输入。 那么为什么我无法通过 C 代码更改状态。 如何查找哪个器件正在使用 i2c 器件。

    此致、

    Rejin

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

    尊敬的 Rejin:

    我收回了我之前关于如果内核驱动程序使用该设备就无法访问该设备的说法。 但如果您很好奇、可以根据需要查看设备树的兼容字段、以了解哪个驱动程序正在使用 i2c 设备。

    ioctl 调用输出什么错误代码? 我自己的测试没有任何问题。

    此致!
    Jared

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

    尊敬的 Jared:

    我在 C 程序中使用了 ioctl 函数、并得到了-1的结果。 我想一般来说、它会因错误发送-1。 我没有得到一个像-2或-3这样的特定数字。

    我有另一个存储卡,附带通用板,我将发布我的结果. 目前我的存储卡已修改为使用我的所有 LAN 端口(9个)。 处理 I2C 器件的任何其他器件。

    此致、

    Rejin   

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

    尊敬的 Rejin:

    您想具体访问哪个器件? 是 i2c GPIO 扩展器、具体来说是在 main_i2c0总线上扩展2吗? 该 GPIO 扩展器的驱动程序为: gpio-pca953x.c

    我重写了测试、发现每个设备当前都很忙、无法访问。 我认为如果 i2c 器件繁忙、则不能访问该器件。

    以下是测试代码:

    #include <stdlib.h>
    #include <stdio.h>
    
    #include <fcntl.h>
    #include <string.h>
    #include <unistd.h>
    
    #include <sys/ioctl.h>
    
    #include <linux/i2c-dev.h>
    
    int main(int argc, char *argv[])
    {
            int file;
            char filename[20];
    
            strcpy(filename, "/dev/i2c-");
            strcat(filename, argv[1]);
    
            printf("Opening: %s\n", filename);
            file = open(filename, O_RDWR);
    
            if (file < 0) {
                    printf("failed on file open\n");
                    exit(1);
            }
    
            int addr = (int) strtol(argv[2], NULL, 16);
    
            printf("Accessing slave: 0x%s\n", argv[2]);     
            if (ioctl(file, I2C_SLAVE, addr) < 0) {
                    printf("failed on slave access\n");
                    exit(1);
            }       
    
            return 0;
    }

    已执行的命令:

    root@j721e-evm:~# i2cdetect -y -r 1
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:                         -- -- -- -- -- -- -- -- 
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    20: UU -- UU -- -- -- -- -- -- -- -- -- -- -- -- -- 
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    50: -- -- -- -- -- -- -- 57 -- -- -- -- -- -- -- -- 
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- 6d -- -- 
    70: 70 71 -- -- -- -- 76 --                         
    root@j721e-evm:~# ./test 1 22
    Opening: /dev/i2c-1
    Accessing slave: 0x22
    failed on slave access

    您的 i2cget 正常工作的原因是您使用了-f (强制)标志、该标志允许您在器件繁忙时读取器件。

    此外、您不能将驱动程序重新编译为模块并在不中断引导的情况下禁用它。 如果您要设置具有 GPIO HOG 的 GPIO 引脚、应在器件树中进行设置。

    此致!
    Jared

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

    尊敬的 Jared:

    我运行上面给出的代码。 但从器件访问失败。 我使用了默认存储卡、即未修改的存储卡。 但错误仍然存在。

    此致、

    Rejin

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

    尊敬的 Rejin:

    我说这是预期和预期的反应。 在设备处于繁忙状态时、您不能访问该设备。

    您必须禁用控制器件的驱动程序。

    i2cget 正常工作的唯一原因是您在执行命令时使用了强制(-f)标志。

    此致!
    Jared