I2C device needs to start at 10 kHz clock rate

I am working with an Si4844 AM/FM/SW radio and it uses I2C for communications. Here is what the document states for the I2C clock speed:

"*Note: The ATDD device requires a slower I2C clock for proper powerup immediately after a hardware reset; i.e., no higher than 10 kHz is recommended. After the powerup command sequence is succeeded, the host controller can switch to a higher speed."

Is there a way to get the standard I2C library to run with a 10 kHz clock speed? If the standard library can't do that, are there alternative libraries that will?

Please note that I will probably need step by step instructions for doing this particular task.

Thanks

The Si4837 doesn't have that startup sequence ? Software for controlling Si4840/44 with Arduino - Project Guidance - Arduino Forum

Page of the chip : http://www.silabs.com/products/audio/fm-am-receiver/Pages/si4840-44.aspx

That startup sequence is very unusual. I think it is running internally at a low clock.
The Wire library can do at least 50kHz up to 400kHz for a normal Arduino Uno.
The default is 100kHz. A function Wire.setClock set the clock speed.

Wire.setClock(100000L);

According to this : Arduino Playground - WireLibraryDetailedReference
The clock speed is 31kHz to 400kHz.

Which Arduino board do you use ?
The chip is 3.3V. How do you connect it to the Arduino board ?
Are there other chips connected to the I2C bus ?

The software implemenation of the Wire library can go lower than the normal Wire library, as low as 1Hz. It is called SoftwareWire and is in the Library Manager in the Arduino IDE.

I see many troubles ahead. According to the datasheet: "The pulse width of the I2C clock signal (i.e., high to low level ratio) must be equal or greater than 50%. What a weird requirement. I don't know if the Wire library or SoftwareWire do that. I don't understand what it means. Should the SCL be longer high than low, or the other way around ?

You can change the clock speed easily enough.

Koepel:
I see many troubles ahead. According to the datasheet: "The pulse width of the I2C clock signal (i.e., high to low level ratio) must be equal or greater than 50%.

I think you will find the hardware does 50% which meets the requirements.

Thanks Nick. If the hardware is 50%, and the clock can be set very low, then the normal Wire library should be used.

I looked in the datasheet. The prescaler can be 1, 4, 16, 64. The TWBR can be 1 to 255 (I think). That means that the lowest clock rate for an Arduino Uno is 490Hz.

PickyBiker, to get 10kHz, set the prescaler to 4, and the TWBR to 198.

Then you have to find the proper way for the startup sequence.
After that, it is possible to set the I2C speed higher, but not higher than 50kHz. That is still very slow. I would keep the speed at 10kHz.

1 Like

Thanks, for all the responses. Let me answer some questions:

First, it is the arduino UNO that I am using in development, and it will ultimately be the nano.

Second, I am using an I2C compatible level changer -> 4-channel I2C-safe Bi-directional Logic Level Converter [BSS138] : ID 757 : $3.95 : Adafruit Industries, Unique & fun DIY electronics and kits between the arduino and Si4844 IC.

Third, the 50% duty cycle applies to powering up with a clock faster than 10 kHz, but as some have pointed out, it appears the hardware does that anyway.

It looks like the way is clear to use the normal wire library with the settings outlined by koepel, "to get 10kHz, set the prescaler to 4, and the TWBR to 198"

What a great FORUM... Thank you all!

Unfortunately we are about to leave for a 5 day visit, but this setup will be tested promptly on our return.

Hey all.
When do you call Wire.setClock()? Before or after Wire.begin()?