/** @defgroup I2C_XFEROPTIONS I2C Sequential Transfer Options
* @{
*/
#define I2C_FIRST_FRAME ((uint32_t)I2C_SOFTEND_MODE)
#define I2C_FIRST_AND_NEXT_FRAME ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))
#define I2C_NEXT_FRAME ((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))
#define I2C_FIRST_AND_LAST_FRAME ((uint32_t)I2C_AUTOEND_MODE)
#define I2C_LAST_FRAME ((uint32_t)I2C_AUTOEND_MODE)
#define I2C_LAST_FRAME_NO_STOP ((uint32_t)I2C_SOFTEND_MODE)
如上所示为STM32定义的I2C序列传输选项,具体解释如下:
这一段代码定义了一系列宏,用于控制I2C(Inter-Integrated Circuit)通信中连续(Sequential)传输的模式选项。这些宏主要影响传输的起始、中间和结束行为,以及是否产生停止(STOP)条件。下面是每个宏的详细解释:
### 宏定义列表
#### I2C_FIRST_FRAME
- **定义**: `((uint32_t)I2C_SOFTEND_MODE)`
- **描述**: 用于序列传输的第一个数据帧。在这个模式下,数据传输结束后将执行软停止(Soft End),即不会在物理层面上产生一个I2C总线的停止条件(STOP),但内部状态机认为传输已经结束。适用于需要紧接着进行下一次传输的情况,如主设备连续写入多个数据后紧接着读取。
#### I2C_FIRST_AND_NEXT_FRAME
- **定义**: `((uint32_t)(I2C_RELOAD_MODE | I2C_SOFTEND_MODE))`
- **描述**: 适用于序列的首帧及其后的连续帧。此模式会自动重装数据寄存器(RELOAD_MODE)准备发送下一个数据,并在当前帧结束时执行软停止。适用于需要连续发送多个数据帧,每帧后不需停止的场景。
#### I2C_NEXT_FRAME
- **定义**: 同`I2C_FIRST_AND_NEXT_FRAME`
- **描述**: 功能与`I2C_FIRST_AND_NEXT_FRAME`一致,用于传输序列中的非首帧,确保数据连续传输且每帧后软停止,但不产生总线层面的停止信号。
#### I2C_FIRST_AND_LAST_FRAME
- **定义**: `((uint32_t)I2C_AUTOEND_MODE)`
- **描述**: 用于表示一个序列的首帧同时也是最后一帧。在这种模式下,数据传输完成后将自动产生一个I2C总线的停止条件(AUTOEND_MODE),表明整个数据包传输完毕,总线可以释放。
#### I2C_LAST_FRAME
- **定义**: 同`I2C_FIRST_AND_LAST_FRAME`
- **描述**: 功能与`I2C_FIRST_AND_LAST_FRAME`一致,表示序列的最后一个数据帧,传输后自动产生停止条件,释放总线。
#### I2C_LAST_FRAME_NO_STOP
- **定义**: `((uint32_t)I2C_SOFTEND_MODE)`
- **描述**: 虽然命名暗示是序列的最后一帧且不产生停止条件,但实际定义与`I2C_SOFTEND_MODE`相同,表示软停止而非硬停止。命名可能引起混淆,实际上此模式并不特指序列的结尾,而是任何需要软停止而不释放总线的场合。
### 总结
这些宏定义为开发者提供了控制I2C连续传输行为的细粒度工具,可以根据应用需求灵活选择是否在传输之间插入停止条件,以及如何管理数据的连续发送。选择适当的传输选项对于确保通信的效率和协议的正确性至关重要。