Reply
Posts: 1
Registered: ‎02-18-2014

Communication problem with Si8902

[ Edited ]

Hello all!

I have a problem in communication with ADC Si8902. It send me wrong data when I poll it for ADC conversion result in Demand mode. I put to CNFG_0 Command byte 0xE3 and get back 0xC7 with ADC_H, ADC_L bytes are zero. I read AIN2 analog channel with around 1 V on it. On other analog inputs 0 V is present.  When I put to CNFG_0 Command byte 0xD3 I get back 0xC8 with ADC_H, ADC_L bytes are zero. On attached oscillograms you may see all signals on the following pins: SDO, SDI, SCLK, EN. When SDO is blue, SDI is pink, SCLK is yellow and EN is green. Images TEK0000 and TEK0001 are one oscillogram split into to image. I don't tested Si8902 in Burst mode.

Thanks!

Posts: 1
Registered: ‎10-14-2014

Re: Communication problem with Si8902

Hi!

I have the same problem with you. I can get CNFG_0 and ADC_H but am unable to get ADC_L.

If you solve this issue, would you share your expertise with me?

 

Thanks.

Highlighted
Posts: 9
Registered: ‎09-15-2014

Re: Communication problem with Si8902

Hi,

 

The best way to get help with your issue is to submit a technical support request on the Silicon Labs website. Have you created a support request before?

 

If not:

 

1. Go to http://www.silabs.com/
2. Click on the "Support & Training" menu at the top of the page
3. Click on the "Technical Support" link toward the bottom of the menu
4. Log in using your web site credentials. You may need to create a new set if this is your first time entering a support ticket, specifically.
5. Follow the directions on the subsequent pages to get your support ticket into the system.

Posts: 1
Registered: ‎01-02-2015

Re: Communication problem with Si8902

Hi Alex,

Did you solve your problem? Because I've got the same....

I'm trying to read CH0, demand mode,  I send 0xCF, 0x00 and 0x01,  and I read ADCH, 0, 0xCF. I really don't understand the protocol, but it's clear that is different from the datasheet!

Franco

Posts: 3
Registered: ‎04-16-2013

Re: Communication problem with Si8902

Hello

I am experiencing the exact same problem. Only able to receive 0x00, command byte and ADC_L. I think I have tried all possible settings. Has anyone figured out how to solve this?

 

Audun

Posts: 3
Registered: ‎04-16-2013

Re: Communication problem with Si8902

I solved this by making sure SDI line was high when reading from the device. 

Posts: 2
Registered: ‎07-23-2015

Re: Communication problem with Si8902

Hi Folks, glad to hear that there are some pepople experiencing exact the same problems that I have. Not so much bit errors, but all bytes messed up, delayed, missing (especially ADC_L) . Not at all the structure described in the datasheet. I wrote a (lengthy, yawn!) description of all the things I tried without success in a different thread here on the forum (http://community.silabs.com/t5/Wireless/Communication-and-control-of-the-Si890x/m-p/138599/highlight... @audunhystad: How do you implement driving the SDI line high when reading from the device. Do you use a handmade bit-bang transfer? "Normally" SPI shifts out on SDI (=MOSI) whatever you put into the transfer register while shifting in (i. e. reading from the device) the bits on SDO (MISO) on the opposite side. Hmmm, maybe you use a 0xFF as outgoing data (after sending CONFG_0)? Any help appreciated. Keep the thing going (I bought 10 of those chips in advance :-) ) Regards, Dominik.
Posts: 3
Registered: ‎04-16-2013

Re: Communication problem with Si8902

I do not use hand made bit-bang. I use Linux userland SPI driver, with a hardware SPI on an SAMA5D36 SOC. As you said I just send 0xFF after sending the CONFIG_0 to keep SDI line high. The data I get is not according to datasheet. After some days work I managed to develop a routine to decode the data. I only use AN0 and AN1 inputs. It has been a while since I did this now, so I have forgotten the details. But I think is was important to toggle EN  (chip select) for every byte send and read. I also read 4 bytes, because the data is not always located in the same bytes, and the use bit pattern match to find high and low data bytes. Below is the function I use in C++. The filter stuff at the end is need because of the signal I sample, and not the Si8902

int AdcSi8902::ReadAdcChanel( int Ch)
{
	if( Ch < 0 || Ch > 2 )
	{
		throw runtime_error( "ADC channel out of range");
	}


	char CmdByte = 0b11001011 | (Ch << 4);	//VDD as ref, demand mode, PGA gain 1
	vector<char> Rx(5,0);

	Rx[0]=_Spi.SendReceiveOne( 1, CmdByte );
	Rx[1]=_Spi.SendReceiveOne( 1, 0xff );
	Rx[2]=_Spi.SendReceiveOne( 1, 0xff );
	Rx[3]=_Spi.SendReceiveOne( 1, 0xff );
	Rx[4]=_Spi.SendReceiveOne( 1, 0xff );

	int Data = -1;

	char HighPattern = 0b10000000  | (Ch << 4); //Start with 10 and 2 bits channel
	char LowPattern = 0x00;
	for( int i=0; i<2; ++i )
	{
		//Search in two locations.
		if( ((Rx[i+2] & 0b11110000) == HighPattern) && ((Rx[i+3] & 0b10000001) == LowPattern)  )
		{
				Data = 0;
				Data = ( (Rx[i+2] & 0b00001111) << 6 ) + ( Rx[i+3] >> 1 );
		}
	}
	if( Data == -1 )
	{
		debug( "U16 does not have the correct high byte low byte pattern. Buffer : %02x %02x %02x %02x %02x\n", Rx[0], Rx[1], Rx[2], Rx[3], Rx[4] );
	}
	int Filtered = _Filter[Ch].Execute( Data);
	if( _File.size() > 0 )
	{
		Store( Ch, Data, Filtered, Rx );
	}

	return Filtered;
}
Posts: 1
Registered: ‎08-12-2015

Re: Communication problem with Si8902

The solution that worked for our project was a combination of audunhystad and ariel_rod.

http://community.silabs.com/t5/Optical-RH-Temp-Sensor/Si8902-SPI-protocol/td-p/129424

The Si8902 operates in Mode 3 SPI which requires the SCLK to be high during idle.

This is an example from http://www.silabs.com/Support%20Documents/TechnicalDocs/AN711.pdf

Si8902-SPI2.PNG

This is the data captured that I captured interfacing to the SI8902 and all of the data is in the correct locations/byte every time. This example was running with a 2.5MHz SCLK

Si8902-SPI.PNG

 

 

Posts: 2
Registered: ‎04-26-2016

Re: Communication problem with Si8902

Posts: 1
Registered: ‎05-04-2016

Re: Communication problem with Si8902

We struggled with the same issues getting "Si8902 ADC Demand Mode" working that others have had here as well.  We want to share the final solution because the Si8902 data sheet and the Silicon Labs tech support dont communicate how to make this part work...

 

FYI, When it is failing, you will see the 3 ADC read words show up in the wrong order with ocasional FF's spaced in between.

 

To get it working, you must:

- Have SDI driven high after the command byte is sent.

- Keep EN low for THE WHOLE access including the command byte and the 3 reads.

 

Also, we extended out the 8uS delay after the command byte is sent to 12uS.  Not sure if that made any difference.

 

See photo.  Sorry about the trace name scribbling from the MS Snipping tool...:

 

SPI__Si_8902_Good_Read.JPG