PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] I2C – Datenbyte wird nicht gesendet.



arwar52
20.06.2019, 16:20
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.

+++++++++++++++++++++++++++++++++++
34226

Der leerer Raum zwischen dem Address Byte und der STOP-Sequenz is durch die Schleife
for(k=0; k<350; k++){} verursacht.
+++++++++++++++++++++++++++++++++++

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;
}

}

arwar52
21.06.2019, 21:12
. . . 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.