Stm32f030 RAM Yetmeme Sorunu

Başlatan yldzelektronik, 02 Eylül 2015, 16:53:21

yamak

Tamam bu değerler de internal osilatöre göre ayarlandı.

yldzelektronik

Hocam herşey bir yana.Anlamadığım ben bu pinleri normal io olarak set ettiğimde de pinlerde değişiklik göremiyorum.Bırakın soft i2c yapmayı normal high low bile yapamıyorum.Pinlerde değişiklik olmuyor.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

JKramer

Pullup direnci 3v3'e kisa devre olabilir, direnci olctunuz mu?

yldzelektronik

#18
Ölçtüm.Değiştirdim.Fark yok.Anlamıyorum aynı yerde takılıyor.

https://youtu.be/q4fp0FCSwaA

mesaj birleştirme:: 03 Eylül 2015, 11:45:53

Şimdi fark ettim de ben alternate function için clock vermemişim.Acaba bununla alakalı olabilir mi?Bu mcuda alternate function için de ayrıca clock vermek gerekiyor mu?rcc.h dosyasında birşey bulamadım ama????

mesaj birleştirme:: 03 Eylül 2015, 11:56:59

Ayrıca debug ile baktığımda
GPIO_PinAFConfig(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_SOURCE, sEE_I2C_SDA_AF);
satırının hiç de etkisi olmuyor.

mesaj birleştirme:: 03 Eylül 2015, 12:45:41

Sorunlar çözüldü.Şuan sorunsuz haberleşiyor gibiyim.Çok detaylı test etmedim.Edeceğim.Sonuçları paylaşmazsam sıkıntısız haberleşiyor demektir.Yoğunluktan unutabilirim detayları paylaşmayı.

