📄 stm32f10x_i2c.c
字号:
/* Read the I2Cx status register [读I2Cx状态寄存器]*/
flag1 = I2Cx->SR1;
flag2 = I2Cx->SR2;
flag2 = flag2 << 16;
/* Get the last event value from I2C status register [从I2Cx状态寄存器中取得最后的事件值]*/
lastevent = (flag1 | flag2) & FLAG_Mask;
/* Return status [返回状态内容]*/
return lastevent;
}
/*******************************************************************************
* 函数名称: I2C_CheckEvent
* 功能描述: 检查最近的I2C事件是否等于那个已传输的参数.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)I2C_EVENT:指定被检查的事件。
* 这个参数可以是下面的值之一:
* - I2C_EVENT_SLAVE_ADDRESS_MATCHED : EV1
* - I2C_EVENT_SLAVE_BYTE_RECEIVED : EV2
* - I2C_EVENT_SLAVE_BYTE_TRANSMITTED : EV3
* - I2C_EVENT_SLAVE_ACK_FAILURE : EV3-2
* - I2C_EVENT_MASTER_MODE_SELECT : EV5
* - I2C_EVENT_MASTER_MODE_SELECTED : EV6
* - I2C_EVENT_MASTER_BYTE_RECEIVED : EV7
* - I2C_EVENT_MASTER_BYTE_TRANSMITTED : EV8
* - I2C_EVENT_MASTER_MODE_ADDRESS10 : EV9
* - I2C_EVENT_SLAVE_STOP_DETECTED : EV4
* 输出参数: 无
* 返回参数: 一个ErrorStatus枚举值:SUCCESS:最近的事件与I2C_EVENT相同;
* ERROR:最近的事件与I2C_EVENT不同
*
*******************************************************************************/
ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, u32 I2C_EVENT)
{
u32 lastevent = 0;
u32 flag1 = 0, flag2 = 0;
ErrorStatus status = ERROR;
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_EVENT(I2C_EVENT));
/* Read the I2Cx status register [读I2Cx状态寄存器]*/
flag1 = I2Cx->SR1;
flag2 = I2Cx->SR2;
flag2 = flag2 << 16;
/* Get the last event value from I2C status register [从I2Cx状态寄存器中取得最后的事件值]*/
lastevent = (flag1 | flag2) & FLAG_Mask;
/* Check whether the last event is equal to I2C_EVENT [检查最后的事件值是否等于I2C_EVENT]*/
if (lastevent == I2C_EVENT )
{
/* SUCCESS: last event is equal to I2C_EVENT [SUCCESS:最近的事件与I2C_EVENT相同]*/
status = SUCCESS;
}
else
{
/* ERROR: last event is different from I2C_EVENT [ERROR:最近的事件与I2C_EVENT不同]*/
status = ERROR;
}
/* Return status [返回状态内容]*/
return status;
}
/*******************************************************************************
* 函数名称: I2C_GetFlagStatus
* 功能描述: 检查特定的I2C标志是否被置位了.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)I2C_FLAG:确定将要被检查的标志。
* 这个参数可以是下面的值之一:
* - I2C_FLAG_DUALF: 双重标志(从模式)
* - I2C_FLAG_SMBHOST: SMBus主机头(从模式)
* - I2C_FLAG_SMBDEFAULT: SMBus默认头(从模式)
* - I2C_FLAG_GENCALL: 通用调用头标志(从模式)
* - I2C_FLAG_TRA: 发送器/接收器标志
* - I2C_FLAG_BUSY: 总线忙的标志
* - I2C_FLAG_MSL: 主机/从机标志
* - I2C_FLAG_SMBALERT: SMBus警告标志
* - I2C_FLAG_TIMEOUT: 超时或Tlow错误标志
* - I2C_FLAG_PECERR: 接收PEC错误标志
* - I2C_FLAG_OVR: 上溢/下溢标志(从模式)
* - I2C_FLAG_AF: 确认失败标志
* - I2C_FLAG_ARLO: 失去总裁标志(主模式)
* - I2C_FLAG_BERR: 总线错误标志
* - I2C_FLAG_TXE: 数据寄存器空的标志(发送器)
* - I2C_FLAG_RXNE: 数据寄存器非空的标志(接收器)
* - I2C_FLAG_STOPF: 停止检测寄存器(从模式)
* - I2C_FLAG_ADD10: 10位头被发送标志(主模式)
* - I2C_FLAG_BTF: 字节发送结束标志
* - I2C_FLAG_ADDR: 地址发送标志(主模式)"ADSL";地址匹配标志(从模式)"ENDAD" Address matched flag (Slave mode)擡NDAD?* - I2C_FLAG_SB: Start bit flag (Master mode)
* 输出参数: 无
* 返回参数: I2C_FLAG的新状态(SET或RESET).
*******************************************************************************/
FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, u32 I2C_FLAG)
{
FlagStatus bitstatus = RESET;
u32 i2creg = 0, i2cxbase = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_GET_FLAG(I2C_FLAG));
/* Get the I2Cx peripheral base address [取得I2Cx外设基地址]*/
i2cxbase = (*(u32*)&(I2Cx));
/* Read flag register index [读标志寄存器引索]*/
i2creg = I2C_FLAG >> 28;
/* Get bit[23:0] of the flag [取得标志的bit[23:0]位]*/
I2C_FLAG &= FLAG_Mask;
if(i2creg != 0)
{
/* Get the I2Cx SR1 register address [取得I2Cx SR1寄存器地址]*/
i2cxbase += 0x14;
}
else
{
/* Flag in I2Cx SR2 Register [标记I2Cx SR2的寄存器]*/
I2C_FLAG = (u32)(I2C_FLAG >> 16);
/* Get the I2Cx SR2 register address [取得I2Cx SR2寄存器地址]*/
i2cxbase += 0x18;
}
if(((*(vu32 *)i2cxbase) & I2C_FLAG) != (u32)RESET)
{
/* I2C_FLAG is set [置位I2C_FLAG]*/
bitstatus = SET;
}
else
{
/* I2C_FLAG is reset [复位I2C_FLAG]*/
bitstatus = RESET;
}
/* Return the I2C_FLAG status [返回I2C_FLAG的状态]*/
return bitstatus;
}
/*******************************************************************************
* 函数名称: I2C_ClearFlag
* 功能描述: 清除I2Cx的挂起标志.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)I2C_FLAG:需清除的标志。
* 这个参数可以是下面值的任意组合:
* - I2C_FLAG_SMBALERT: SMBus警告标志
* - I2C_FLAG_TIMEOUT: 超时或Tlow错误标志
* - I2C_FLAG_PECERR: 接收的PEC错误标志
* - I2C_FLAG_OVR: 上溢/下溢标志(从模式)
* - I2C_FLAG_AF: 确认失败标志
* - I2C_FLAG_ARLO: 失去总裁标志(主模式)
* - I2C_FLAG_BERR: 总线错误标志
*
* 注意:
* - STOPF (停止检测)只能用软件按次序操作清除:
* 读I2C_SR1寄存器操作(I2C_GetFlagStatus())后面跟着写
* I2C_CR1 寄存器操作 (I2C_Cmd() to 重新使能I2C外设).
* - ADD10 (10-位头发送)只能用软件按次序操作清除:
* 读I2C_SR1寄存器操作(I2C_GetFlagStatus())后面跟着写
* 第二个字节地址到DR寄存器。
* - BTF (字节发送完成) 只能用软件按次序操作清除:
* 读I2C_SR1寄存器操作(I2C_GetFlagStatus())后面跟着读/写
* I2C_DR寄存器 (I2C_SendData()).
* - ADDR (地址发送)只能用软件按次序操作清除:
* 读I2C_SR1寄存器操作(I2C_GetFlagStatus())后面跟着读
* I2C_SR2寄存器操作 ((void)(I2Cx->SR2)).
* - SB (起始位) 只能用软件按次序操作清除:读I2C_SR1
* 寄存器操作(I2C_GetFlagStatus())后面跟着写I2C_DR寄存器
* 操作(I2C_SendData()).
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_ClearFlag(I2C_TypeDef* I2Cx, u32 I2C_FLAG)
{
u32 flagpos = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_CLEAR_FLAG(I2C_FLAG));
/* Get the I2C flag position [取得I2C标志位置]*/
flagpos = I2C_FLAG & FLAG_Mask;
/* Clear the selected I2C flag [清除选择的I2C标志]*/
I2Cx->SR1 = (u16)~flagpos;
}
/*******************************************************************************
* 函数名称: I2C_GetITStatus
* 功能描述: 检查特定的I2C中断是否产生.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)I2C_IT:确定需要检查的中断源.
* 这个参数可以是下面的值之一:
* - I2C_IT_SMBALERT: SMBus警告标志
* - I2C_IT_TIMEOUT: 超时或Tlow错误标志
* - I2C_IT_PECERR: 接收的PEC错误标志
* - I2C_IT_OVR: 上溢/下溢标志(从模式)
* - I2C_IT_AF: 确认失败标志
* - I2C_IT_ARLO: 失去总裁标志(主模式)
* - I2C_IT_BERR: 总线错误标志
* - I2C_IT_TXE: 数据寄存器空的标志(发送器)
* - I2C_IT_RXNE: 数据寄存器非空的标志(接收器)
* - I2C_IT_STOPF: 停止检测寄存器(从模式)
* - I2C_IT_ADD10: 10位头发送标志(主模式)
* - I2C_IT_BTF: 字节传送结束标志
* - I2C_IT_ADDR: 地址发送标志(主模式)"ADSL";地址符合标志(从模式)"ENDAD" Address matched flag (Slave mode)擡NDAD?* - I2C_IT_SB: Start bit flag (Master mode)
* 输出参数: 无
* 返回参数: I2C_IT的新状态(SET或RESET).
*******************************************************************************/
ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, u32 I2C_IT)
{
ITStatus bitstatus = RESET;
u32 enablestatus = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_GET_IT(I2C_IT));
/* Check if the interrupt source is enabled or not [检查中断源是否被使能]*/
enablestatus = (u32)(((I2C_IT & ITEN_Mask) >> 16) & (I2Cx->CR2)) ;
/* Get bit[23:0] of the flag [取得标志位的[23:0]位]*/
I2C_IT &= FLAG_Mask;
/* Check the status of the specified I2C flag [检查指定的I2C标志状态]*/
if (((I2Cx->SR1 & I2C_IT) != (u32)RESET) && enablestatus)
{
/* I2C_IT is set [置位I2C_IT]*/
bitstatus = SET;
}
else
{
/* I2C_IT is reset [复位I2C_IT]*/
bitstatus = RESET;
}
/* Return the I2C_IT status [返回I2C_IT的状态]*/
return bitstatus;
}
/*******************************************************************************
* 函数名称: I2C_ClearITPendingBit
* 功能描述: 清除I2Cx的中断挂起位.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)I2C_IT:确定需要清除的中断挂起位。
* 这个参数可以是下面值的任意组合:
* - I2C_IT_SMBALERT: SMBus告警中断
* - I2C_IT_TIMEOUT: 超时或Tlow错误中断
* - I2C_IT_PECERR: 接收的PEC错误中断
* - I2C_IT_OVR: 上溢/下溢中断(从模式)
* - I2C_IT_AF: 确认失败中断
* - I2C_IT_ARLO: 失去总裁中断(主模式)
* - I2C_IT_BERR: 总线错误中断
*
* 注意:
* - STOPF (停止检测)只能用软件按次序操作清除:
* 读I2C_SR1寄存器操作(I2C_GetFlagStatus())后面跟着写
* I2C_CR1 寄存器操作 (I2C_Cmd() to 重新使能I2C外设).
* - ADD10 (10-位头发送)只能用软件按次序操作清除:
* 读I2C_SR1寄存器操作(I2C_GetFlagStatus())后面跟着写
* 第二个字节地址到DR寄存器。
* - BTF (字节发送完成) 只能用软件按次序操作清除:
* 读I2C_SR1寄存器操作(I2C_GetFlagStatus())后面跟着读/写
* I2C_DR寄存器 (I2C_SendData()).
* - ADDR (地址发送)只能用软件按次序操作清除:
* 读I2C_SR1寄存器操作(I2C_GetFlagStatus())后面跟着读
* I2C_SR2寄存器操作 ((void)(I2Cx->SR2)).
* - SB (起始位) 只能用软件按次序操作清除:读I2C_SR1
* 寄存器操作(I2C_GetFlagStatus())后面跟着写I2C_DR寄存器
* 操作(I2C_SendData()).
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, u32 I2C_IT)
{
u32 flagpos = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_CLEAR_IT(I2C_IT));
/* Get the I2C flag position [取得I2C标志的位置]*/
flagpos = I2C_IT & FLAG_Mask;
/* Clear the selected I2C flag [清除选择的I2C标志]*/
I2Cx->SR1 = (u16)~flagpos;
}
/******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -