I2C协议+国产芯片TPA626-VR-S进行数据采集测试

概述

I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。

主器件用于启动总线传送数据,并产生时钟以开放传送的器件,此时任何被寻址的器件均被认为是从器件.在总线上主和从、发和收的关系不是恒定的,而取决于此时数据传送方向。如果主机要发送数据给从器件,则主机首先寻址从器件,然后主动发送数据至从器件,最后由主机终止数据传送;如果主机要接收从器件的数据,首先由主器件寻址从器件.然后主机接收从器件发送的数据,最后由主机终止接收过程。在这种情况下.主机负责产生定时时钟和终止数据传送

主/从配置

由于I2C协议是半双工的不能同时发送数据和同时读数据

所以设定为了半双工工作的模式。

像cpu的i2c一般都会提供外部信号,在复位后将设备配置为主模式或从模式。当这个信号被绑定到GND时,它在复位后将设备配置为临时主模式。如果左侧浮动,复位后会将设备配置为从模式。如果不连接GND,MM_N信号默认为高。

特点:

  1. 交换数据量少

  1. 数据传输率低

  1. 标准传输率为100KHZ、快速模式400KHZ的时钟

原理图:

​​​​​​​

相应的I2C采集芯片的描述:

测试环境:linux

测试:

#include <stdio.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <stdlib.h>
#include <sys/ioctl.h>
#include <unistd.h>


#define I2C_BUS_FILE "/dev/i2c-1"
#define I2C_DEVICE_ADDR_1 0x44
#define I2C_DEVICE_ADDR_2 0x45

int main() {
    int i2c_fd;
    unsigned char reg_addrs[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0xFE, 0xFF};
    unsigned short reg_values_dev1[10];
    unsigned short reg_values_dev2[10];
    unsigned char data_2[3]={0x05,0xa,0x00};
    // 打开I2C总线设备文件
    i2c_fd = open(I2C_BUS_FILE, O_RDWR);
    if (i2c_fd < 0) {
        perror("Failed to open I2C bus");
        return 1;
    }


    if (ioctl(i2c_fd, I2C_SLAVE, I2C_DEVICE_ADDR_1) < 0) {
        perror("Failed to set I2C address for device 1");
        close(i2c_fd);
        return 1;
    }

    if (write(i2c_fd, data_2, 3) != 3) {
        perror("Failed to write data");
        close(i2c_fd);
        return 1;
    }

    for (int i = 0; i < 10; i++) {
        unsigned char reg_addr = reg_addrs[i];
        unsigned char data[2];
        if (write(i2c_fd, &reg_addr, 1) != 1) {
            perror("Failed to write register address for device 1");
            close(i2c_fd);
            return 1;
        }
        if (read(i2c_fd, &data, 2) != 2) {
            perror("Failed to read from I2C for device 1");
            close(i2c_fd);
            return 1;
        }
        reg_values_dev1[i] = (data[0] << 8) | data[1];
    }
    if (ioctl(i2c_fd, I2C_SLAVE, I2C_DEVICE_ADDR_2) < 0) {
        perror("Failed to set I2C address for device 2");
        close(i2c_fd);
        return 1;
    }
    if (write(i2c_fd, data_2, 3) != 3) {
        perror("Failed to write data");
        close(i2c_fd);
        return 1;
    }
    for (int i = 0; i < 10; i++) {
        unsigned char reg_addr = reg_addrs[i];
        unsigned char data[2];
        if (write(i2c_fd, &reg_addr, 1) != 1) {
            perror("Failed to write register address for device 2");
            close(i2c_fd);
            return 1;
        }

        // 读取数据
        if (read(i2c_fd, &data, 2) != 2) {
            perror("Failed to read from I2C for device 2");
            close(i2c_fd);
            return 1;
        }
        reg_values_dev2[i] = (data[0] << 8) | data[1];
    }

 
    close(i2c_fd);
    float result0 = reg_values_dev1[1] * 2.5 / 1000;   
    float result1 = reg_values_dev1[2] * 1.25 / 1000;  
    float result2 = reg_values_dev1[4] * 1 / 1000;  
    float result3 = reg_values_dev1[3] * 25 / 1000;

    float result4 = reg_values_dev2[1] * 2.5 / 1000;   
    float result5 = reg_values_dev2[2] * 1.25 / 1000;  
    float result6 = reg_values_dev2[4] * 1 / 1000;  
    float result7 = reg_values_dev2[3] * 25 / 1000; 

    printf("Device 1 data: 0x%X \n",I2C_DEVICE_ADDR_1);
    printf("Bus Voltage Register %.3fV ,Current Register %.3fA , Power Register %.3fW \n", result1,result2,result3);
    printf("Device 2 data: 0x%X\n",I2C_DEVICE_ADDR_2);
    printf("Bus Voltage Register %.3fV ,Current Register %.3fA , Power Register %.3fW \n", result5,result6,result7);
    return 0;
}
 

您可以使用以下步骤在Linux应用层上进行I2C读写TPA626: 1. 确保您的Linux系统已经加载了I2C设备的驱动程序。您可以使用以下命令来检查: ```shell ls /dev/i2c* ``` 如果您看到/dev/i2c-X(其中X是I2C适配器的编号),则表示驱动程序已加载。 2. 在您的应用程序中,打开I2C适配器。您可以使用open()函数打开适配器设备文件,类似于: ```c #include <fcntl.h> #include <unistd.h> int i2c_fd = open("/dev/i2c-X", O_RDWR); if (i2c_fd < 0) { // 处理打开适配器失败的情况 } ``` 3. 设置从设备的地址。对于TPA626音频放大器,通常使用0x34作为从设备地址。您可以使用ioctl()函数来设置从设备地址,如下所示: ```c #include <linux/i2c-dev.h> int addr = 0x34; if (ioctl(i2c_fd, I2C_SLAVE, addr) < 0) { // 处理设置从设备地址失败的情况 } ``` 4. 发送读写命令和数据。您可以使用write()函数来发送数据,使用read()函数来接收数据。例如,要写入一个寄存器并读取结果,可以执行以下操作: ```c unsigned char reg = 0x01; // 要写入的寄存器地址 unsigned char data = 0x20; // 要写入的数据 if (write(i2c_fd, &reg, sizeof(reg)) != sizeof(reg)) { // 处理写入寄存器地址失败的情况 } if (write(i2c_fd, &data, sizeof(data)) != sizeof(data)) { // 处理写入数据失败的情况 } unsigned char result; if (read(i2c_fd, &result, sizeof(result)) != sizeof(result)) { // 处理读取结果失败的情况 } ``` 请注意,以上代码仅为示例,您需要根据您的实际需求进行修改和适配。 这些是在Linux应用层上进行I2C读写TPA626的基本步骤。希望对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

orange....

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值