⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 stm32f10x_i2c.c

📁 stm32f10xx的中文译文例程
💻 C
📖 第 1 页 / 共 4 页
字号:

  /* 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 + -