0

While working with Simplicity Studio and Silabs EFM8BB3 (8051 based SoC), I'm observing a very slow transfer rate with a huge pause (up-to 60 ms) in between each byte transfer, as well as (up-to 160 ms) between complete messages on i2c protocol over smbus master interface.

Why is the transfer rate so slow, and is there anything I can do to resolve it?

Oleg Kokorin
  • 2,288
  • 2
  • 16
  • 28

1 Answers1

1

the problem being resolved by activating another timer responsible only for SCL delay/timeout recognition (beware, it's not so clear explained in the datasheet). on Silabs EFM8BB3 chipset the timer T2 has a role to provide i2c data stream transfer modulation. the timer T3 has a role to provide i2c SCL timeout handling. to be able to decrease pause in between bytes, T3 has to be enabled. T3 must be configured in two timers, 8-bit auto reload mode with low byte interrupt enabled. T3 low byte overflow frequency has to be set to 50000 (reload value is 215) in case of 400KHz i2c transfer rate. simplified interrupt handler (just to drop the interrupt flag) has to be implemented. T3 high byte overflow frequency could be set to the lowest available 8000 (reload value is 1). the SMBUS interface entity require Enable SMBus SCL Timeout Detection activated.

Oleg Kokorin
  • 2,288
  • 2
  • 16
  • 28
  • 1
    beware, SILABS released "2017 Christmas present" bug loosing proper Timer3 SYSCLK config and forcing EXTCLK instead. use following post-init config to reverse Timer3 into use of the internal CLK. `SFRPAGE = 0x00; CKCON0 = CKCON0_SCA__SYSCLK_DIV_12 | CKCON0_T0M__PRESCALE | CKCON0_T2MH__SYSCLK | CKCON0_T2ML__SYSCLK | CKCON0_T3MH__EXTERNAL_CLOCK | CKCON0_T3ML__SYSCLK | CKCON0_T1M__SYSCLK;` – Oleg Kokorin Dec 22 '17 at 16:16