@@ -317,6 +317,9 @@ void TwoWire::begin(void) {
317317
318318 m_i2c_cfg.p_extend = &m_i2c_extend;
319319 m_i2c_cfg.p_callback = WireMasterCallback;
320+
321+ m_i2c_extend.timeout_mode = IIC_MASTER_TIMEOUT_MODE_SHORT;
322+ m_i2c_extend.timeout_scl_low = IIC_MASTER_TIMEOUT_SCL_LOW_DISABLED;
320323 }
321324
322325 m_i2c_cfg.channel = channel;
@@ -325,7 +328,7 @@ void TwoWire::begin(void) {
325328 m_i2c_cfg.addr_mode = (address_mode == ADDRESS_MODE_7_BITS) ? I2C_MASTER_ADDR_MODE_7BIT : I2C_MASTER_ADDR_MODE_10BIT;
326329 m_i2c_cfg.p_transfer_tx = NULL ;
327330 m_i2c_cfg.p_transfer_rx = NULL ;
328-
331+
329332 m_i2c_cfg.p_context = &m_i2c_cfg;
330333 m_i2c_cfg.ipl = (12 );
331334
@@ -457,13 +460,13 @@ uint8_t TwoWire::read_from(uint8_t address, uint8_t* data, uint8_t length, unsig
457460 }
458461 if (err == FSP_SUCCESS) {
459462 if (m_read != nullptr ) {
463+ bus_status = WIRE_STATUS_UNSET;
460464 err = m_read (&m_i2c_ctrl,data,length,!sendStop);
461465 }
462466 }
463- bus_status = WIRE_STATUS_UNSET;
464- while (timeout_ms > 0 && bus_status == WIRE_STATUS_UNSET) {
465- timeout_ms--;
466- delay (1 );
467+ timeout_ms = millis () + timeout_ms;
468+ while (millis () < timeout_ms && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) {
469+
467470 }
468471 }
469472
@@ -485,13 +488,13 @@ uint8_t TwoWire::write_to(uint8_t address, uint8_t* data, uint8_t length, unsign
485488 }
486489 if (err == FSP_SUCCESS) {
487490 if (m_write != nullptr ) {
491+ bus_status = WIRE_STATUS_UNSET;
488492 err = m_write (&m_i2c_ctrl,data,length,!sendStop);
489493 }
490494 }
491- bus_status = WIRE_STATUS_UNSET;
492- while (err == FSP_SUCCESS && timeout_ms > 0 && bus_status == WIRE_STATUS_UNSET) {
493- timeout_ms--;
494- delay (1 );
495+ timeout_ms = millis () + timeout_ms;
496+ while (millis () < timeout_ms && bus_status == WIRE_STATUS_UNSET && err == FSP_SUCCESS) {
497+
495498 }
496499
497500 if (err != FSP_SUCCESS) {
@@ -529,14 +532,20 @@ void TwoWire::setClock(uint32_t freq) {
529532 if (is_master) {
530533 m_i2c_cfg.rate = (i2c_master_rate_t )freq;
531534
535+ int clock_divisor = (R_FSP_SystemClockHzGet (BSP_FEATURE_SCI_CLOCK) / 48000000u ) - 1 ;
536+
532537 if (is_sci) {
538+ m_sci_i2c_extend.clock_settings .clk_divisor_value = 0 ;
539+ m_sci_i2c_extend.clock_settings .cycles_value = 15 ;
540+ m_sci_i2c_extend.clock_settings .snfr_value = (1 );
533541 switch (m_i2c_cfg.rate ) {
534542 case I2C_MASTER_RATE_STANDARD:
535543 m_sci_i2c_extend.clock_settings .brr_value = 14 ;
536544 m_sci_i2c_extend.clock_settings .mddr_value = 255 ;
537545 m_sci_i2c_extend.clock_settings .bitrate_modulation = false ;
538546 break ;
539547 case I2C_MASTER_RATE_FAST:
548+ default :
540549 m_sci_i2c_extend.clock_settings .brr_value = 2 ;
541550 m_sci_i2c_extend.clock_settings .mddr_value = 204 ;
542551 m_sci_i2c_extend.clock_settings .bitrate_modulation = true ;
@@ -547,18 +556,20 @@ void TwoWire::setClock(uint32_t freq) {
547556 case I2C_MASTER_RATE_STANDARD:
548557 m_i2c_extend.clock_settings .brl_value = 27 ;
549558 m_i2c_extend.clock_settings .brh_value = 26 ;
550- m_i2c_extend.clock_settings .cks_value = 2 ;
559+ m_i2c_extend.clock_settings .cks_value = 2 + clock_divisor ;
551560 break ;
552561 case I2C_MASTER_RATE_FAST:
553- m_i2c_extend.clock_settings .brl_value = 24 ;
554- m_i2c_extend.clock_settings .brh_value = 23 ;
555- m_i2c_extend.clock_settings .cks_value = 0 ;
562+ m_i2c_extend.clock_settings .brl_value = 16 ;
563+ m_i2c_extend.clock_settings .brh_value = 15 ;
564+ m_i2c_extend.clock_settings .cks_value = 0 + clock_divisor ;
556565 break ;
566+ #if BSP_FEATURE_IIC_FAST_MODE_PLUS
557567 case I2C_MASTER_RATE_FASTPLUS:
558568 m_i2c_extend.clock_settings .brl_value = 6 ;
559569 m_i2c_extend.clock_settings .brh_value = 5 ;
560570 m_i2c_extend.clock_settings .cks_value = 0 ;
561571 break ;
572+ #endif
562573 }
563574 }
564575 }
0 commit comments