problem med i2c och picar

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Roze
Inlägg: 113
Blev medlem: 30 april 2006, 17:11:11
Ort: HUDDINGE
Kontakt:

problem med i2c och picar

Inlägg av Roze »

Tjo, nån som har erfarenhet av i2c och picar? Min i2c hänger sig nämnligen då och då, har inte exakt lyckats lista ut vart det är den hänger sig, då jag inte har möjlighet till debug-mode på programmeraren.
Om nu ingen orkar felsöka, finns det någe sätt att "starta om"/resetta i2c-modulen utan att behöva starta om hela Mastern?

Jag tror att det är i smI2C_Read_WaitIFAdr (se source) som den fastnar

ps. slavarna krashar inte, och de går på egen matning. reset av mastern brukar räcka
//Mvh, mig

i2c-nätverket ser ut lite löst som följande:

Kod: Markera allt

Master ---> (10m sladd) ---> "hub" (se bild nedan) ---> (2m sladd) ---> Slave 102
                                                    |-> (2m sladd) ---> Slave 110

sladd avser vanlig telefonledning med RJ44-kontakter.

i2c-bussen är kopplad med pullup vid mastern och i övrigt går den bara rakt in på i2c-benen på picarna.
alla picar är 18F2550

Hub-schematics: http://roze.ridorana.se/old/bilder/help/hub.png

och för den som tror att det e mjukvarurelaterat, kod för master:

Kod: Markera allt



typedef enum { 
	smI2C_off				=  0, 
	smI2C_Free				=  1, 
	
	smI2C_Write_WaitSEN		=  2, 
	smI2C_Write_Adr			=  3, 
	smI2C_Write_WaitBF		=  4, 
	smI2C_Write_WaitIF		=  5, 
	smI2C_Write_Data		=  6,
	smI2C_Write_WaitPEN		=  7, 
	
	smI2C_Read_WaitSEN		=  8, 
	smI2C_Read_Adr			=  9, 
	smI2C_Read_WaitBFAdr	= 10, 
	smI2C_Read_WaitIFAdr	= 11, 
	smI2C_Read_Data			= 12,
	smI2C_Read_WaitIF		= 13, 
	smI2C_Read_WaitACKEN	= 14, 
	smI2C_Read_WaitPEN		= 15, 
	smI2C_Read_Finished		= 16
} enumI2C;


typedef struct{
	ubyte 	ubAdr;
	ubyte	ubSize;
	ubyte 	ubCnt;
	ubyte 	*aubData;
	enumI2C State;
} smI2CData;

smI2CData smI2C;


ubyte smI2C_Write(ubyte ubAdr, void *aubData, ubyte ubCount){
	ubyte i, *from, *to;
	
	if(smI2C.State == smI2C_Free){
		
		smI2C.ubCnt   = ubCount;
		smI2C.ubAdr   = ubAdr;
		smI2C.aubData = TempBuff;
		
		from = aubData;
		to   = TempBuff;
	
		for(i=ubCount; i ; i--){
			*to++ = *from++;
		}
		SEN = 1; // Send Start
		smI2C.State = smI2C_Write_WaitSEN;
		return 1;
	}else{
		return 0;
	}
}

ubyte smI2C_Read(ubyte ubAdr, ubyte ubCount )
{
	if(smI2C.State == smI2C_Free){
		
		smI2C.ubCnt   = ubCount;
		smI2C.ubSize  = ubCount;
		smI2C.ubAdr   = ubAdr + 1;
		smI2C.aubData = TempBuff;
	
		TempBuff[0]=255; // extra försäkring om läsning misslyckades
		
		SEN = 1; // Send Start
		smI2C.State = smI2C_Read_WaitSEN;
		return 1;
	}else{
		return 0;	
	}
}

