STM8 I2C Busy Flag Problemi

Başlatan quarko, 20 Haziran 2017, 16:40:53

quarko

STM8S003F3 ile I2C üzerinden haberleşen sıcaklık sensörüyle(TCN75) bir cihaz yazılımı ile uğraşıyorum. I2C biriminin başlangıç ayarlarını yaptıktan sonra haberleşmeye henüz başlamadan busy flag i "1" olarak kalıyor maalesef. Option Byte larla alakalı olabileceğini düşündüm fakat bu seride i2c pinleriyle alakalı bir option byte seçeneği de yok. Böyle bir sorun ile karşılaşan oldu mu acaba ? Yoksa sadece şu ihtimal kalıyor, "özdisan dan aldığım stm8s003f3" ler patates malzeme.  :)
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

Bertan

SDA, SCL sinyallerini pull-up yaptınız mı ?

GPIO ayarlarında bu pinleri open-drain olarak ayarladınız mı ?

Sanırım SDA, SCL sinyallerinizde sorun var.

quarko

Alıntı yapılan: bertan88 - 20 Haziran 2017, 17:03:32
SDA, SCL sinyallerini pull-up yaptınız mı ?

GPIO ayarlarında bu pinleri open-drain olarak ayarladınız mı ?

Sanırım SDA, SCL sinyallerinizde sorun var.

Pull-up dirençleri mevcut. Open-drain olarak ta ayarladım. O kısımlarda sıkıntı yok.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

apsis

I2C kodlarınızı gösterebilir misiniz?
"Makineye Beyin" MEKATRONİK

quarko

#4
Alıntı yapılan: apsis - 20 Haziran 2017, 18:28:15
I2C kodlarınızı gösterebilir misiniz?

Şimdilik "Stm8 Standart Peripheral Library" leri kullanarak sadece i2c birimini doğru bir şekilde aktif etmeye çalışıyorum. Ama maalesef busy biti 1 olarak kalıyor. (Sonsuz döngünün başına breakpoint koyarak i2c registerlarını inceleyerek kontrol ediyorum.)

#include "stm8s.h"

void main(void)
{
  /* Clock divider to HSI/1 */
  CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV1);
  
  /* GPIO Init */
  GPIO_Init(GPIOB, (GPIO_Pin_TypeDef)(GPIO_PIN_4 | GPIO_PIN_5), GPIO_MODE_OUT_OD_HIZ_FAST);
  
  /* I2C Peripheral clock enable */
  CLK_PeripheralClockConfig(CLK_PERIPHERAL_I2C, ENABLE);
  
  /* I2C Peripheral Enable */
  I2C_Cmd(ENABLE);
  
  /* I2C configuration after enabling it */
  I2C_Init(100000, 0x48, I2C_DUTYCYCLE_2, I2C_ACK_CURR, I2C_ADDMODE_7BIT, 16);

  for(;;)
  {
    ;
  }
}


"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

apsis

Stm8'lerle hiç uğraşmadım ama ref.manuele baktığımda stm32f in çok registerlerine benziyor.
Register seviyesinde kod atacaksınız sanmıştım.
GitHub gibi sitelerde 32f için yazılmış kodları kendinize uyarlayabilirsiniz. İsterseniz yardımcı olacaksa bendeki 32f4 için kullandığım i2c kodlarını verebilirim(register seviyesinde).
"Makineye Beyin" MEKATRONİK

quarko

@apsis hocam, register seviyesinde de kütüphane fonksiyonlarını kullanarak ta denedim. Hatanın benden kaynaklanmadığından kuvvetle muhtemel eminim. Çünkü hiç i2c birimiyle ilgili tek satır kod yazmasak bile, ne oluyorsa busy biti 1 olarak başlıyor. Errata sında bununla alakalı bir bilgi de yok. O yüzden işlemci nin orjinal olmadığı kanaatine vardım.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

quarko

Şu linkteki arkadaş ta STM8S105 serisinde aynı problemle karşılaşmış. Problemini option byte ları ayarlayarak çözmüş. Fakat benimki STM8S003 serisi. I2C pinleri ile bir ayarlama mevcut değil, option byte lar da.


https://www.mikrocontroller.net/topic/365233


"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

quarko

Problemi çözdüm. Benim kullandığım seride i2c pinlerinin varsayılan alternatif fonksiyonları zaten i2c birimine ait. Bu nedenle option byte ile alakası yok. İşlemci i2c biriminin busy bayrağını sda ve scl pinlerinin lojik durumuna göre ayarlıyor. Normalde bu pinler open drain ve pull-up dirençleri ile lojik1 e çekilmesi gerekiyor. Pull-up dirençlerini takmayı unuttuysanız, i2c pinleri lojik0 da kalabileceğinden dolayı busy bayrağı set durumunda kalabilir. Önce bundan emin olun. İkinci olarak ta i2c ile herhangi bir yazma sekansında problem yaşayıp, birim olmaması gereken ara bir durumda kalırsa da i2c busy bayrağı set durumunda kalabilir. Bu durumda slave durumundaki entgrenin beslemesini kesip verirseniz sorununuz çözülecektir. Bir başka durum ise i2c sinyallerini izlemek için bu pinlere lojik analizör bağlı ise ve lojik analizörün usb kablosu bağlı değil ise pull-up dirençleriniz takılı olsa bile sda ve scl pinleri lojik0 da kalabileceğinden dolayı yine busy bayrağı set durumunda kalabilir.

Yaşadığım tecrübeyi aktarmak istedim. Belki istifade eden olur..
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."