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,其他函数类似。