嵌入式Linux学习笔记8_IIC中的重要结构体

以下是从Linux内核源码中i2c-dev.c中摘下来的代码段,两个结构体

struct i2c_adapter {
	struct module *owner;
	unsigned int class;		  /* classes to allow probing for */
	const struct i2c_algorithm *algo; /* the algorithm to access the bus */
	void *algo_data;

	/* data fields that are valid for all devices	*/
	const struct i2c_lock_operations *lock_ops;
	struct rt_mutex bus_lock;
	struct rt_mutex mux_lock;

	int timeout;			/* in jiffies */
	int retries;
	struct device dev;		/* the adapter device */

	int nr;  /*定义了这是第几个iic控制器*/
	char name[48];
	struct completion dev_released;

	struct mutex userspace_clients_lock;
	struct list_head userspace_clients;

	struct i2c_bus_recovery_info *bus_recovery_info;
	const struct i2c_adapter_quirks *quirks;
};

首先根据序号nr找到i2c_adapter,然后利用函数xfer来和某一个iic设备发送数据,这些设备在linux源码中用iic_client定义。

struct i2c_algorithm {
	/* If an adapter algorithm can't do I2C-level access, set master_xfer
	   to NULL. If an adapter algorithm can do SMBus access, set
	   smbus_xfer. If set to NULL, the SMBus protocol is simulated
	   using common I2C messages */
	/* master_xfer should return the number of messages successfully
	   processed, or a negative value on error */
	int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,  /* *master_xfer表示iic主设备的传输函数 */
			   int num);
	int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,
			   unsigned short flags, char read_write,
			   u8 command, int size, union i2c_smbus_data *data);

	/* To determine what the adapter supports */
	u32 (*functionality) (struct i2c_adapter *);

#if IS_ENABLED(CONFIG_I2C_SLAVE)
	int (*reg_slave)(struct i2c_client *client);
	int (*unreg_slave)(struct i2c_client *client);
#endif
};

以下是i2c_client的结构体,其中重要的是addr,设备地址,它定义了不同iic设备的设备地址。

struct i2c_client {
	unsigned short flags;		/* div., see below		*/
	unsigned short addr;		/* chip address - NOTE: 7bit	*/
					/* addresses are stored in the	*/
					/* _LOWER_ 7 bits		*/
	char name[I2C_NAME_SIZE];
	struct i2c_adapter *adapter;	/* the adapter we sit on	*/
	struct device dev;		/* the device structure		*/
	int irq;			/* irq issued by device		*/
	struct list_head detected;
#if IS_ENABLED(CONFIG_I2C_SLAVE)
	i2c_slave_cb_t slave_cb;	/* callback for slave mode	*/
#endif
};

对于同一个设备,但是是由不同iic控制器发出的控制,是由adapter控制的,也就是说,在这里addr一样,但是adapter却不一样。
在这里插入图片描述
传输的数据由i2c_msg结构体定义,buf里存放了传输的数据,len定义的是msg的长度,其中flags表示传输方向:bit0=I2C_M_RD表示读,bit0=0表示写。

struct i2c_msg {
	__u16 addr;	/* slave address			*/
	__u16 flags;
#define I2C_M_RD		0x0001	/* read data, from slave to master */
					/* I2C_M_RD is guaranteed to be 0x0001! */
#define I2C_M_TEN		0x0010	/* this is a ten bit chip address */
#define I2C_M_RECV_LEN		0x0400	/* length will be first received byte */
#define I2C_M_NO_RD_ACK		0x0800	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_IGNORE_NAK	0x1000	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_REV_DIR_ADDR	0x2000	/* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NOSTART		0x4000	/* if I2C_FUNC_NOSTART */
#define I2C_M_STOP		0x8000	/* if I2C_FUNC_PROTOCOL_MANGLING */
	__u16 len;		/* msg length				*/
	__u8 *buf;		/* pointer to msg data			*/
};

举个例子:设备地址为0x50的EEPROM,要读取它里面存储地址为0x10的一个字节,应该构造几个i2c_msg?需要构造两个i2c_msg
1)第一个i2c_msg表示写操作,但要把访问的存储地址0x10发给设备。
2)第二个i2c_msg表示读操作
代码如下:

u8 data_addr = 0x10;
i8 data;
struct i2c_msg msgs[2];

msgs[0].addr = 0x50;
msgs[0].flags = 0;
msgs[0].len = 1;
msgs[0].buf = &data_addr;

