This was necessary to generate set clock function for i2c driver without resetting the whole module --- .../arm/atsam/libraries/libchip/include/twi.h | 2 ++ .../arm/atsam/libraries/libchip/source/twi.c | 33 ++++++++++++++-------- 2 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/twi.h b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/twi.h index 6a5de36..07471a1 100644 --- a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/twi.h +++ b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/twi.h @@ -68,6 +68,8 @@ extern "C" { * External function *----------------------------------------------------------------------------*/ +extern void TWI_ConfigureClock(Twihs *pTwi, uint32_t twck, uint32_t mck); + extern void TWI_ConfigureMaster(Twihs *pTwi, uint32_t twck, uint32_t mck); extern void TWI_ConfigureSlave(Twihs *pTwi, uint8_t slaveAddress); diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/twi.c b/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/twi.c index 29faee6..5012ea5 100644 --- a/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/twi.c +++ b/c/src/lib/libbsp/arm/atsam/libraries/libchip/source/twi.c @@ -102,25 +102,15 @@ uint32_t twi_send_stop = 0; * Exported functions *----------------------------------------------------------------------------*/ -/** - * \brief Configures a TWI peripheral to operate in master mode, at the given - * frequency (in Hz). The duty cycle of the TWI clock is set to 50%. - * \param pTwi Pointer to an Twihs instance. - * \param twck Desired TWI clock frequency. - * \param mck Master clock frequency. - */ -void TWI_ConfigureMaster(Twihs *pTwi, uint32_t dwTwCk, uint32_t dwMCk) +void TWI_ConfigureClock(Twihs *pTwi, uint32_t dwTwCk, uint32_t dwMCk) { uint32_t dwCkDiv = 0; uint32_t dwClDiv; uint32_t dwOk = 0; - TRACE_DEBUG("TWI_ConfigureMaster()\n\r"); + TRACE_DEBUG("TWI_ConfigureClock()\n\r"); assert(pTwi); - /* Reset the TWI */ - pTwi->TWIHS_CR = TWIHS_CR_SWRST; - /* Configure clock */ while (!dwOk) { dwClDiv = ((dwMCk / (2 * dwTwCk)) - 4) / (1 << dwCkDiv); @@ -135,6 +125,25 @@ void TWI_ConfigureMaster(Twihs *pTwi, uint32_t dwTwCk, uint32_t dwMCk) TRACE_DEBUG("Using CKDIV = %u and CLDIV/CHDIV = %u\n\r", dwCkDiv, dwClDiv); pTwi->TWIHS_CWGR = (dwCkDiv << 16) | (dwClDiv << 8) | dwClDiv; +} + + +/** + * \brief Configures a TWI peripheral to operate in master mode, at the given + * frequency (in Hz). The duty cycle of the TWI clock is set to 50%. + * \param pTwi Pointer to an Twihs instance. + * \param twck Desired TWI clock frequency. + * \param mck Master clock frequency. + */ +void TWI_ConfigureMaster(Twihs *pTwi, uint32_t dwTwCk, uint32_t dwMCk) +{ + TRACE_DEBUG("TWI_ConfigureMaster()\n\r"); + assert(pTwi); + + /* Reset the TWI */ + pTwi->TWIHS_CR = TWIHS_CR_SWRST; + + TWI_ConfigureClock(pTwi, dwTwCk, dwMCk); /* TWI Slave Mode Disabled. */ pTwi->TWIHS_CR = TWIHS_CR_SVDIS; -- 1.8.4.5 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel