📄 stm32f0xx_i2c.c
字号:
/* Enable wakeup from stop mode */
I2Cx->CR1 |= I2C_CR1_WUPEN;
}
else
{
/* Disable wakeup from stop mode */
I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_WUPEN);
}
}
/**
* @brief Enables or disables the I2C own address 2.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param NewState: new state of the I2C own address 2.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void I2C_DualAddressCmd(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 own address 2 */
I2Cx->OAR2 |= I2C_OAR2_OA2EN;
}
else
{
/* Disable own address 2 */
I2Cx->OAR2 &= (uint32_t)~((uint32_t)I2C_OAR2_OA2EN);
}
}
/**
* @brief Configures the I2C slave own address 2 and mask.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param Address: specifies the slave address to be programmed.
* @param Mask: specifies own address 2 mask to be programmed.
* This parameter can be one of the following values:
* @arg I2C_OA2_NoMask: no mask.
* @arg I2C_OA2_Mask01: OA2[1] is masked and don't care.
* @arg I2C_OA2_Mask02: OA2[2:1] are masked and don't care.
* @arg I2C_OA2_Mask03: OA2[3:1] are masked and don't care.
* @arg I2C_OA2_Mask04: OA2[4:1] are masked and don't care.
* @arg I2C_OA2_Mask05: OA2[5:1] are masked and don't care.
* @arg I2C_OA2_Mask06: OA2[6:1] are masked and don't care.
* @arg I2C_OA2_Mask07: OA2[7:1] are masked and don't care.
* @retval None
*/
void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, uint16_t Address, uint8_t Mask)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_OWN_ADDRESS2(Address));
assert_param(IS_I2C_OWN_ADDRESS2_MASK(Mask));
/* Get the old register value */
tmpreg = I2Cx->OAR2;
/* Reset I2Cx OA2 bit [7:1] and OA2MSK bit [1:0] */
tmpreg &= (uint32_t)~((uint32_t)(I2C_OAR2_OA2 | I2C_OAR2_OA2MSK));
/* Set I2Cx SADD */
tmpreg |= (uint32_t)(((uint32_t)Address & I2C_OAR2_OA2) | \
(((uint32_t)Mask << 8) & I2C_OAR2_OA2MSK)) ;
/* Store the new register value */
I2Cx->OAR2 = tmpreg;
}
/**
* @brief Enables or disables the I2C general call mode.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param NewState: new state of the I2C general call mode.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void I2C_GeneralCallCmd(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 general call mode */
I2Cx->CR1 |= I2C_CR1_GCEN;
}
else
{
/* Disable general call mode */
I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_GCEN);
}
}
/**
* @brief Enables or disables the I2C slave byte control.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param NewState: new state of the I2C slave byte control.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void I2C_SlaveByteControlCmd(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 slave byte control */
I2Cx->CR1 |= I2C_CR1_SBC;
}
else
{
/* Disable slave byte control */
I2Cx->CR1 &= (uint32_t)~((uint32_t)I2C_CR1_SBC);
}
}
/**
* @brief Configures the slave address to be transmitted after start generation.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param Address: specifies the slave address to be programmed.
* @note This function should be called before generating start condition.
* @retval None
*/
void I2C_SlaveAddressConfig(I2C_TypeDef* I2Cx, uint16_t Address)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_SLAVE_ADDRESS(Address));
/* Get the old register value */
tmpreg = I2Cx->CR2;
/* Reset I2Cx SADD bit [9:0] */
tmpreg &= (uint32_t)~((uint32_t)I2C_CR2_SADD);
/* Set I2Cx SADD */
tmpreg |= (uint32_t)((uint32_t)Address & I2C_CR2_SADD);
/* Store the new register value */
I2Cx->CR2 = tmpreg;
}
/**
* @brief Enables or disables the I2C 10-bit addressing mode for the master.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param NewState: new state of the I2C 10-bit addressing mode.
* This parameter can be: ENABLE or DISABLE.
* @note This function should be called before generating start condition.
* @retval None
*/
void I2C_10BitAddressingModeCmd(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 10-bit addressing mode */
I2Cx->CR2 |= I2C_CR2_ADD10;
}
else
{
/* Disable 10-bit addressing mode */
I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_ADD10);
}
}
/**
* @}
*/
/** @defgroup I2C_Group2 Communications handling functions
* @brief Communications handling functions
*
@verbatim
===============================================================================
##### Communications handling functions #####
===============================================================================
[..] This section provides a set of functions that handles I2C communication.
[..] Automatic End mode is enabled using I2C_AutoEndCmd() function. When Reload
mode is enabled via I2C_ReloadCmd() AutoEnd bit has no effect.
[..] I2C_NumberOfBytesConfig() function set the number of bytes to be transferred,
this configuration should be done before generating start condition in master
mode.
[..] When switching from master write operation to read operation in 10Bit addressing
mode, master can only sends the 1st 7 bits of the 10 bit address, followed by
Read direction by enabling HEADR bit using I2C_10BitAddressHeader() function.
[..] In master mode, when transferring more than 255 bytes Reload mode should be used
to handle communication. In the first phase of transfer, Nbytes should be set to
255. After transferring these bytes TCR flag is set and I2C_TransferHandling()
function should be called to handle remaining communication.
[..] In master mode, when software end mode is selected when all data is transferred
TC flag is set I2C_TransferHandling() function should be called to generate STOP
or generate ReStart.
@endverbatim
* @{
*/
/**
* @brief Enables or disables the I2C automatic end mode (stop condition is
* automatically sent when nbytes data are transferred).
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param NewState: new state of the I2C automatic end mode.
* This parameter can be: ENABLE or DISABLE.
* @note This function has effect if Reload mode is disabled.
* @retval None
*/
void I2C_AutoEndCmd(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 Auto end mode */
I2Cx->CR2 |= I2C_CR2_AUTOEND;
}
else
{
/* Disable Auto end mode */
I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_AUTOEND);
}
}
/**
* @brief Enables or disables the I2C nbytes reload mode.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param NewState: new state of the nbytes reload mode.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void I2C_ReloadCmd(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 Auto Reload mode */
I2Cx->CR2 |= I2C_CR2_RELOAD;
}
else
{
/* Disable Auto Reload mode */
I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_RELOAD);
}
}
/**
* @brief Configures the number of bytes to be transmitted/received.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param Number_Bytes: specifies the number of bytes to be programmed.
* @retval None
*/
void I2C_NumberOfBytesConfig(I2C_TypeDef* I2Cx, uint8_t Number_Bytes)
{
uint32_t tmpreg = 0;
/* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
/* Get the old register value */
tmpreg = I2Cx->CR2;
/* Reset I2Cx Nbytes bit [7:0] */
tmpreg &= (uint32_t)~((uint32_t)I2C_CR2_NBYTES);
/* Set I2Cx Nbytes */
tmpreg |= (uint32_t)(((uint32_t)Number_Bytes << 16 ) & I2C_CR2_NBYTES);
/* Store the new register value */
I2Cx->CR2 = tmpreg;
}
/**
* @brief Configures the type of transfer request for the master.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param I2C_Direction: specifies the transfer request direction to be programmed.
* This parameter can be one of the following values:
* @arg I2C_Direction_Transmitter: Master request a write transfer
* @arg I2C_Direction_Receiver: Master request a read transfer
* @retval None
*/
void I2C_MasterRequestConfig(I2C_TypeDef* I2Cx, uint16_t I2C_Direction)
{
/* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_I2C_DIRECTION(I2C_Direction));
/* Test on the direction to set/reset the read/write bit */
if (I2C_Direction == I2C_Direction_Transmitter)
{
/* Request a write Transfer */
I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_RD_WRN);
}
else
{
/* Request a read Transfer */
I2Cx->CR2 |= I2C_CR2_RD_WRN;
}
}
/**
* @brief Generates I2Cx communication START condition.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param NewState: new state of the I2C START condition generation.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void I2C_GenerateSTART(I2C_TypeDef* I2Cx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Generate a START condition */
I2Cx->CR2 |= I2C_CR2_START;
}
else
{
/* Disable the START condition generation */
I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_START);
}
}
/**
* @brief Generates I2Cx communication STOP condition.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param NewState: new state of the I2C STOP condition generation.
* This parameter can be: ENABLE or DISABLE.
* @retval None
*/
void I2C_GenerateSTOP(I2C_TypeDef* I2Cx, FunctionalState NewState)
{
/* Check the parameters */
assert_param(IS_I2C_ALL_PERIPH(I2Cx));
assert_param(IS_FUNCTIONAL_STATE(NewState));
if (NewState != DISABLE)
{
/* Generate a STOP condition */
I2Cx->CR2 |= I2C_CR2_STOP;
}
else
{
/* Disable the STOP condition generation */
I2Cx->CR2 &= (uint32_t)~((uint32_t)I2C_CR2_STOP);
}
}
/**
* @brief Enables or disables the I2C 10-bit header only mode with read direction.
* @param I2Cx: where x can be 1 or 2 to select the I2C peripheral.
* @param NewState: new state of the I2C 10-bit header only mode.
* This parameter can be: ENABLE or DISABLE.
* @note This mode can be used only when switching from master transmitter mode
* to master receiver mode.
* @retval None
*/
void I2C_10BitAddressHeaderCmd(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 10-bit header only mode */
I2Cx->CR2 |= I2C_CR2_HEAD10R;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -