10.4. 应用示例

#include <gx_i2c.h>

int i2c_master_example(void)
{
    unsigned int bus_id = 0; // fornax 只有 1 路
    unsigned char tx_data[5] ={1, 2, 3, 4, 5}; 
    unsigned char rx_data[5] = {0};
    unsigned chat data[10] = {0}, i;


    // 设置 i2c 为标准模式速度(100 kbit/s)
    gx_i2c_set_speed(0, 100);

    // 通过 i2c 往从机器件地址为 0x50,写入地址为 0x1234 写入 tx_data 数组中的 5 个字符
    gx_i2c_tx(0, 0x50, 0x1234, 2, tx_data, 5);

    data[0] = 0x12;
    data[1] = 0x34;
    for (i = 0; i < 5; i++)
        data[2+i] = tx_data[i];
    // 跟 gx_i2c_tx 一样的效果,但是内部不会申请内存,会更节约资源,以及自由控制大小端字节序
    gx_i2c_write(0, 0x50, data, 7);


    // 通过 i2c 往从机器件地址为 0x50,地址为 0x1234 处读出 5 个字符到 rx_data 数组
    gx_i2c_rx(0, 0x50, 0x1234, 2, rx_data, 5);

    data[0] = 0x12;
    data[1] = 0x34;
    // 同 gx_i2c_rx 效果
    gx_i2c_read(0, 0x50, data, 2, rx_data, 5);

    /* 使能了 DMA 就是 DMA 模式,没有使能 DMA 就是中断模式 */
    // 通过 i2c 往从机器件地址为 0x50,写入地址为 0x1234 写入 tx_data 数组中的 5 个字符
    gx_i2c_async_tx(0, 0x50, 0x1234, 2, tx_data, 5);

    data[0] = 0x12;
    data[1] = 0x34;
    for (i = 0; i < 5; i++)
        data[2+i] = tx_data[i];
    // 跟 gx_i2c_async_write 一样的效果,但是内部不会申请内存,会更节约资源,以及自由控制大小端字节序
    gx_i2c_async_write(0, 0x50, 0x1234, 2, tx_data, 5);

     // 通过 i2c 往从机器件地址为 0x50,地址为 0x1234 处读出 5 个字符到 rx_data 数组
    gx_i2c_async_rx(0, 0x50, 0x1234, 2, rx_data, 5);


    data[0] = 0x12;
    data[1] = 0x34;
    // 同 gx_i2c_async_rx 效果
    gx_i2c_async_read(0, 0x50, data, 2, rx_data, 5);
}

备注

gx_i2c_tx 函数内部会对传入的寄存器地址和数据进行整理排序,然后调用 gx_i2c_write,对资源紧张的方案可以直接调用 gx_i2c_write,其他函数类似。