Stm32f030 RAM Yetmeme Sorunu

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

yldzelektronik

Merhaba,

Stm32f030f4p ile i2c kullanmaya çalışıyorum.Ancak bir türlü çalıştıramadım.Öncelikle kodları vereyim;

  RCC_I2CCLKConfig (RCC_I2C1CLK_HSI);

  RCC_AHBPeriphClockCmd (RCC_AHBPeriph_GPIOA, ENABLE);
  RCC_AHBPeriphClockCmd (RCC_AHBPeriph_GPIOF, ENABLE);

  RCC_APB1PeriphClockCmd (RCC_APB1Periph_I2C1, ENABLE);
  //---------------------------------I2C SETTINGS------------------------------
  //Configure pins: SCL and SDA ------------------
	I2C_DeInit(I2C1);
	
  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10;
  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_10MHz;
  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;
//  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStruct.GPIO_OType = GPIO_OType_OD;
  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;//0x00;
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_Timing = 0x10805E89;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
//	I2C_InitStructure.
  I2C_Init (I2C1, &I2C_InitStructure);
  I2C_Cmd (I2C1, ENABLE);


int8_t readBytes (uint8_t devAddr, uint8_t regAddr, uint8_t length, uint8_t *data, uint16_t timeout)
{
  uint8_t DataNum = 0;
	while(I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) == SET)
		;
  /* Configure slave address, nbytes, reload and generate start */
  I2C_TransferHandling (I2C1, devAddr, 1, I2C_SoftEnd_Mode, I2C_Generate_Start_Write);

  /* Wait until TXIS flag is set */
  while (I2C_GetFlagStatus (I2C1, I2C_ISR_TXIS) == RESET) {              //Burada takılıyor
//  }

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

  /* Wait until TC flag is set */
  while (I2C_GetFlagStatus (I2C1, I2C_ISR_TC) == RESET) {
  }
  /* Update CR2 : set Slave Address , set read request, generate Start and set end mode */
  I2C_TransferHandling (I2C1, devAddr, length, I2C_AutoEnd_Mode, I2C_Generate_Start_Read);

  /* Reset local variable */
  DataNum = 0;

  /* Wait until all data are received */
  while (DataNum != length) {
    /* Wait until RXNE flag is set */
    while (I2C_GetFlagStatus (I2C1, I2C_ISR_RXNE) == RESET) {
      if ((timeout--) == 0) {
        return -1;
      }
    }

    /* Read data from RXDR */
    data[DataNum] = I2C_ReceiveData (I2C1);

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

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

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

  /* If all operations OK, return sEE_OK (0) */
  return 0;
}


I2C I2C_ISR_TXIS bayrağı sürekli olarak 0 da.Debugdan bakıyorum BUSY bayrağı da 1 şekilde bekliyor.

Acaba neden olabilir bu durum?Nette aradım ancak net bir çözüm bulamadım.Sorunu yaşayan veya benzerini yaşayan var mı?

Ekleme (Şematik):





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

yldzelektronik

Forumda hiç kimse i2c kullanmadı mı?Veya bu mcu ile kullanan mı olmadı?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

Karamel

Hocam ben deney yapmak amacli iki tane almistim. Birisini deneyler esnasinda bozdum. Digeri duruyor.

Mikroc libraryleri ile ben i2c deneyleri yapmistim. St librarylerinden hoslanmiyorum. Simdi misafirlikteyiz. Eve gevince reference manual i okuyabilirim. Yalniz registery seviyesinde birseyler diyebilirim. St librarylerinden anlamiyorum   :-\

yldzelektronik

@Karamel teşekkürler.

Acaba elinde Stm32f0 kiti olan var mı?Bir kaç test yapabilir mi?Bende yokta.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

M_B

Merhaba bende stm32f052 olması lazim.
Nasil bir test hocam.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

yldzelektronik

Alıntı yapılan: M_B - 02 Eylül 2015, 23:44:00
Merhaba bende stm32f052 olması lazim.
Nasil bir test hocam.

Hocam i2c ile sorun yaşıyorum.Bu sorunu aşmama yardımcı olabilecek her türlü test olur.Aklımda belli başlı bir şey yok açıkcası.Ancak sanırım stdlib example klasöründeki örneklerden birini deneyebiliriz sanırım.En azından biraz bilgi verir diye düşünüyorum.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yamak

Read Byte fonksiyonunun başına aşağıdaki satırı ekleyip deneyebilir misin?
I2C1->CR2&=~0x7FFFFFF;

CoşkuN

GPIO'ları init ederken her iki pin için init fonksiyonunu ayrı ayrı çağırmak gerekiyor olabilir şu an tam hatırlamıyorum kodların bakayım kütüphanenin.

yldzelektronik

@yamak
Çözüm olmadı.

Acaba yanlış timing ile ilgili olabilir mi?I2c timing değerlerini hatalı giriyor olabilir miyim?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

CoşkuN

  
  /* Connect PXx to I2C_SCL*/
  GPIO_PinAFConfig(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_SOURCE, sEE_I2C_SCL_AF);
  
  /* Connect PXx to I2C_SDA*/
  GPIO_PinAFConfig(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_SOURCE, sEE_I2C_SDA_AF);
  
  /* GPIO configuration */  
  /* Configure sEE_I2C pins: SCL */
  GPIO_InitStructure.GPIO_Pin = sEE_I2C_SCL_PIN;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);
  
  /* Configure sEE_I2C pins: SDA */
  GPIO_InitStructure.GPIO_Pin = sEE_I2C_SDA_PIN;
  GPIO_Init(sEE_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);