void smI2C_Execute(void){
	
	switch(smI2C.State){
		case smI2C_off:           break;
		case smI2C_Free:          break;
		
		/////////////
		//  Write  //
		/////////////
		
		case smI2C_Write_WaitSEN:  
			if(!SEN){
				smI2C.State = smI2C_Write_Adr; 
			}
			break;
		
		case smI2C_Write_Adr:
			SSPIF = 0;
			SSPBUF = smI2C.ubAdr ;
			
			smI2C.State = smI2C_Write_WaitBF; 
			break;
		
		case smI2C_Write_WaitBF:   
			if(!BF){
				smI2C.State = smI2C_Write_WaitIF; 
			}
			break;
		
		case smI2C_Write_WaitIF:   
			if(SSPIF){
				if(smI2C.ubCnt > 0){ 
					smI2C.State = smI2C_Write_Data;
				}else{
					PEN = 1;          	// Generate Stop Condition 
					smI2C.State = smI2C_Write_WaitPEN;
				}
			}
			break;
		
		case smI2C_Write_Data:     SSPIF = 0;
			SSPBUF = *(smI2C.aubData);
			
			smI2C.aubData++;
			
			smI2C.ubCnt--;
			
			smI2C.State = smI2C_Write_WaitBF; 
			break;
		
		case smI2C_Write_WaitPEN: if( ! PEN ) 
			smI2C.State = smI2C_Free; 
			break;
		
		////////////
		//  Read  //
		////////////
		
		case smI2C_Read_WaitSEN:
			if(!SEN){
				smI2C.State = smI2C_Read_Adr; 
			}
			break;
		
		case smI2C_Read_Adr:
			SSPIF = 0;
			SSPBUF = smI2C.ubAdr;
			
			smI2C.State = smI2C_Read_WaitBFAdr; 
			break;
		
		case smI2C_Read_WaitBFAdr:
			if(!BF){
				smI2C.State = smI2C_Read_WaitIFAdr; 
			}
			break;
		
		case smI2C_Read_WaitIFAdr:
			if(SSPIF){
				if(smI2C.ubCnt > 0){
					smI2C.State = smI2C_Read_Data;
				}else{
					PEN = 1;          	// Generate Stop Condition 
					smI2C.State = smI2C_Read_WaitPEN;
				}
			}
			break;
		
		case smI2C_Read_Data:     
			SSPIF = 0;        	// Clear SPP Interrupt Flag 
			RCEN  = 1;         	// Enable Receive Mode 
			smI2C.State = smI2C_Read_WaitIF;
			break;
		
		case smI2C_Read_WaitIF:
			if(SSPIF){
				*(smI2C.aubData) = SSPBUF;
				if(smI2C.ubCnt != 1){
					ACKDT=0;
				}else{
					ACKDT=1;
				}
				ACKEN=1;          	
		
				smI2C.ubCnt--;
				smI2C.aubData++;
		
				smI2C.State = smI2C_Read_WaitACKEN; 
			} 
			break;
		
		case smI2C_Read_WaitACKEN:
			if(!ACKEN){
				if(smI2C.ubCnt > 0){ 
					smI2C.State = smI2C_Read_Data;
				}else{
					PEN = 1;          	// Generate Stop Condition 
					smI2C.State = smI2C_Read_WaitPEN;
				}
			}
			break;
		
		case smI2C_Read_WaitPEN: 
			if(!PEN){
				smI2C.State = smI2C_Read_Finished; 
			}
			break;
		
		case smI2C_Read_Finished:
			break;
	}
}
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47013
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: problem med i2c och picar

Inlägg av TomasL »

I2C är känsligt för busslast och kapacitanser mm.
Börja med att skippa hubben och max 200mm ledningar med rätt terminering.
Roze
Inlägg: 113
Blev medlem: 30 april 2006, 17:11:11
Ort: HUDDINGE
Kontakt:

Re: problem med i2c och picar

Inlägg av Roze »

problemet är att mastern sitter i ena sidan av huset, och slaves på andra sidan :P
lite svårt att flytta det.

kan man göra något för att minska störningarna?
Användarvisningsbild
mrfrenzy
Co Admin
Inlägg: 15566
Blev medlem: 16 april 2006, 17:04:10

Re: problem med i2c och picar

Inlägg av mrfrenzy »

Vilken hastighet kör du med? Med vanlig telefonkabel så ska det inte fungera mer än ca 8m i 100kHz enligt specen.
Jag har inte meckat med I2c men har en del erfarenhet av 1wire, även det är kritiskt för kapacitansen på kabeln och Cat5 är långt bättre än telefonkabel.

För långa sträckor tvärs genom huset hade jag nog använt ett annat protokoll, men vill man absolut så finns det lösningar:
Using the Philips P82B715 I2C extender on long cables.
(Read first AN444.pdf).

P82B715 I²C bus extender:
http://www.semiconductors.philips.co...P82B715PN.html

P82B715 Datasheet:
http://www.semiconductors.philips.co.../P82B715_6.pdf

P82B715 Application Note:
http://www.semiconductors.philips.co...otes/AN444.pdf

One mile long I2C communication using the P82B715:
http://www.semiconductors.philips.co...otes/AN452.pdf


Where to buy in small quantities:

http://www.distrelec.com Art.No: 649003
http://www.schuricht.de Art.No: 649003
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47013
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: problem med i2c och picar

Inlägg av TomasL »

Finns diverse tekniker för detta, en tråd här avhandlade ämnet för nån månad sedan.
Dock är inte I2C det lämpligaste, du måste lägga in repeatrar/bryggor för att hantera dina längder, samt se till att impendansen håller sig inom specat område och köra långsamt.
1-trådsbuss fungerar garanterat bättre.
Roze
Inlägg: 113
Blev medlem: 30 april 2006, 17:11:11
Ort: HUDDINGE
Kontakt:

Re: problem med i2c och picar

Inlägg av Roze »

den där P82B715 verkar lovande. så praktiskt dessutom att tele-ledningarna levererar 5v, så det borde bara va att smälla på en sån där i början och slutet av varje ledning.

