- LiFePO4 Speicher Test         
Ergebnis 1 bis 2 von 2

Thema: I2C – Datenbyte wird nicht gesendet.

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33

    I2C – Datenbyte wird nicht gesendet.

    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)

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress