本节用到的源码路径:ELF 1开发板资料包\03-例程源码\03-1 命令行例程源码\03_elf1_cmd_i2c i2c.c
这段代码主要分为三部分,定义了三个用于i2c通讯的函数,用于方便地通过i2c总线进行数据的读写操作。
(一)首先,定义函数func_set_opt,用于设置i2c通信的超时时间和重试次数。它通过ioctl函数调用I2C_tiMEOUT和I2C_RETRIES命令来设置超时和重试次数。 (二)第二部分定义了函数func_write_regs,用于向设备写入寄存器数据。该函数首先创建了一个i2c_rdwr_ioctl_data类型的结构体变量work_queue,用于存储i2c通信的信息。然后,通过动态内存分配为work_queue.msgs分配了足够的内存空间,用于存储i2c通信所需的消息。之后,设置了要写入数据的相关信息,并调用ioctl函数执行i2c写操作。最后,释放动态分配的内存,并返回执行结果。
(三)第三部分定义了函数func_read_regs,用于从设备读取寄存器数据。过程与func_write_regs类似,首先创建了一个i2c_rdwr_ioctl_data类型的结构体变量work_queue,并为work_queue.msgs分配了动态内存。然后,先发送一个写操作的消息,设置要读取的寄存器地址,然后再发送一个读操作的消息,从设备读取数据。最后,将读取到的数据拷贝到buf中,并释放动态分配的内存,返回执行结果。
i2c.h
首先定义了一个宏常量MAX_LEN,它的值为265。这个常量表示缓冲区的最大长度。
之后,定义了一个结构体类型struct_i2c_param,包含了一些与i2c通信相关的参数,包括设备地址、寄存器地址、数据长度和数据缓冲区。
main.c
main.c主要分为三个部分:
(一)参数设置函数,参数设置函数格式为:int 参数设置函数func_set_opt(文件描述符fd):
(二)写入寄存器,格式为:int 写入寄存器func_write_regs(文件描述符fd,设备地址devaddr,要写入寄存器地址,要写入数据buffer *buf,要写入数据长度data_len):
(三)读寄存器,格式为:int 读取寄存器func_read_regs(文件描述符fd,要读入寄存器地址reg,要读入数据buf,要读入数据长度data_len):