Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

PIC I2C Veri Alma

Başlatan szrctn, 11 Şubat 2021, 09:15:55

szrctn

Merhabalar,
   Bir projem için I2C protokolü kullanmam gerekli. 3-boyutlu bilgi veren bir sensörden 16-bitlik veriler alacağım. İlk defa bu protokolü kullanacağım için bir kaç sorum olacak;

   Master tarafından alınacak olan 16-bitlik bilgi, Slave tarafından 8'er bit olarak sırayla gönderildiğini gördüm. Bu bilgileri alırken nasıl bir kod bloğu gereklidir? Aşağıya, gördüğüm örneklerden bir kaç tane bırakıyorum. Bunlardan hangisini kullanmalıyım veya hiçbiri olmuyorsa, nasıl bir yol izlemeliyim?

(1)
   i2c_start();
   i2c_write(0x90);   
   i2c_write(0xaa);         
   i2c_start();
   i2c_write(0x91);  
   ilk_8bit = i2c_read(0);    
   i2c_start();       
   i2c_write(0x91);  
   son_8bit = i2c_read(0);    
   i2c_stop();     

(2)
i2c_start();
   i2c_write(0x90);   
   i2c_write(0xaa);         
   i2c_start();
   i2c_write(0x91);  
   ilk_8bit = i2c_read(0);      
   son_8bit = i2c_read(0);    
   i2c_stop();

Aralara bekleme koymak faydalı veya gerekli midir?
(3)
i2c_start();
   i2c_write(0x90);
   delay_ms(1);
   i2c_write(0xaa);
   delay_ms(1);      
   i2c_start();
   i2c_write(0x91);
   ilk_8bit = i2c_read(1);
   delay_ms(1);      
   son_8bit = i2c_read(1);    
   i2c_stop();
 
----
Bir de "i2c_read(0)" komutundaki "0" ne anlama geliyor? Bazı kodlarda "1" yazıldığını da gördüm (örnek 3 gibi).
----

İlginiz için teşekkür ederim...


Mucit23

Normalde Araya gecikme koyulmaz. Gerek yoktur gecikme koyulmasına.

i2c_read(0)

Buradaki parametre ACK bitini temsil eder. Eğer Fonksiyona '1' Gönderilirse ACK biti gönderilir, Fonksiyona '0' gönderilirse NACK Gönderilir.

Şu resimde gayet net anlaşılıyor.



Eğer okuma yapacaksanız ve eğer peş peşe birden fazla okuma yapılacaksa ACK biti ile birlikte okuma yapılması gerekiyor. Son byte okunacak ve İletişim sonlandırılacaksa NACK gönderilmesi gerekiyor. Bu iletişimin sonlandığı anlamına geliyor.

Bu aynı şekilde sıralı yazma içinde geçerlidir.

void I2C_ReadData(uint8_t Reg, uint8_t *Data, uint8_t Len)
{
	uint8_t count=0;
 	I2C_Start();		// Initial Start bit sequence
	I2C_Addr(I2C_Slave_Addr);	 	// Address I2C Device. (Base address is Write Address)
	I2C_Write(Reg);			// Transfer Command to I2C Device (Register to be Read) 	
	I2C_Start(); 		    // Repeated start bit sequence
	I2C_Addr(I2C_Slave_Addr+1);	// Address I2C Device. (Base address + 1 is Read Address)
	if(Len>1)  //If Data Len more than 1
	{
	   while(count!=Len-1)
		 {
		   Data[count]=I2C_Read(1); //Read With ACKnowledge
			 count++;
		 }
	}
	Data[count] = I2C_Read(0);	//Read With Not ACKnowledge	

// Read 1 byte without Acknowledge
	I2C_Stop();				// Stop I2C transfer  
}

szrctn

Alıntı yapılan: Mucit23 - 11 Şubat 2021, 12:08:48Normalde Araya gecikme koyulmaz. Gerek yoktur gecikme koyulmasına.

i2c_read(0)

Buradaki parametre ACK bitini temsil eder. Eğer Fonksiyona '1' Gönderilirse ACK biti gönderilir, Fonksiyona '0' gönderilirse NACK Gönderilir.

Şu resimde gayet net anlaşılıyor.

(Resim gizlendi görmek için tıklayın.)

Eğer okuma yapacaksanız ve eğer peş peşe birden fazla okuma yapılacaksa ACK biti ile birlikte okuma yapılması gerekiyor. Son byte okunacak ve İletişim sonlandırılacaksa NACK gönderilmesi gerekiyor. Bu iletişimin sonlandığı anlamına geliyor.

Bu aynı şekilde sıralı yazma içinde geçerlidir.

void I2C_ReadData(uint8_t Reg, uint8_t *Data, uint8_t Len)
{
	uint8_t count=0;
 	I2C_Start();		// Initial Start bit sequence
	I2C_Addr(I2C_Slave_Addr);	 	// Address I2C Device. (Base address is Write Address)
	I2C_Write(Reg);			// Transfer Command to I2C Device (Register to be Read) 	
	I2C_Start(); 		    // Repeated start bit sequence
	I2C_Addr(I2C_Slave_Addr+1);	// Address I2C Device. (Base address + 1 is Read Address)
	if(Len>1)  //If Data Len more than 1
	{
	   while(count!=Len-1)
		 {
		   Data[count]=I2C_Read(1); //Read With ACKnowledge
			 count++;
		 }
	}
	Data[count] = I2C_Read(0);	//Read With Not ACKnowledge	

// Read 1 byte without Acknowledge
	I2C_Stop();				// Stop I2C transfer  
}
Çok teşekkür ederim. En kısa sürede deneyeceğim.