Stm32f4discovery Keil I2C Sorunu

Başlatan alper0017, 16 Ocak 2013, 15:05:53

alper0017

Herkese yeniden merhaba.Sayfada stm32f4 adına birçok örnek var fakat herhangi birisinde i2c kullanımı ile ilgili örnek bulamadım.I2C1 PB6/PB7 pinlerini set ederek okuma ve yazma fonksiyonlarını paylaşabilecek bir yardımsever varmıdır acaba forumda? :)

M_B

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

alper0017

Her stm kullanıcısı olarak bu dosya elimde mevcut.Fakat malesef içersinde i2c örneği yok.Baya bi aradım.Belkide bulamadım.Bulan olursa veya siz bulursanız lütfen nerde olduğunuda söylermisiniz?

M_B

firmware icerisindeki Libraries klasoru icindeki  src klasoru icerisinde  ilgili kutuphane mevcut. ( stm32f4xx_i2c )
Kutuphane icerisinde nasıl kullanacağı hakkında bilgi mevcut.

Ornek olarak :
http://www.st.com/internet/com/SOFTWARE_RESOURCES/SW_COMPONENT/FIRMWARE/stm32_i2c_cpal.zip
yalnız bunu F4 uyarlaman gerekecek.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

alper0017

Bu kodları yazıp denedim fakat.Program hala   while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY)); kısmında takılıyor.0x0F adresinden veri okurken sorun olmuyor fakat 0x20 adresinden 1 kere veri okuduktan sonra program o satırda takılıyor.Sensorü söküp çıkarınca bidefa daha okuyor ve yine tıkanıyor.Neyi atlıyorum hala anlayamadım.

   /*  I2C1  */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource6, GPIO_AF_I2C1);
  GPIO_PinAFConfig(GPIOB,GPIO_PinSource7, GPIO_AF_I2C1);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
  GPIO_Init(GPIOB, &GPIO_InitStructure);



I2C_DeInit(I2C1);
   
RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
    I2C_init.I2C_Mode = I2C_Mode_I2C;
    I2C_init.I2C_ClockSpeed = 100000;
    I2C_init.I2C_DutyCycle = I2C_DutyCycle_2;
    I2C_init.I2C_OwnAddress1 = 0;
    I2C_init.I2C_Ack = I2C_Ack_Enable;
    I2C_init.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
     I2C_Cmd(I2C1,ENABLE);
    I2C_Init(I2C1,&I2C_init);

   unsigned short int I2C1_read(uint8_t adress, uint8_t index)
   {
   uint8_t data;
   while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
    I2C_GenerateSTART(I2C1, ENABLE);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
    I2C_Send7bitAddress(I2C1, adress, I2C_Direction_Transmitter);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    I2C_SendData(I2C1, index);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
    I2C_GenerateSTART(I2C1, ENABLE);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
    I2C_Send7bitAddress(I2C1, adress, I2C_Direction_Receiver);
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));
    while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED));
    data=I2C_ReceiveData(I2C1);
    I2C_GenerateSTOP(I2C1, ENABLE);
      return data;
   }

    void I2C1_write(uint8_t adress, uint8_t * data) {
    uint8_t i=0;
    while (i < 7)
      {
        while (I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY));
        I2C_GenerateSTART(I2C1, ENABLE);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT));
        I2C_Send7bitAddress(I2C1, adress, I2C_Direction_Transmitter);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
        I2C_SendData(I2C1, data);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_SendData(I2C1,i + 1);
        while (!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
        I2C_GenerateSTOP(I2C2, ENABLE);
        i+=2;
    }
    }

int main(void)
{
   uint8_t timer_value,flag=0,i=0;
   char buffer[8];
   uint8_t deger;
   
   I2C1_Initialize();
  while (1)
  {
      deger=I2C2_read(0x3C,0x20);
      sprintf(buffer,"%d",deger);
      USART3_Write_Text(buffer);
      USART3_Write_Text("\n\r");
   }
}

z

Ne yaptin cozdun mu sorunu?

STM32F407 de I2C donanimina deli oldum. I2C yazilimini bu sekilde degil de register erisimi ile kendim yazdim.

TCM8240MD cipi ile hic sorunsuz konusabiliyorken 24LC64 de sorun yasiyorum. Eepromun herhangi bir adresine yazip tekrardan okuyabiliyorum sorun yok.

Fakat pes pese bir kac adrese yazmaya kalksam Start ardindan gonderdigim komuta ACK gelmemeye basliyor. Sorun 24LC64 demi yoksa yazilimimda mi anlayamadim. Elimde de baska 24LC64 vs yok.

Sorunu cozduyseniz ne yaptiginizi bilmek isterim.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#6
Sorunu buldum.

I2C kameraya ulasirken elbette her sey gulluk gulustanlik olacak. E2ROM da yazma islemi istegi gonderildikten hemen sonra al sunu da su adrese yaz dendiginde e2rom o anda yazmakla mesgul olacagi icin yeni isteklere ack ile cevap vermez.

Mevcut yazilimim ise ACK beklemekte. Haliyle asla ACK gelmez.

Bu durumda iletisim hattini stop edip e2roma yeni bastan yazma isteginde bulunmak lazim.

Kodlarimi henuz degistirmedim ama tum olay bundan ibaret. e2romun yazma islemi icin zamana ihtiyaci oldugu tamamen aklimdan cikip gitmis.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

Hocam Burayı Biraz Açıklarmısınız, Problemin Çözümü Nedir ?