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.
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.
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 ?
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.
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.