diff --git a/hardware/arduino/sam/libraries/Wire/Wire.cpp b/hardware/arduino/sam/libraries/Wire/Wire.cpp index 696a1ecaa..bc8bef7ec 100644 --- a/hardware/arduino/sam/libraries/Wire/Wire.cpp +++ b/hardware/arduino/sam/libraries/Wire/Wire.cpp @@ -126,6 +126,10 @@ void TwoWire::begin(int address) { begin((uint8_t) address); } +void TwoWire::end(void) { + TWI_Disable(twi); +} + void TwoWire::setClock(uint32_t frequency) { twiClock = frequency; TWI_SetClock(twi, twiClock, VARIANT_MCK); diff --git a/hardware/arduino/sam/libraries/Wire/Wire.h b/hardware/arduino/sam/libraries/Wire/Wire.h index 76cc3d267..2730e2c41 100644 --- a/hardware/arduino/sam/libraries/Wire/Wire.h +++ b/hardware/arduino/sam/libraries/Wire/Wire.h @@ -29,12 +29,16 @@ #define BUFFER_LENGTH 32 + // WIRE_HAS_END means Wire has end() +#define WIRE_HAS_END 1 + class TwoWire : public Stream { public: TwoWire(Twi *twi, void(*begin_cb)(void)); void begin(); void begin(uint8_t); void begin(int); + void end(); void setClock(uint32_t); void beginTransmission(uint8_t); void beginTransmission(int); diff --git a/hardware/arduino/sam/system/libsam/include/twi.h b/hardware/arduino/sam/system/libsam/include/twi.h index 0967089f7..76ecd9c80 100644 --- a/hardware/arduino/sam/system/libsam/include/twi.h +++ b/hardware/arduino/sam/system/libsam/include/twi.h @@ -71,6 +71,8 @@ extern void TWI_SetClock( Twi *pTwi, uint32_t dwTwCk, uint32_t dwMCk ); extern void TWI_ConfigureSlave(Twi *pTwi, uint8_t slaveAddress); +extern void TWI_Disable(Twi *pTwi); + extern void TWI_Stop(Twi *pTwi); extern void TWI_StartRead( diff --git a/hardware/arduino/sam/system/libsam/source/twi.c b/hardware/arduino/sam/system/libsam/source/twi.c index 4366e17c1..a00e1b519 100644 --- a/hardware/arduino/sam/system/libsam/source/twi.c +++ b/hardware/arduino/sam/system/libsam/source/twi.c @@ -100,13 +100,8 @@ void TWI_ConfigureMaster( Twi* pTwi, uint32_t dwTwCk, uint32_t dwMCk ) /* SVEN: TWI Slave Mode Enabled */ pTwi->TWI_CR = TWI_CR_SVEN ; - /* Reset the TWI */ - pTwi->TWI_CR = TWI_CR_SWRST ; - pTwi->TWI_RHR ; - /* TWI Slave Mode Disabled, TWI Master Mode Disabled. */ - pTwi->TWI_CR = TWI_CR_SVDIS ; - pTwi->TWI_CR = TWI_CR_MSDIS ; + TWI_Disable(pTwi); /* Set master mode */ pTwi->TWI_CR = TWI_CR_MSEN ; @@ -156,15 +151,7 @@ void TWI_ConfigureSlave(Twi *pTwi, uint8_t slaveAddress) { uint32_t i; - /* TWI software reset */ - pTwi->TWI_CR = TWI_CR_SWRST; - pTwi->TWI_RHR; - - /* Wait at least 10 ms */ - for (i=0; i < 1000000; i++); - - /* TWI Slave Mode Disabled, TWI Master Mode Disabled*/ - pTwi->TWI_CR = TWI_CR_SVDIS | TWI_CR_MSDIS; + TWI_Disable(pTwi); /* Configure slave address. */ pTwi->TWI_SMR = 0; @@ -178,6 +165,27 @@ void TWI_ConfigureSlave(Twi *pTwi, uint8_t slaveAddress) assert( (pTwi->TWI_CR & TWI_CR_SVDIS)!= TWI_CR_SVDIS ) ; } +/** + * \brief Disables the TWI. + * \param pTwi Pointer to an Twi instance. + */ +void TWI_Disable(Twi *pTwi) +{ + assert( pTwi ) ; + + uint32_t i; + + /* TWI software reset */ + pTwi->TWI_CR = TWI_CR_SWRST; + pTwi->TWI_RHR; + + /* Wait at least 10 ms */ + for (i=0; i < 1000000; i++); + + /* TWI Slave Mode Disabled, TWI Master Mode Disabled*/ + pTwi->TWI_CR = TWI_CR_SVDIS | TWI_CR_MSDIS; +} + /** * \brief Sends a STOP condition on the TWI. * \param pTwi Pointer to an Twi instance. diff --git a/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a b/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a index 4ccce8bd6..62a27a8e4 100644 Binary files a/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a and b/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a differ diff --git a/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt b/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt index 5e8ca2372..9b614811b 100644 --- a/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt +++ b/hardware/arduino/sam/variants/arduino_due_x/libsam_sam3x8e_gcc_rel.a.txt @@ -72,7 +72,6 @@ pmc.o: 00000000 T pmc_switch_udpck_to_upllck pwmc.o: -00000000 r C.9.8054 00000000 t FindClockConfiguration 00000000 T PWMC_ConfigureChannel 00000000 T PWMC_ConfigureChannelExt @@ -100,14 +99,14 @@ pwmc.o: 00000000 T PWMC_SetSyncChannelUpdateUnlock 00000000 T PWMC_WriteBuffer U __assert_func -00000000 r __func__.6635 -00000000 r __func__.6646 -00000000 r __func__.6661 -00000000 r __func__.6672 -00000000 r __func__.6683 -00000000 r __func__.6690 -00000000 r __func__.6774 -00000000 r __func__.6780 +00000000 r __func__.6793 +00000000 r __func__.6804 +00000000 r __func__.6819 +00000000 r __func__.6830 +00000000 r __func__.6841 +00000000 r __func__.6848 +00000000 r __func__.6932 +00000000 r __func__.6938 rtc.o: 00000000 T RTC_ClearSCCR @@ -123,9 +122,9 @@ rtc.o: 00000000 T RTC_SetTime 00000000 T RTC_SetTimeAlarm U __assert_func -00000000 r __func__.6632 -00000000 r __func__.6641 -00000000 r __func__.6646 +00000000 r __func__.6790 +00000000 r __func__.6799 +00000000 r __func__.6804 rtt.o: 00000000 T RTT_EnableIT @@ -134,8 +133,8 @@ rtt.o: 00000000 T RTT_SetAlarm 00000000 T RTT_SetPrescaler U __assert_func -00000000 r __func__.6639 -00000000 r __func__.6647 +00000000 r __func__.6797 +00000000 r __func__.6805 spi.o: 00000000 T SPI_Configure @@ -161,9 +160,9 @@ tc.o: 00000000 T TC_Start 00000000 T TC_Stop U __assert_func -00000000 r __func__.6634 -00000000 r __func__.6640 -00000000 r __func__.6646 +00000000 r __func__.6792 +00000000 r __func__.6798 +00000000 r __func__.6804 timetick.o: 00000000 T GetTickCount @@ -178,6 +177,7 @@ twi.o: 00000000 T TWI_ByteSent 00000000 T TWI_ConfigureMaster 00000000 T TWI_ConfigureSlave +00000000 T TWI_Disable 00000000 T TWI_DisableIt 00000000 T TWI_EnableIt 00000000 T TWI_GetMaskedStatus @@ -191,19 +191,20 @@ twi.o: 00000000 T TWI_TransferComplete 00000000 T TWI_WriteByte U __assert_func -00000000 r __func__.7004 -00000000 r __func__.7010 -00000000 r __func__.7028 -00000000 r __func__.7032 -00000000 r __func__.7039 -00000000 r __func__.7043 -00000000 r __func__.7048 -00000000 r __func__.7056 -00000000 r __func__.7070 -00000000 r __func__.7075 -00000000 r __func__.7079 -00000000 r __func__.7084 -00000000 r __func__.7088 +00000000 r __func__.7151 +00000000 r __func__.7157 +00000000 r __func__.7172 +00000000 r __func__.7176 +00000000 r __func__.7184 +00000000 r __func__.7191 +00000000 r __func__.7195 +00000000 r __func__.7200 +00000000 r __func__.7208 +00000000 r __func__.7222 +00000000 r __func__.7227 +00000000 r __func__.7231 +00000000 r __func__.7236 +00000000 r __func__.7240 usart.o: 00000000 T USART_Configure @@ -222,7 +223,7 @@ usart.o: 00000000 T USART_Write 00000000 T USART_WriteBuffer U __assert_func -00000000 r __func__.6928 +00000000 r __func__.7068 wdt.o: 00000000 T WDT_Disable @@ -300,7 +301,6 @@ startup_sam3xa.o: U main adc.o: -00000000 r C.0.8146 00000000 T adc_configure_power_save 00000000 T adc_configure_sequence 00000000 T adc_configure_timing @@ -485,12 +485,12 @@ efc.o: 00000000 T efc_get_wait_state 00000000 T efc_init 00000000 T efc_perform_command -00000070 T efc_perform_fcr +0000006c T efc_perform_fcr 00000000 T efc_perform_read_sequence 00000000 T efc_set_flash_access_mode 00000000 T efc_set_wait_state -0000006c T efc_write_fmr -00000000 b iap_perform_command.6909 +00000068 T efc_write_fmr +00000000 b iap_perform_command.7049 gpbr.o: 00000000 T gpbr_read @@ -568,7 +568,6 @@ emac.o: 00000000 T emac_phy_write 00000000 t emac_reset_rx_mem 00000000 t emac_reset_tx_mem -00000000 t emac_wait_phy.clone.1 00000000 b gs_rx_desc 00000000 b gs_tx_callback 00000000 b gs_tx_desc