I2C 使用指南

概述

I2C是是一种串行同步半双工通信协议,只需要两条总线,即串行数据线(SDA)和串行时钟线(SCL),这些线都需要上拉电阻。 BK7238嵌入了I2C接口,可以作为主模式或从模式。它支持标准(最高100 kbps)以及具有7位寻址的快速(高达400kbps)模式。

I2C 具有简单且制造成本低廉等优点,主要用于低速外围设备的短距离通信(一英尺以内)。

I2C Connection

I2C Connection

上图为 I2C 硬件连接,其中:

  • SCL:时钟信号, 提供传输数据的时钟,用来同步数据传输;

  • SDA:用于传输数据。

参考例程

#define I2C_TEST_EEPROM_LEGNTH          8

#if CFG_USE_I2C1
static void i2c1_test_eeprom(char *pcWriteBuffer, int xWriteBufferLen, int argc, char **argv)
{

    int i;
    DD_HANDLE i2c_hdl;
    unsigned int status;
    unsigned int oflag;
    I2C_OP_ST i2c1_op;
    I2C1_MSG_ST i2c_msg_config;

    os_printf(" i2c1_test_eeprom start  \r\n");

    i2c_msg_config.pData = (UINT8 *)os_malloc(I2C_TEST_EEPROM_LEGNTH);
    if (i2c_msg_config.pData == NULL) {
        os_printf("malloc fail\r\n");
        goto exit;
    }

    oflag   = (0 & (~I2C1_MSG_WORK_MODE_MS_BIT)     // master
               & (~I2C1_MSG_WORK_MODE_AL_BIT))    // 7bit address
              | (I2C1_MSG_WORK_MODE_IA_BIT);     // with inner address

    i2c_hdl = ddev_open(I2C1_DEV_NAME, &status, oflag);

    if (os_strcmp(argv[1], "write_eeprom") == 0) {
        os_printf("eeprom write\r\n");

        for (i = 0; i < I2C_TEST_EEPROM_LEGNTH; i++)
            i2c_msg_config.pData[i] = (i << 2) + 0x10 ;

        i2c1_op.op_addr    = 0x08;
        i2c1_op.salve_id   = 0x50;      //send slave address
        i2c1_op.slave_addr = 0x73;      //slave: as slave address

        do {
            status = ddev_write(i2c_hdl, (char *)i2c_msg_config.pData, I2C_TEST_EEPROM_LEGNTH, (unsigned long)&i2c1_op);
        } while (status != 0);
    }
    if (os_strcmp(argv[1], "read_eeprom") == 0) {
        os_printf("eeprom read\r\n");

        i2c1_op.op_addr    = 0x08;
        i2c1_op.salve_id   = 0x50;      //send slave address
        i2c1_op.slave_addr = 0x73;      //slave: as slave address

        do {
            status = ddev_read(i2c_hdl, (char *)i2c_msg_config.pData, I2C_TEST_EEPROM_LEGNTH, (unsigned long)&i2c1_op);
        } while (status != 0);
    }

    for (i = 0; i < I2C_TEST_EEPROM_LEGNTH; i++)
        os_printf("pData[%d]=0x%x\r\n", i, i2c_msg_config.pData[i]);

    ddev_close(i2c_hdl);

    os_printf(" i2c2 test over\r\n");

exit:

    if (NULL != i2c_msg_config.pData) {
        os_free(i2c_msg_config.pData);
        i2c_msg_config.pData = NULL;
    }
}