STM32F1: Support for I2C_OAR2 (Dual addressing)

This commit is contained in:
Angus Peart
2015-01-27 14:58:58 +11:00
committed by Piotr Esden-Tempski
parent 98855af279
commit 60739968bd
2 changed files with 44 additions and 3 deletions

View File

@@ -369,6 +369,9 @@ void i2c_send_stop(uint32_t i2c);
void i2c_clear_stop(uint32_t i2c); void i2c_clear_stop(uint32_t i2c);
void i2c_set_own_7bit_slave_address(uint32_t i2c, uint8_t slave); void i2c_set_own_7bit_slave_address(uint32_t i2c, uint8_t slave);
void i2c_set_own_10bit_slave_address(uint32_t i2c, uint16_t slave); void i2c_set_own_10bit_slave_address(uint32_t i2c, uint16_t slave);
void i2c_set_own_7bit_slave_address_two(uint32_t i2c, uint8_t slave);
void i2c_enable_dual_addressing_mode(uint32_t i2c);
void i2c_disable_dual_addressing_mode(uint32_t i2c);
void i2c_set_clock_frequency(uint32_t i2c, uint8_t freq); void i2c_set_clock_frequency(uint32_t i2c, uint8_t freq);
void i2c_send_data(uint32_t i2c, uint8_t data); void i2c_send_data(uint32_t i2c, uint8_t data);
void i2c_set_fast_mode(uint32_t i2c); void i2c_set_fast_mode(uint32_t i2c);

View File

@@ -155,11 +155,8 @@ void i2c_set_own_7bit_slave_address(uint32_t i2c, uint8_t slave)
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** @brief I2C Set the 10 bit Slave Address for the Peripheral. /** @brief I2C Set the 10 bit Slave Address for the Peripheral.
This sets an address for Slave mode operation, in 10 bit form. This sets an address for Slave mode operation, in 10 bit form.
@todo add "I2C_OAR1(i2c) |= (1 << 14);" as above @todo add "I2C_OAR1(i2c) |= (1 << 14);" as above
@param[in] i2c Unsigned int32. I2C register base address @ref i2c_reg_base. @param[in] i2c Unsigned int32. I2C register base address @ref i2c_reg_base.
@param[in] slave Unsigned int16. Slave address 0...1023. @param[in] slave Unsigned int16. Slave address 0...1023.
*/ */
@@ -169,6 +166,47 @@ void i2c_set_own_10bit_slave_address(uint32_t i2c, uint16_t slave)
I2C_OAR1(i2c) = (uint16_t)(I2C_OAR1_ADDMODE | slave); I2C_OAR1(i2c) = (uint16_t)(I2C_OAR1_ADDMODE | slave);
} }
/*---------------------------------------------------------------------------*/
/** @brief I2C Set the secondary 7 bit Slave Address for the Peripheral.
This sets a secondary address for Slave mode operation, in 7 bit form.
@param[in] i2c Unsigned int32. I2C register base address @ref i2c_reg_base.
@param[in] slave Unsigned int8. Slave address 0...127.
*/
void i2c_set_own_7bit_slave_address_two(uint32_t i2c, uint8_t slave)
{
uint16_t val = (uint16_t)(slave << 1);
I2C_OAR2(i2c) = val;
}
/*---------------------------------------------------------------------------*/
/** @brief I2C Enable dual addressing mode for the Peripheral.
Both OAR1 and OAR2 are recognised in 7-bit addressing mode.
@param[in] i2c Unsigned int32. I2C register base address @ref i2c_reg_base.
*/
void i2c_enable_dual_addressing_mode(uint32_t i2c)
{
I2C_OAR2(i2c) |= I2C_OAR2_ENDUAL;
}
/*---------------------------------------------------------------------------*/
/** @brief I2C Disable dual addressing mode for the Peripheral.
Only OAR1 is recognised in 7-bit addressing mode.
@param[in] i2c Unsigned int32. I2C register base address @ref i2c_reg_base.
*/
void i2c_disable_dual_addressing_mode(uint32_t i2c)
{
I2C_OAR2(i2c) &= ~(I2C_OAR2_ENDUAL);
}
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/
/** @brief I2C Set Peripheral Clock Frequency. /** @brief I2C Set Peripheral Clock Frequency.