I2C通讯通常用作寄存器设置,本文在linux平台上 实现传输255字节数据,主要是发送指令、传输文件(包括bin文件)等
一、打开I2C设备
#define I2C_FILE_NAME "/dev/i2c-1"
if ((i2c_file = open(I2C_FILE_NAME, O_RDWR)) < 0) {
perror("Unable to open i2c control file");
return 1;
}
二、I2C写数据
static int I2C_wirte(int file, unsigned char addr, unsigned char *value, int len)
{
struct i2c_rdwr_ioctl_data packets;
struct i2c_msg messages[1];
messages[0].addr = addr;
messages[0].flags = 0;
messages[0].len = len;
messages[0].buf = value;
/* Transfer the i2c packets to the kernel and verify it worked */
packets.msgs = messages;
packets.nmsgs = 1;
if(ioctl(file, I2C_RDWR, &packets) < 0) {
perror("Unable to send data");
return 1;
}
return 0;
}
三、I2C读数据
int I2C_read(int file, unsigned char addr, unsigned char *value, int len_write, int len_read)
{
unsigned char *inbuf, *buf_write;
struct i2c_rdwr_ioctl_data packets;
struct i2c_msg messages[2];
/* messages[0] : write step */
messages[0].addr = addr;
messages[0].flags = 0;
messages[0].len = len_write;
messages[0].buf = value;
/* messages[1] : read step */
messages[1].addr = addr;
messages[1].flags = I2C_M_RD/* | I2C_M_NOSTART*/;
messages[1].len = len_read;
messages[1].buf = value; //读到数据存放value中
/* Send the request to the kernel and get the result back */
packets.msgs = messages;
packets.nmsgs = 2;
if(ioctl(file, I2C_RDWR, &packets) < 0) {
perror("Unable to send data");
return 1;
}
return 0;
}
代码链接:https://download.csdn.net/download/m0_50136807/87732706?spm=1001.2014.3001.5503
MCU的I2C配置成从地址,可以通过linux平台向MCU发送指令或者文件,其中MCU配置成I2C slave的链接如下:
https://blog.csdn.net/m0_50136807/article/details/130392415?spm=1001.2014.3001.5501