ska i alla fall tänka på det.

och hur mäter man enklast impedans på en kabel?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47013
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: problem med i2c och picar

Inlägg av TomasL »

He, He, inte enkelt, tämligen omöjligt med normala instrument.
Du får räkna istället.
Dock brukar impedans och kapacitans finnas angivet i databladen.
Användarvisningsbild
Henrik
Inlägg: 661
Blev medlem: 26 maj 2003, 23:39:14
Ort: Göteborg
Kontakt:

Re: problem med i2c och picar

Inlägg av Henrik »

Nån på jobbet råkade ut för I2C som hängde sig på PIC, då var det TRIS som inte var satt "åt rätt håll" innan I2C initialiserades.
Roze
Inlägg: 113
Blev medlem: 30 april 2006, 17:11:11
Ort: HUDDINGE
Kontakt:

Re: problem med i2c och picar

Inlägg av Roze »

grejen är att den kör olika länge varje gång, ibland klarar den 2 dygn, ibland 10 minuter, så det känns ju som om det har med störningar att göra
Användarvisningsbild
Henrik
Inlägg: 661
Blev medlem: 26 maj 2003, 23:39:14
Ort: Göteborg
Kontakt:

Re: problem med i2c och picar

Inlägg av Henrik »

Jepp. Vad har du för värde på din pull-up?
Roze
Inlägg: 113
Blev medlem: 30 april 2006, 17:11:11
Ort: HUDDINGE
Kontakt:

Re: problem med i2c och picar

Inlägg av Roze »

10K.

TRISC initieras som 1 på signifikanta bitar
Roze
Inlägg: 113
Blev medlem: 30 april 2006, 17:11:11
Ort: HUDDINGE
Kontakt:

Re: problem med i2c och picar

Inlägg av Roze »

hm.. ökar max kabellängd om jag minskar i2c-hastigheten? isf, vad e lägsta hastigheten?

nuvarande värde:

SSPADD = 239;
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 47013
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: problem med i2c och picar

Inlägg av TomasL »

Henrik skrev:Nån på jobbet råkade ut för I2C som hängde sig på PIC, då var det TRIS som inte var satt "åt rätt håll" innan I2C initialiserades.
Finns ett errata om detta på en del PICar, där portarna i vissa lägen inte initieras på rätt sätt
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: problem med i2c och picar

Inlägg av sodjan »

> hm.. ökar max kabellängd om jag minskar i2c-hastigheten? isf, vad e lägsta hastigheten?

Problemet är ju lite det att du använder I2C till något det aldrig var avsett för.
Kanske att det kan avhjälpas med lite trix, men det blir fortfarande inte en
speciellt bra lösning.

> nuvarande värde:
> SSPADD = 239;

Det säger i sig ingenting om I2C hastigheten. Är det inte enklast att
bara tala om vilken I2C hastighet du kör med ? Du har ju fått frågor om
det tidigare, men inte svarat på det.

Sen så heter det I2C, inte i2c. Och det heter PIC, inte pic. Och "är", inte "e".
Ditt tangentbord ger inte heller stor bokstav i början på meningar. Det är
ju du som har problem, så du vinner sannolikt på att lägga lite kraft på att
göra det lätt och trevligt för andra att läsa din inlägg.
Roze
Inlägg: 113
Blev medlem: 30 april 2006, 17:11:11
Ort: HUDDINGE
Kontakt:

Re: problem med i2c och picar

Inlägg av Roze »

Ska tänka på min rättskrivning :)

Vad jag kör på för hastighet vet jag faktiskt inte riktigt.
Kör på de värdena som jag fått från min lärare, då jag är värdelös på att få rätt vid uträkningar från databladet, t.ex. har jag ingen aning om vad Fosc har för värde, då jag kör med MPLABs configuration bits.
Samt att jag tycker databladets förklaring över frekvensen är ganska... lös.

För den som nu kan göra något vättigt av följande för att få fram hastigheten på I2C får den gärna göra så.
(PS, jag kan inte ändra frekvenserna, då mastern använder både USB och I2C, och dessa inställningar är de enda som inte USBn får ASYNC-errors på)

PLL Prescaler: divide by 6.
CPU Postscaler: OSC1/OSC2 src: /1, 96MHz PLL / 2.
Full Speed USB Source: PLL / 2
Occilator: HS: HS+PLL, USB-HS

Initiering för I2C på mastersidan:

Kod: Markera allt

    SSPCON1 = 0b00001000;    	// I2C Master Mode, Clock = FOSC / (4*(SSPADD+1)) 
    SSPADD = 239;    			// Load Baud Rate Generator for I2C speed, Clock = FOSC / (4*(SSPADD+1)) 
    SMP = 1;     				// Slew Rate Control Disabled (1Mhz) 
    SSPEN = 1;        			// Enable SSP 
Skriv svar