msgs[1].addr = 0x50;
msgs[1].flags = I2C_M_RD;
msgs[1].len = 1;
msgs[1].buf = &data;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iic_slaver.rar_iic时序是一个嵌入式文档类资源。在嵌入式系统iic_slaver.rar文件是一个包含了iic(Inter-Integrated Circuit)接口的从设备(slaver)的时序信息的压缩文件。 iic是一种串行通信协议,主要用于各种嵌入式设备之间的数据传输。iic接口由两根线组成,一根是数据线(SDA),另一根是时钟线(SCL)。在iic_slaver.rar,我们可以找到从设备在这个接口上进行数据传输的具体时序信息。 iic_slave.rar文件的时序信息对于开发者来说是非常重要的,因为它们描述了从设备与主设备之间的数据传输时机、数据的发送和接收顺序,以及时钟信号的频率等细节。通过分析时序信息,开发者可以了解从设备与主设备之间的通信规则,从而正确编写驱动程序以实现数据的稳定传输。 此外,iic_slaver.rar_iic时序还可能包含从设备的相关文档,如寄存器映射表和时序图等。这些文档提供了关于从设备硬件的更详细的信息,帮助开发者了解从设备的工作原理和寄存器的使用方法。 总之,iic_slaver.rar_iic时序是一个非常实用的嵌入式文档资源,它包含了关于iic接口从设备的时序信息以及相关的文档资料,对于进行嵌入式开发的人员来说,这些资料是非常重要的参考。 ### 回答2: iic_slaver.rar_iic时序是一种嵌入式文档类资源。嵌入式系统是指嵌入在其他设备或系统的计算机系统,通常用于控制、监测或通信等目的。这种时序文档资源主要用于描述iic从设备的时序,以指导嵌入式开发人员在设计和实现遵循正确的时序要求。 在嵌入式系统IIC(Inter-Integrated Circuit)是一种常见的串行通信接口协议,用于在主设备和从设备之间进行数据传输。IIC协议通常被用于连接各种外设(如传感器、存储器等)和微控制器等嵌入式系统的主控制器。 iic_slaver.rar_iic时序资源是一个被压缩为.rar文件的文档资源。该资源通过解压缩后,可以获取到其iic时序文档,该文档对于嵌入式开发人员来说非常有用。iic时序文档描述了在使用IIC协议进行通信时所需的时序要求,包括信号的时序顺序、时钟信号的频率、数据传输的速率等。 嵌入式系统的开发通常需要遵循一定的时序规范,以确保数据传输的准确性和稳定性。因此,iic_slaver.rar_iic时序文档资源可以为开发人员提供了解和理解IIC协议时序要求的参考资料。在使用这一资源时,开发人员可以通过查阅其iic时序文档,了解IIC协议的时序要求,并根据文档的指导,设计和调整嵌入式系统IIC通信相关的电路和程序。 总之,iic_slaver.rar_iic时序是一种嵌入式文档类资源,通过提供IIC通信协议的时序要求文档,帮助嵌入式开发人员编写和调试与IIC相关的程序和电路。 ### 回答3: iic_slaver.rar_iic时序是一种嵌入式文档类资源。在嵌入式系统,I2C总线被广泛应用于连接微处理器和各种外设,用于实现数据传输和通信。iic_slaver.rar文件包含了关于I2C从机(iic_slaver)的相关文档和资源。 I2C(Inter-Integrated Circuit)是由飞利浦公司开发的一种串行通信总线标准。它采用两根线进行数据传输,即SDA(Serial Data Line)和SCL(Serial Clock Line)。其SDA用于数据传输,SCL用于时钟同步。通过使用I2C总线,嵌入式设备可以与各种传感器、存储器、显示器、控制器等外设进行通信。 iic_slaver.rar文件的I2C时序文档详细描述了iic_slaver从机设备与主控设备之间的数据传输时序要求。通过按照这些时序要求进行数据读取和写入操作,可以实现可靠的数据传输和通信。这些时序要求包括时钟频率、数据传输速率、起始信号、停止信号等。 此外,iic_slaver.rar文件可能还包含有关iic_slaver从机设备的硬件设计参考资料、软件开发工具和示例代码等。这些资源可以帮助开发人员设计和开发符合I2C标准的嵌入式设备,并实现与其他设备的通信和数据交换。 总之,iic_slaver.rar_iic时序是一种嵌入式文档类资源,它提供了关于I2C从机设备的时序要求、硬件设计参考和开发工具等资源,帮助开发人员设计和实现嵌入式设备之间的可靠通信和数据传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值