Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Diğer => Konuyu başlatan: quarko - 20 Haziran 2017, 16:40:53

Başlık: STM8 I2C Busy Flag Problemi
Gönderen: quarko - 20 Haziran 2017, 16:40:53
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.  :)
Başlık: Ynt: STM8 I2C Busy Flag Problemi
Gönderen: Bertan - 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.
Başlık: Ynt: STM8 I2C Busy Flag Problemi
Gönderen: quarko - 20 Haziran 2017, 17:50:20
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.
Başlık: Ynt: STM8 I2C Busy Flag Problemi
Gönderen: apsis - 20 Haziran 2017, 18:28:15
I2C kodlarınızı gösterebilir misiniz?
Başlık: Ynt: STM8 I2C Busy Flag Problemi
Gönderen: quarko - 20 Haziran 2017, 21:46:10
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(;;)
  {
    ;
  }
}


Başlık: Ynt: STM8 I2C Busy Flag Problemi
Gönderen: apsis - 20 Haziran 2017, 23:06:48
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).
Başlık: Ynt: STM8 I2C Busy Flag Problemi
Gönderen: quarko - 20 Haziran 2017, 23:14:40
@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.
Başlık: Ynt: STM8 I2C Busy Flag Problemi
Gönderen: quarko - 20 Haziran 2017, 23:19:31
Ş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 (https://www.mikrocontroller.net/topic/365233)


(https://www.mikrocontroller.net/attachment/255690/Programmer.png)
Başlık: Ynt: STM8 I2C Busy Flag Problemi
Gönderen: quarko - 25 Haziran 2017, 00:47:26
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..