I am trying to interface the Si570 chip (numerical controlable oscillator) by I2C bus using the wires.h library. I can watch the signal on a 100MHz memory scope and on a bus pirate analyzer. Both signals look correctly compared by the I2C bus specification (Philips Semiconductors, V2.1, january 2000). The unit has a fixed address which is burned in by Silicon Labs, mostly 55h.
Cause using high frequencies inside the Si570, I used a coper cladded board as ground, very short wires for wiring ground and 100nF + 1uFTantal directly at the power supply pin. I use a voltage regulator 3,3V vor this unit and at the moment 1K pullup resistors on this voltage. The arduino nano is working with open collector outputs for the I2C lines.
I made dozens of approaches to adress the unit. The signals looks fine. The address is tranfered the right way (MSB first, 55h shifted to aah, R/W included). I tried to change the address in a loop between 0 and 127. There is no reaction from the unit. The answer is always NACK (bit 9 high). I also changed the unit to a new one, no difference. So I run out of ideas..... :disappointed_relieved:
The Si570 is used successfully in other ham projects , but I did not find any project using arduino code. Is there someone with experience or some additional ideas how to fix the problem ?
I haven't used one of those chips and a quick perusal of the datasheet only brings up a couple of questions/suggestions. The datasheet says that both SDA and SCL must be connected to the positive supply via external pullup resistors. A couple of the diagrams also seem to imply that the SDA won't work unless OE is asserted. Do you assert OE when you try to find the device?
tnx for reacting. Indeed I have pullup resistors to 3,3V at SDA and SCL. Looking to the datasheet OE has an internal pullup resistor, so I left it open. I just looked to the schematics of another project and they connect OE to +3,3V ! Thanks for your idea, I will try. Maybe there is positive effect !
After reading tons of internet documents I have in my mind someone told about I2C-units which do not answer to addressing with ACKNOWLEDGE-bit. Nevertheless the units work internal correct. If Si570 works like that, the arduino-I2C-driver stops working after receiving a NACK. I analyzed drivers from other projects and found most oft the successful project use own I2C-drivers by writing and reading normal portpins. So the protocol runs in software. In this case it is easy to ignore a NACK signal.
My last chance is measuring the I2C-bus in running projects.. :cold_sweat:. If I have a result I will post it here.
some weeks ago I found in a remark in the description of an assembly set: "It is wellknown, that the Si570 (especially the CMOS version) has a disturbed I2C communication, if the generator output does not work against a load resistor ". Sounds strange and there are no hints neither in the datasheets or in application note AN-291. I soldered a 100 ohm resistor from the (until now unconnected) output pin to ground. After that all I2C software was working correctly ! So at least the CMOS version seems to couple back internally from the generator output. The problem is: there is no way to find out this problem by measuring. The output showed before a nice signal at the initial frequency and the supply current was OK. Both values have been in the area of datasheet values.
The most simple arduino software samples to startup own development I got from WA5DBU after a email request.
Success with own eperiments...
I am starting with the project combinig Arduino and Si570 and because
I am total beginner in I2C communication, I was looking in Internet and I have found your posting.
I have aslo Si570 CMOS version up to 210 MHz. The datasheet says, that the output current
should be 32 mA for tests. It seems that your 100 Ohm resistor is just at the limit.
Did You try it with higher value of the resistor too ?
I do not like to load Si570 more than really necessary.
Best regards and 73! Jirka OK1MWW
I did not test it with other resistors. The question of the resistor is not really a question of load to the Si570. If you want to avoid oscillations or emc problems to the i2C logic you should terminate the output with its characteristic internal resistance. It is the best way to get energy out of the chip and not into feedback loops :drooling_face:. By the way: my Si570 does not feel warm if I touch it...
Looking to table 4 of the Si570 datasheet you can find testing conditions
- 50 ohms against a Voltage in the middle between Vcc and ground
- 100 ohms between the output pins.
So my resistor is not far from that...
But in fact I will try to measure the internal resistance by measuring the output voltage with lets say 200 ohms and then changing the resistance to 100 ohms and measuring again. Then I can calculate the current in both cases. The formula simply is:
Rinternal = delta Uout /delta Iout
For me is it important because I have to lead the signal via a coaxial cable to another box with 50 ohms input resistance.
many thanks for reply. I am just back in the project after some
other activity. Now I am trying to set up the communication with Si570
and at the moment I am not sure how to simulate open collector
to interface ATMEGA 328 to Si570. Is it possible to set output value to
LOW and then just switch between input ( simulate log Hi at 3.3 V with
external 4k7 resistors at SDA and SCL) and output ( giving the real Low out ) ?
I need just to program one single frequency , therefore all the availabel
libraries are to complex for me and I am just a beginner in C language.
73 ! Jirka OK1MWW
"It is wellknown, that the Si570 (especially the CMOS version) has a disturbed I2C communication, if the generator output does not work against a load resistor "
Afaik the 100ohm resistor is required with the LVDS version only, not the CMOS one. That must be an other issue with your sw or pcb design there. I am running a softrock sdr with the CMOS version and attiny85 as the usb/i2c converter and it works fine.
I had the same problem talking to the Si570 from a Raspberry Pi Model 3B via I2C-1.
Turned out to be a hold time violation - SDA was going high to low too soon compared to SCl high to low.
I added a 68pf capacitor to ground on the SDA line. Now hold time is 180 ns; all works perfectly.