在 Linux I2C 驱动中,struct i2c_msg
结构体用于描述 I2C 传输中的一条消息。每个消息都包含从设备地址、操作标志、数据长度以及数据缓冲区指针。结构体中的 flags
字段可以设置多个标志位,来控制 I2C 传输的行为。以下是 flags
可能的宏定义及其对应的操作:
1. I2C_M_RD (0x0001)
- 作用:表示该消息是一个读取操作(从从设备读取数据到主设备)。
- 说明:如果未设置该标志,则默认是写操作(主设备向从设备发送数据)。
2. I2C_M_TEN (0x0010)
- 作用:使用 10 位地址模式,而不是默认的 7 位地址模式。
- 说明:I2C 设备通常使用 7 位地址,但某些设备可能使用 10 位地址,此标志用于启用 10 位地址模式。
3. I2C_M_DMA_SAFE (0x0200)
- 作用:表示该消息的缓冲区是 DMA 安全的(即可以安全地用于 DMA 传输)。
- 说明:在内核空间使用 DMA 进行高效传输时,该标志表示数据缓冲区已正确分配,可以用于 DMA 传输。但在用户空间,此标志无意义,因为用户空间的数据通常会被复制到内核缓冲区。
4. I2C_M_RECV_LEN (0x0400)
- 作用:用于特定的 I2C 设备,该设备在读取时,第一个字节表示接下来数据的长度。
- 说明:
- 该标志必须与
I2C_M_RD
(读取标志)一起使用。 - 驱动程序会在第一个字节读取后,根据该字节的值调整实际读取的字节数。
- 该标志必须与
5. I2C_M_NO_RD_ACK (0x0800)
- 作用:用于不标准的 I2C 设备,表示在读取时不发送 ACK(确认信号)。
- 说明:如果设置了这个标志,I2C 控制器在接收数据时不会发送 ACK,这在某些特殊设备或协议中可能有用。
6. I2C_M_IGNORE_NAK (0x1000)
- 作用:忽略从设备的 NACK(非应答)。
- 说明:通常,当 I2C 设备返回 NACK 时,传输会终止。但在某些情况下(例如某些 EEPROM),可能需要忽略 NACK 继续传输。
7. I2C_M_REV_DIR_ADDR (0x2000)
- 作用:反向数据方向的地址操作(与正常的 I2C 地址传输顺序相反)。
- 说明:该标志用于某些需要特殊协议的 I2C 设备,通常用于协议调整。
8. I2C_M_NOSTART (0x4000)
- 作用:不发送起始信号(START),用于特定的 I2C 事务。
- 说明:
- 通常 I2C 传输会先发送 START 信号,但某些设备可能不需要 START 信号,或者已经手动管理了总线状态,此标志用于此类情况。
9. I2C_M_STOP (0x8000)
- 作用:强制在本消息结束后发送停止信号(STOP)。
- 说明:
- 通常,I2C 传输在最后一条消息后发送 STOP 信号,但在某些情况下,驱动程序可能需要手动控制 STOP 发送行为。
- 例如,在多消息事务中,某些消息可能希望保持总线活跃,而最后一条消息才发送 STOP。
总结:
宏定义 | 作用 |
---|---|
I2C_M_RD | 读取操作(从设备 -> 主机) |
I2C_M_TEN | 使用 10 位地址模式 |
I2C_M_DMA_SAFE | 缓冲区可安全用于 DMA 传输 |
I2C_M_RECV_LEN | 读取数据时,第一个字节表示数据长度 |
I2C_M_NO_RD_ACK | 读取时不发送 ACK |
I2C_M_IGNORE_NAK | 忽略从设备的 NACK |
I2C_M_REV_DIR_ADDR | 反向地址传输顺序 |
I2C_M_NOSTART | 不发送 START 信号 |
I2C_M_STOP | 发送 STOP 信号 |
这些标志可以单独使用或组合使用,以实现各种 I2C 设备通信需求。在实际开发中,可以根据设备的数据手册选择合适的标志来确保通信正常。