📄 stm32f10x_i2c.c
字号:
assert_param(IS_I2C_DIRECTION(I2C_Direction));
/* Test on the direction to set/reset the read/write bit [测试读/写位的状态是置位还是复位]*/
if (I2C_Direction != I2C_Direction_Transmitter)
{
/* Set the address bit0 for read [置位地址位的0位到读状态]*/
Address |= OAR1_ADD0_Set;
}
else
{
/* Reset the address bit0 for write [复位地址位的0位到写状态]*/
Address &= OAR1_ADD0_Reset;
}
/* Send the address [发送地址]*/
I2Cx->DR = Address;
}
/*******************************************************************************
* 函数名称: I2C_ReadRegister
* 功能描述: 读取特定的I2C寄存器并返回其值.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C部件
* (2)I2C_Register:将要读取的寄存器.
* 这个参数可以是下面的值之一:
* - I2C_Register_CR1: CR1 寄存器.
* - I2C_Register_CR2: CR2 寄存器.
* - I2C_Register_OAR1: OAR1 寄存器.
* - I2C_Register_OAR2: OAR2 寄存器.
* - I2C_Register_DR: DR 寄存器.
* - I2C_Register_SR1: SR1 寄存器.
* - I2C_Register_SR2: SR2 寄存器.
* - I2C_Register_CCR: CCR 寄存器.
* - I2C_Register_TRISE: TRISE 寄存器.
* 输出参数: 无
* 返回参数: 选择寄存器的值.
*******************************************************************************/
u16 I2C_ReadRegister(I2C_TypeDef* I2Cx, u8 I2C_Register)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_REGISTER(I2C_Register));
/* Return the selected register value [返回选择寄存器的值]*/
return (*(vu16 *)(*((vu32 *)&I2Cx) + I2C_Register));
}
/*******************************************************************************
* 函数名称: I2C_SoftwareResetCmd
* 功能描述: 使能(或禁止)特定I2C软件复位.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)NewState:I2C软件复位的新状态.
* 该参数为:ENABLE或DISABLE
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Peripheral under reset [外设下复位]*/
I2Cx->CR1 |= CR1_SWRST_Set;
}
else
{
/* Peripheral not under reset [外设不下复位]*/
I2Cx->CR1 &= CR1_SWRST_Reset;
}
}
/*******************************************************************************
* 函数名称: I2C_SMBusAlertConfig
* 功能描述: 为特定的I2C驱动SMBAlert引脚为高或低.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)I2C_SMBusAlert:SMBusAlert引脚电平。
* 这个参数可以是下面的值之一:
* - I2C_SMBusAlert_Low: SMBusAlert引脚驱动为低
* - I2C_SMBusAlert_High: SMBusAlert引脚驱动为高
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, u16 I2C_SMBusAlert)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_SMBUS_ALERT(I2C_SMBusAlert));
if (I2C_SMBusAlert == I2C_SMBusAlert_Low)
{
/* Drive the SMBusAlert pin Low [驱动SMBusAlert引脚为低]*/
I2Cx->CR1 |= I2C_SMBusAlert_Low;
}
else
{
/* Drive the SMBusAlert pin High [驱动SMBusAlert引脚为高]*/
I2Cx->CR1 &= I2C_SMBusAlert_High;
}
}
/*******************************************************************************
* 函数名称: I2C_TransmitPEC
* 功能描述: 使能(或禁止)特定I2C的PEC传输
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)NewState:I2C的PEC传输的新状态.
* 该参数为:ENABLE或DISABLE
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the selected I2C PEC transmission [使能选择I2C的PEC传输]*/
I2Cx->CR1 |= CR1_PEC_Set;
}
else
{
/* Disable the selected I2C PEC transmission [禁止选择I2C的PEC传输]*/
I2Cx->CR1 &= CR1_PEC_Reset;
}
}
/*******************************************************************************
* 函数名称: I2C_PECPositionConfig
* 功能描述: 选择特定的I2C的PEC位置.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)I2C_PECPosition:PEC位置.
* 这个参数可以是下面的值之一:
* - I2C_PECPosition_Next: 下一字节就是PEC
* - I2C_PECPosition_Current: 当前字节就是PEC
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, u16 I2C_PECPosition)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_PEC_POSITION(I2C_PECPosition));
if (I2C_PECPosition == I2C_PECPosition_Next)
{
/* Next byte in shift register is PEC [在移位寄存器中的下一个字节是PEC]*/
I2Cx->CR1 |= I2C_PECPosition_Next;
}
else
{
/* Current byte in shift register is PEC [在移位寄存器中的当前字节是PEC]*/
I2Cx->CR1 &= I2C_PECPosition_Current;
}
}
/*******************************************************************************
* 函数名称: I2C_CalculatePEC
* 功能描述: 使能(或禁止)已传输字节的PEC计算值.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)NewState:PEC计算值的新状态. 该参数为:ENABLE或DISABLE
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the selected I2C PEC calculation [使能选择的I2C PEC计算值]*/
I2Cx->CR1 |= CR1_ENPEC_Set;
}
else
{
/* Disable the selected I2C PEC calculation [禁止选择的I2C PEC计算值]*/
I2Cx->CR1 &= CR1_ENPEC_Reset;
}
}
/*******************************************************************************
* 函数名称: I2C_GetPEC
* 功能描述: 为特定I2C接口返回PEC值.
* 输入参数: I2Cx:x可为1或2来选择I2C外设.
* 输出参数: 无
* 返回参数: PEC值.
*******************************************************************************/
u8 I2C_GetPEC(I2C_TypeDef* I2Cx)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
/* Return the selected I2C PEC value [返回选择的I2C PEC值]*/
return ((I2Cx->SR2) >> 8);
}
/*******************************************************************************
* 函数名称: I2C_ARPCmd
* 功能描述: 使能(或禁止)特定的I2C的ARP
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)NewState:I2Cx的ARP的新状态.该参数为:ENABLE或DISABLE
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Enable the selected I2C ARP [使能选择的I2C ARP]*/
I2Cx->CR1 |= CR1_ENARP_Set;
}
else
{
/* Disable the selected I2C ARP [禁止选择的I2C ARP]*/
I2Cx->CR1 &= CR1_ENARP_Reset;
}
}
/*******************************************************************************
* 函数名称: I2C_StretchClockCmd
* 功能描述: 使能(或禁止)特定的I2C时钟扩展
* 输入参数: I(1)2Cx:x可为1或2来选择I2C外设.
* (2)NewState:时钟伸展的新状态.该参数为:ENABLE或DISABLE
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState == DISABLE)
{
/* Enable the selected I2C Clock stretching [使能选择的I2C时钟扩展]*/
I2Cx->CR1 |= CR1_NOSTRETCH_Set;
}
else
{
/* Disable the selected I2C Clock stretching [禁止选择的I2C时钟扩展]*/
I2Cx->CR1 &= CR1_NOSTRETCH_Reset;
}
}
/*******************************************************************************
* 函数名称: I2C_FastModeDutyCycleConfig
* 功能描述: 选择特定I2C的快速模式占空周期.
* 输入参数: (1)I2Cx:x可为1或2来选择I2C外设.
* (2)I2C_DutyCycle:快速模式下占空周期。
* 这个参数可以是下面的值之一:
* - I2C_DutyCycle_2: I2C快模式Tlow/Thigh=2
* - I2C_DutyCycle_16_9: I2C快模式Tlow/Thigh=16/9
* 输出参数: 无
* 返回参数: 无
*******************************************************************************/
void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, u16 I2C_DutyCycle)
{
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_DUTY_CYCLE(I2C_DutyCycle));
if (I2C_DutyCycle != I2C_DutyCycle_16_9)
{
/* I2C fast mode Tlow/Thigh=2 [I2C快模式Tlow/Thigh=2]*/
I2Cx->CCR &= I2C_DutyCycle_2;
}
else
{
/* I2C fast mode Tlow/Thigh=16/9 [I2C快模式Tlow/Thigh=16/9]*/
I2Cx->CCR |= I2C_DutyCycle_16_9;
}
}
/*******************************************************************************
* 函数名称: I2C_GetLastEvent
* 功能描述: 返回最近I2Cx事件.
* 输入参数: I2Cx:x可为1或2来选择I2C外设.
* 输出参数: 无
* 返回参数: 最近的I2Cx事件
*******************************************************************************/
u32 I2C_GetLastEvent(I2C_TypeDef* I2Cx)
{
u32 lastevent = 0;
u32 flag1 = 0, flag2 = 0;
/* Check the parameters [检查参数]*/
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -