Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

STM32f429 I2C

Başlatan apsis, 16 Mart 2017, 01:40:15

apsis

Merhaba arkadaşlar,
PIC'de yaptığım uygulamaları ARM'da denemeye çalışıyorum. Daha önce kullandığım renk sensörünü deniyorum. Programı debug yaptığımda kod bir satırda takılıp kalıyor. "I2C hesaplaması mı yanlış?"diye düşündüm ve rehberdeki register açıklamalarındaki örnek değerleri denedim durum değişmedi
void i2c2_init(void)
{
	// PIN YUKLEMELERI
	RCC->AHB1ENR  |=0x00000002;	// B portu saati aktif edildi
	GPIOB->AFR[1] |=0x00004400; // Alternatif fonksiyonda PB10-SCL PB11-SDA seçiliyor HARD sayfa 75 I2C2
	GPIOB->MODER  |=0x00A00000;	// AF secildi
	GPIOB->OTYPER |=0x00000C00; //Open-drain secildi
	
	//I2C2 YUKLEMELERI
	RCC->APB1ENR  |=0x00400000;	// I2C2 aktif edildi.
	I2C2->CR2			|=0x0008; //clock 8MHz ayarlandi.
	I2C2->CCR			|=0x0028; //100kHz
	I2C2->TRISE		|=9;	// 
                          //(300 ns / 25 ns = 12 + 1=C)
	I2C2->CR1			|=0x0001; // I2C2 aktif
}
void write_i2c(char Adr, char Dat)
{
	I2C2->CR1 |= 0x0100; 					 // START BIT'I Gönder
	while(!(I2C2->SR1 & 0x0001));  // Start kosulunu bekle (SB=1)
	I2C2->DR =TCS_W_ADDRESS; 							// Slave adresi. okuma yazma komutu
	while(!(I2C2->SR1 & 0x0002));	// adres gönderimini bekle (ADDR=1)
	
	I2C2->DR = 0x80|Adr;						// Cipin adresi
	while(!(I2C2->SR1 & 0x0080));// TxE Data Register'in bosalmasini bekle(Txe)
	I2C2->DR = Dat&0xFF;							 //Veriyi Yaz
	while(!(I2C2->SR1 & 0x0080));// TxE Data Register'in bosalmasini bekle(Txe)
	while(!(I2C2->SR1 & 0x0004));// Verinin gönderimini bekle (BTF)
	I2C2->CR1 |= 0x0200; // STOP biti gönder
}
char read_i2c(char Adr)
{
	I2C2->CR1 |= 0x0100; 					// START BIT'I Gönder
	while(!(I2C2->SR1 & 0x0001)); // Start kosulunu bekle (SB=1)
	I2C2->DR =TCS_W_ADDRESS; 							// Slave adresi 
	while(!(I2C2->SR1 & 0x0002));	// adres gönderimini bekle (ADDR=1)
	
	I2C2->DR = 0x80|Adr;					// Cipin adresi
	while(!(I2C2->SR1 & 0x0080)); // TxE Data Register'in bosalmasini bekle(Txe)
	while(!(I2C2->SR1 & 0x0004)); // Verinin gönderimini bekle (BTF)
	
	I2C2->CR1 |= 0x0100; // START BIT'I Gönder
	while (!(I2C2->SR1 & 0x0001)) {}; // Start kosulunu bekle (SB=1)
	I2C2->DR = TCS_R_ADDRESS; // Slave adresi
	while (!(I2C2->SR1 & 0x0002)) {}; // adres gönderimini bekle (ADDR=1)
	
	while (!(I2C2->SR1 & 0x0040)) {}; // ByteReceived'i bekle (RxNE=1)
	I2C2->CR1 |= 0x0200; // STOP biti gönder
	return ((char)I2C2->DR); // okunan veri
}
takılı kaldığı yer read_i2c kısmında (Txe)->satırında
sensör kodlarında bir sıkıntı olduğunu düşünmüyorum olduğu gibi yapıştırdım sadece haberleşme kısmını uyarladım o kadar.
Not: Sensör TCS34725 modül şeklinde ve içerisinde pull-up dirençleri mevcut.3-5 V ile beslenebiliyor.
"Makineye Beyin" MEKATRONİK

Bertan

Hocam, slave adresini gönderdikten sonra SR2 registerindeki MSL bitini de kontrol etmeyi dener misiniz?

char read_i2c(char Adr)
{
	I2C2->CR1 |= 0x0100; 					// START BIT'I Gönder
	while(!(I2C2->SR1 & 0x0001)); // Start kosulunu bekle (SB=1)
	I2C2->DR =TCS_W_ADDRESS; 							// Slave adresi
	while(!(I2C2->SR1 & 0x0002));	// adres gönderimini bekle (ADDR=1)

        while(!(I2C2->SR2 & 0x0001));  //MSL
	
	I2C2->DR = 0x80|Adr;					// Cipin adresi
	while(!(I2C2->SR1 & 0x0080)); // TxE Data Register'in bosalmasini bekle(Txe)
	while(!(I2C2->SR1 & 0x0004)); // Verinin gönderimini bekle (BTF)
	
	I2C2->CR1 |= 0x0100; // START BIT'I Gönder
	while (!(I2C2->SR1 & 0x0001)) {}; // Start kosulunu bekle (SB=1)
	I2C2->DR = TCS_R_ADDRESS; // Slave adresi
	while (!(I2C2->SR1 & 0x0002)) {}; // adres gönderimini bekle (ADDR=1)

        while(!(I2C2->SR2 & 0x0001));  //MSL
	
	while (!(I2C2->SR1 & 0x0040)) {}; // ByteReceived'i bekle (RxNE=1)
	I2C2->CR1 |= 0x0200; // STOP biti gönder
	return ((char)I2C2->DR); // okunan veri
}

apsis

#2
@bertan88 değişen bir şey olmadı.
"Makineye Beyin" MEKATRONİK

Bertan

#3
Takılan satırı silince ne oluyor?

SR1 registerindeki BERR biti setleniyor mu?

apsis

"Makineye Beyin" MEKATRONİK

apsis

Program write fonksiyonunda Txe satırında takılı kalıyormuş read fonksiyonunda takılmıyor yanlış söyledim. Sensörün id'sini okuyabiliyorum. ancak yazmada bir sıkıntı var.
"Makineye Beyin" MEKATRONİK

Bertan

Hocam kodunuzun aynısını kopyala yapıştır ile kullandığımda benimde Txe satırında takılıyor. Yukarıda söylediğim gibi ADDR bitini kotrol ettikten sonra MSL bitini de kotrol edince program sorunsuz çalışıyor.

void write_i2c(char Adr, char Dat)
{
	I2C2->CR1 |= 0x0100; 					// START BIT'I Gönder
	while(!(I2C2->SR1 & 0x0001));  // Start kosulunu bekle (SB=1)
	I2C2->DR =TCS_W_ADDRESS; 							// Slave adresi. okuma yazma komutu
	while(!(I2C2->SR1 & 0x0002));	// adres gönderimini bekle (ADDR=1)

        while(!(I2C2->SR2 & 0x0001));  //MSL
	
	I2C2->DR = 0x80|Adr;						// Cipin adresi
	while(!(I2C2->SR1 & 0x0080));// TxE Data Register'in bosalmasini bekle(Txe)
	I2C2->DR = Dat&0xFF;							//Veriyi Yaz
	while(!(I2C2->SR1 & 0x0080));// TxE Data Register'in bosalmasini bekle(Txe)
	while(!(I2C2->SR1 & 0x0004));// Verinin gönderimini bekle (BTF)
	I2C2->CR1 |= 0x0200; // STOP biti gönder
}

apsis

#7
@bertan88 çok teşekkür ederim oldu :) Ama neden bunu kontrol etmem gerekiyor. Ref.manuelde kaçırdığım bir nokta mı var?

EV6'da yazıyormuş :)
"Makineye Beyin" MEKATRONİK