Her iki pin için ayrı ayrı Init çağırmak gerekiyor. Önce örnekleri baz alıp başla bence çalışmaya.
STM32F0 Standart Kütüphaneleri şurada: http://www.st.com/web/en/catalog/tools/PF257884#

yldzelektronik

#10
Tam olarak şuanda o şekilde yapıyorum.Tam olarak aynı std lib ile.Her şeyiyle.

Ekleme: Hatta şuan önce i2c pinlerini ve i2cyi deinit edip delayms(10) yapıp tekrar init ediyorum.Tek bir değişiklik olmuş değil.Anlamıyorum.Şimdi bir video ile izah etmeyi deneyeceğim.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

CoşkuN

Devrende problem olabilir mi? Pull up dirençleri felan,

yldzelektronik

#12
Alıntı yapılan: CoşkuN - 03 Eylül 2015, 09:49:21
Devrende problem olabilir mi? Pull up dirençleri felan,

Kontrol ettim.Ancak tekrar edeceğim şimdi.Video işiyle ilgileniyorum.

mesaj birleştirme:: 03 Eylül 2015, 10:06:16

PUll up dirençleriyle ilgili problem gözükmüyor.I2c hattı olması gerektiği gibi 3v3 seviyesinde. Yalnız dünden beri şöyle bir durum var.Mevcut i2c pinlerini normal io olarak ayarlayıp soft i2c yapmaya çabalıyorum.Ancak pinler hiç low olmuyor.Hep high.Bu nasıl iş?

mesaj birleştirme:: 03 Eylül 2015, 10:08:59

Bu arada st nin i2c timin için ir exceli var. i2c_timing_configuration_V1.0.1 diye.Buradaki Rise Time Fall Time değerlerini kullandığımız i2c slave device a göre mi belirliyoruz?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

yamak

Timing 0x10420F13 değerine set edip dener misin?

yldzelektronik

Alıntı yapılan: yamak - 03 Eylül 2015, 10:23:21
Timing 0x10420F13 değerine set edip dener misin?

Nasıl hesapladın bilmiyorum hocam ama şuan internal 8mhz osc kullanıyorum.Pll yok.

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