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







 
			
			 
					
					
					
						 Zitieren
Zitieren

Lesezeichen