I2C_Cmd(I2C1, DISABLE);
  
  /* DeInitializes the LM75_I2C */
  I2C_DeInit(I2C1);
  
  /* LM75_I2C Periph clock disable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, DISABLE);
    
  /* Configure LM75_I2C pins: SCL */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* Configure LM75_I2C pins: SDA */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
	
  RCC_APB1PeriphClockCmd (RCC_APB1Periph_I2C1, ENABLE);
	
	Delay(10);
	
  RCC_I2CCLKConfig (RCC_I2C1CLK_HSI);
	
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_4);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_4);
	
  //---------------------------------I2C SETTINGS------------------------------
  //Configure pins: SCL and SDA ------------------
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_NOPULL;
  GPIO_Init (GPIOA, &GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  GPIO_Init (GPIOA, &GPIO_InitStruct);
	
  //(#) Program the Mode, Timing , Own address, Ack and Acknowledged Address using the I2C_Init() function.
  I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
  I2C_InitStructure.I2C_DigitalFilter = 0x00;
  I2C_InitStructure.I2C_OwnAddress1 = (0x53 << 1);//0x00;
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_Timing = 0x10420F13;//0x10805D88;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	
  I2C_Init (I2C1, &I2C_InitStructure);
  I2C_Cmd (I2C1, ENABLE);


Bir kere kesinlikle init etmeden önce yukarıdakine benzer şekilde deiniti yapın.Benim takılıp kaldığım gözümden kaçan yer alternate function config fonksiyonuna geçtiğim parametre hatalıymış.Ben normal  gpio_pin_9 olarak geçiyordum.Olması gereken gpio_pinsource9 muş.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

#19
Merhabalar,

Bu kez de bu mcudaki 4k ram yetmemeye başladı. Bir struct var ve bununla 100 elemanlı dizi yapıyorum.Bütün yeri bu kaplıyor.Struct şöyle;

typedef struct{
	uint8_t 	ID;
	uint16_t	VBATT;	//Gerçek batarya gerilimi = Vbat / 100
	uint8_t 	PacketLen;//			:4;
	struct{
		uint8_t		Day				:  5,
					Month			:  4,
					Hour				:  5,
					Minute			:  6;
		uint32_t 	StepCounter	                :22;

	}Measurement[15];
	
}SensorNode_Typedef;


Bunu bir de packet yapsam nasıl olur?Ramden kazanıyr myım?Ramden nasıl  tasarruf ederim?Packet nasıl yapılır keil ile?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Klein


yldzelektronik

Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yldzelektronik

#22
Merhaba,

i2c ile kavgamız bitmiyor. Mcu ilk çalışmaya başladığında sorun yok.Haberleşme sorunsuz başlıyor.Sorunsuz devam ediyor.Ancak x zamanda bir anda haberleşme çöküyor.

Sebebini anlamadım.Takılıp kaldığı rutinler şöyle;

uint8_t writeBytes (uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data)
{
  uint32_t DataNum = 0;

  I2C_TransferHandling (I2C1, devAddr, 1, I2C_Reload_Mode, I2C_Generate_Start_Write); /* Configure slave address, nbytes, reload and generate start */

  while (I2C_GetFlagStatus (I2C1, I2C_ISR_TXIS) == RESET) { /* Wait until TXIS flag is set */
  }

  I2C_SendData (I2C1, regAddr); /* Send MSB of memory address */

  while (I2C_GetFlagStatus (I2C1, I2C_ISR_TCR) == RESET) { /* Wait until TCR flag is set */
  }

  I2C_TransferHandling (I2C1, devAddr, length, I2C_AutoEnd_Mode, I2C_No_StartStop); /* Update CR2 : set Slave Address , set write request, generate Start and set end mode */

  while (DataNum != length) {
    while (I2C_GetFlagStatus (I2C1, I2C_ISR_TXIS) == RESET) { /* Wait until TXIS flag is set */
    }

    I2C_SendData (I2C1, (uint8_t)(data[DataNum]) );  /* Write data to TXDR */

    DataNum++;       /* Update number of transmitted data */
  }

  while (I2C_GetFlagStatus (I2C1, I2C_ISR_STOPF) == RESET) { /* Wait until STOPF flag is set */
  }

  I2C_ClearFlag (I2C1, I2C_ICR_STOPCF); /* Clear STOPF flag */

  return DataNum == 0;
}


Bu rutinlerde takıldığı yer benim denk geldiğim kadarıyla
while (I2C_GetFlagStatus (I2C1, I2C_ISR_TXIS) == RESET)


Normal haberleşme sürerken neden patlarki?

@muhittin_kaplan  sen de sanki bir ara bu donanım ile baya boğuşmuştun? Tecrübelerin neler?

Bu hususta tecrübeleri olanlar biraz malumat verse?

pull up dirençleriyle ilgili problem olduğunu düşünmüyorum.Haberleşme sorunsuz sağlanırken x zamanda patlıyor.

Ekleme: Şunu da ekleyeyim.Aklıma şimdi geldi.Bazen haberleşme mcu ilk çalışmaya başladığında da sağlanamıyor.

Acaba init ile ilgili mi sorun var?Son paylaştığım init kodlarından farklı değil.

I2C_Cmd(I2C1, DISABLE);
  
  /* DeInitializes the LM75_I2C */
  I2C_DeInit(I2C1);
  
  /* LM75_I2C Periph clock disable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, DISABLE);
    
  /* Configure LM75_I2C pins: SCL */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* Configure LM75_I2C pins: SDA */
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  GPIO_Init(GPIOA, &GPIO_InitStruct);
	
  RCC_APB1PeriphClockCmd (RCC_APB1Periph_I2C1, ENABLE);
	
	Delay(10);
	
  RCC_I2CCLKConfig (RCC_I2C1CLK_HSI);
	
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_4);
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_4);
	
  //---------------------------------I2C SETTINGS------------------------------
  //Configure pins: SCL and SDA ------------------
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStruct.GPIO_PuPd   = GPIO_PuPd_NOPULL;
  GPIO_Init (GPIOA, &GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;
  GPIO_Init (GPIOA, &GPIO_InitStruct);
	
  //(#) Program the Mode, Timing , Own address, Ack and Acknowledged Address using the I2C_Init() function.
  I2C_InitStructure.I2C_AnalogFilter = I2C_AnalogFilter_Enable;
  I2C_InitStructure.I2C_DigitalFilter = 0x00;
  I2C_InitStructure.I2C_OwnAddress1 = (0x53 << 1);//0x00;
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_Timing = 0x10420F13;//0x10805D88;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
	
  I2C_Init (I2C1, &I2C_InitStructure);
  I2C_Cmd (I2C1, ENABLE);


Ekleme2: Başlık adını değiştirdiğim halde halen ram sorunu yazıyor.Anlamadım neden.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Gökhan BEKEN

Eğer kablon uzunsa(örn: 1 metre), takılmalar olabilir. Özellikle de kabloya dokunduğunda...
Shield'li kablolardan kullan, i2c çok nazlı bir protokol, arka planda sürekli bağlantıda kopma var mı diye kontrol et, eğer bağlantı kopmuşsa tekrar yaptır vs...
Özel mesaj okumuyorum, lütfen göndermeyin.

yldzelektronik

Alıntı yapılan: Gökhan BEKEN - 06 Ekim 2015, 10:15:17
Eğer kablon uzunsa(örn: 1 metre), takılmalar olabilir. Özellikle de kabloya dokunduğunda...
Shield'li kablolardan kullan, i2c çok nazlı bir protokol, arka planda sürekli bağlantıda kopma var mı diye kontrol et, eğer bağlantı kopmuşsa tekrar yaptır vs...

Kablo yok.Aynı pcb üzerinde. Acaba pcb üzerinde rf modül haberleşmeyi bozuyor olabilir mi?Gerçi yayın yapmıyor ama.Hatta bekleme moduna sokuyorum rf modülü.

Ben i2c ile baştan beri boğuştuğumdan gözüm başka bir şey görmüyor.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

CoşkuN

Bu tür while döngüleriyle beklemeler genelde tehliklelidir. Bayrak 1 olmazsa burada kilitlenme olacaktır.
while (I2C_GetFlagStatus (I2C1, I2C_ISR_TXIS) == RESET)

Buralara timeout kontrolleri koymak ve timeout olursa da önlem olarak yapılacak şeyler eklemek(haberrleşmeyi resetlemek vs...) iyi olur.
İşlemcinin errata dökümanlarına da bakmak lazım, i2C ile ilgili sıkıntılar olabiliyor bilinen. STM32'lerdeki en gıcık birimlerden birisi I2C modülü sanırım

yamak

Herhangi bir slave clock u stretch ediyo olabilir.Eğer hız önemli değilse bu tür problemlerden dolayı SMBUS kullanabilirsin.SMBUS da timeoutlar tanımlayabilirsin.Örneğin clock 5ms low'da kalırsa hattı donanımsal olarak resetleyebilirsin.I2C'de böyle problemler çok olur.Ya da illa I2C kullanacaksan belli bir süre haberleşemeyince hattı soft olarak resetlemek gibi algoritmalar kullanabilirsin.

yldzelektronik

Alıntı yapılan: yamak - 06 Ekim 2015, 10:53:44
Herhangi bir slave clock u stretch ediyo olabilir.Eğer hız önemli değilse bu tür problemlerden dolayı SMBUS kullanabilirsin.SMBUS da timeoutlar tanımlayabilirsin.Örneğin clock 5ms low'da kalırsa hattı donanımsal olarak resetleyebilirsin.I2C'de böyle problemler çok olur.Ya da illa I2C kullanacaksan belli bir süre haberleşemeyince hattı soft olarak resetlemek gibi algoritmalar kullanabilirsin.

smbus bilmiyorum.Onda sanırım bir de alert pini var.Kullanmak şart mı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

muhittin_kaplan

Hocam uzun zaman oldu. Dogrudur epey ugrasmistim 6050 accel ile. Ama ne yaptim hatirlamiyorum.

Gökhan BEKEN

Aynı sensörü başka bir stm serisi ile dene, mesela stm32f4 discovery ile dene.
stm32f4'de de sorun çıkıyorsa bilki senin sönsörde sorun var. Çünkü stm32f4 ile i2c çalıştırdım hem de 1.5 metrelik kablo ile.
Muhittin abinin mpu6050 örneğini deneyebilirsin.
veya benim mpu9150 örneğimi de deneyebilirsin: https://github.com/gokhanBeken/emblocks_mpu9150_magnetometer_accelerometer_gyroscop
Özel mesaj okumuyorum, lütfen göndermeyin.