[PATCH 3/4] atsam: libraries: new clock config function
Alexander Krutwig
alexander.krutwig at embedded-brains.de
Thu Jun 16 13:48:46 UTC 2016
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
More information about the devel
mailing list