- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 2 von 2

Thema: I2C – Datenbyte wird nicht gesendet.

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33

    I2C – Datenbyte wird nicht gesendet.

    Anzeige

    Praxistest und DIY Projekte
    Hallo Kollegen,
    hat nicht lange gedauert und …. da bin ich wieder mit ne Frage

    Bin am „basteln“ am I2C Protokoll, STM32F103.
    Funktionier erstmal zu 50% - das Adress-Byte wird gesendet und acknowledget.

    Aber Data Bytes werden nicht gesendet.

    Hat jemand `ne Idee woran es liegen kann?
    Eistellungen für GPIO, Clock, ... sind gemacht.

    +++++++++++++++++++++++++++++++++++
    Klicke auf die Grafik für eine größere Ansicht

Name:	I2C.jpg
Hits:	5
Größe:	30,0 KB
ID:	34226

    Der leerer Raum zwischen dem Address Byte und der STOP-Sequenz is durch die Schleife
    for(k=0; k<350; k++){} verursacht.
    +++++++++++++++++++++++++++++++++++
    Code:
    void I2C2Init(void) {
    
    	uI2C_CCR * pI2c2Ccr 	= (uI2C_CCR *)(I2C2_ADR + I2C_CCR_OFFSET);
    	uI2C_CCR    I2C2Ccr;
    
    	uI2C_CR1 * pI2c2Cr1 	= (uI2C_CR1 *)(I2C2_ADR + I2C_CR1_OFFSET);
    	uI2C_CR1    I2C2Cr1;
    
    	uI2C_CR2 * pI2c2Cr2 	= (uI2C_CR2 *)(I2C2_ADR + I2C_CR2_OFFSET);
    	uI2C_CR2    I2C2Cr2;
    
    	uI2C_TRISE * pI2c2Trise = (uI2C_TRISE *)(I2C2_ADR + I2C_TRISE_OFFSET);
    	uI2C_TRISE    I2C2Trise;
    
    
    						//RefMannual page 782-783
    	I2C2Cr2.All = 0;
    	I2C2Cr2.Bit.FREQ = 		0x36;			//36;					//0x08
    	pI2c2Cr2->All = I2C2Cr2.All;
    
    	I2C2Ccr.All = 0;
    	I2C2Ccr.Bit.CCR = 0x00B4;				//0x28;					//Specification, page 70
    	pI2c2Ccr->All = I2C2Ccr.All;
    
    	I2C2Trise.All = 0;
    	I2C2Trise.Bit.TRISE = 0x12;    			//0x09;
    	pI2c2Trise->All = I2C2Trise.All;
    
    	I2C2Cr1.All = 0;
    	I2C2Cr1.Bit.ACK = 1;					//1: Acknowledge returned after a byte is received
    	I2C2Cr1.Bit.PE = 1;
    	pI2c2Cr1->All = I2C2Cr1.All;
    }
    
    
    
    void I2cSend(void){
    
    	extern tTASTER TasterData[15];
    
    	uI2C_DR   *pI2c2Dr 		= (uI2C_DR  *)(I2C2_ADR + I2C_DR_OFFSET);
    	uI2C_DR    I2C2Dr;
    	uI2C_CR1  *pI2c2Cr1 	= (uI2C_CR1 *)(I2C2_ADR + I2C_CR1_OFFSET);
    	uI2C_CR1    I2C2Cr1;
    
    	uI2C_SR1  *pI2c2Sr1 	= (uI2C_SR1 *)(I2C2_ADR + I2C_SR1_OFFSET);
    	uI2C_SR1    I2C2Sr1;
    	uI2C_SR2  *pI2c2Sr2 	= (uI2C_SR2 *)(I2C2_ADR + I2C_SR2_OFFSET);
    	uI2C_SR2    I2C2Sr2;
    
    
    	unsigned char AddressI2c = 0;
    	unsigned char MessageI2c = 0;
    
    	unsigned char i = 0;
    	unsigned int  k = 0;
    
    	for(i = 1; i<=14; i++){
    
    		AddressI2c = TasterData[i].AddressI2c;	//daten aus Array bereitstellen
    		MessageI2c = TasterData[i].MessageI2c;	//um Verzögerungen beim Senden zu vermeiden
    
    		while(0 != pI2c2Sr2->Bit.BUSY){			//wait for free bus
    			asm("NOP");
    		}
    
    		I2C2Dr.All = 0;
    
    		I2C2Cr1.All = pI2c2Cr1->All;
    		I2C2Cr1.Bit.START = 1;
    		pI2c2Cr1->All = I2C2Cr1.All;
    
    		while(1 != pI2c2Sr2->Bit.MSL){			//is Master Mode set?
    			asm("NOP");
    		}
    
    		I2C2Sr1.All = pI2c2Sr1->All;			//SB=1, cleared by reading SR1 register ...
    
    		I2C2Dr.Bit.DR 	= AddressI2c;			//...followed by writing DR register with Address.
    		pI2c2Dr->All  = I2C2Dr.All;				//write address in DR.
    
    		I2C2Sr1.All = pI2c2Sr1->All;			//ADDR=1, cleared by reading SR1 register ...
    		I2C2Sr2.All = pI2c2Sr2->All;			//...followed by reading SR2
    
    		while(0 != pI2c2Sr1->Bit.ADDR){			//Is the address send?
    			asm("NOP");
    		}
    
    		while(1 != pI2c2Sr1->Bit.TxE){			//TxE=1, shift register empty, data register empty
    			asm("NOP");
    		}
    
    		I2C2Dr.Bit.DR 	= MessageI2c;
    		pI2c2Dr->All  = I2C2Dr.All;				//write Data in DR.
    
    //		for(k=0; k<350; k++){}
    
    		I2C2Cr1.All = pI2c2Cr1->All;
    		I2C2Cr1.Bit.STOP = 1;
    		pI2c2Cr1->All = I2C2Cr1.All;
    	}
    
    }
    Geändert von arwar52 (20.06.2019 um 20:49 Uhr)

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    . . . meine Kollegen haben heute geholfen die Lösung zu finden.

    Die Slaves auf der Platine brauchen Zeit für die Antwort
    und die I2C Perepherie am MC braucht Zeit um die entsprechenden Operationen durchzuführen und zu quitieren.

    Habe nach Senden der Adresse ne Schleife eingefügt die den ADDR Flag = 1 abwartet.
    Dies bedeutet - alle Operationen mit der Adresse sind durch und
    es kann das Datenbyte gesendet werden.

Ähnliche Themen

  1. [ERLEDIGT] Erstes C Programm UART - Warum wird zweimal "Hallo World" gesendet?
    Von dl9hda im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 17.01.2014, 15:56
  2. [ERLEDIGT] Lighttpd + UART - Wird nichts gesendet
    Von Kampi im Forum Raspberry Pi
    Antworten: 51
    Letzter Beitrag: 16.09.2012, 01:07
  3. [ERLEDIGT] MCP2515 Remoteframe wird nicht gesendet.........
    Von Kampi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 30.08.2012, 23:49
  4. twi: wo ist das datenbyte?
    Von scales im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 28.12.2007, 11:14
  5. I2C Adapter Software es wird immer WRITE gesendet
    Von yunscher im Forum C - Programmierung (GCC u.a.)
    Antworten: 8
    Letzter Beitrag: 29.03.2007, 19:12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen