www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Težava z STM32F1

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
MvE
Član
Član



Pridružen-a: Ned 04 Jan 2009 12:24
Prispevkov: 146
Aktiv.: 0.79
Kraj: MB

PrispevekObjavljeno: Ned Nov 23, 2014 2:17 am    Naslov sporočila:  Težava z STM32F1 Odgovori s citatom

Lep pozdrav,

že dobra dva večera se trudim usposobiti I2C komunikacijo na STM32F103RB (NUCLEO). Težava je ta, da po koncu branja enega byta (ko bi že moral biti STOP pulz), SCL linija pošlje ponovnih nekaj pulzov medtem, ko se SDA postavi na '1'. Naj povem, da je pri branju enega byta sprejet podatek pravilen.
Enako se zgodi pri branju dveh bytov vendar ne morem preveriti točnosti podatka (če to res pošilja slave ali je naključna varianta). Edina opazna razlika je ta, da v tem primeru na koncu pride do STOP signala.
Na spodnjih dveh slikah se vidi, da tudi po NACK linija SCL deluje naprej.

Hvala!

Prilagam tudi kodo (za branje enega byta):
Inicializacija I2C...
Koda:
 
  I2C_InitTypeDef  I2C_InitStructure;
  GPIO_InitTypeDef  GPIO_InitStructure;         
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;

  GPIO_Init(GPIOB, &GPIO_InitStructure);
 
  I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;
  I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;
  I2C_InitStructure.I2C_OwnAddress1 = 0x00;
  I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;
  I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;
  I2C_InitStructure.I2C_ClockSpeed = 400000;
 
  I2C_Init(I2C2, &I2C_InitStructure);
  I2C_Cmd(I2C2, ENABLE);


Funkcija za branje...
Koda:

int i2c_readByte(I2C_TypeDef* I2Cx, char addressI2CRB, char regI2CRB, uint8_t *dataOutI2CRB)
{   
            while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
    I2C_GenerateSTART(I2Cx, ENABLE);
            while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
    I2C_Send7bitAddress(I2Cx, addressI2CRB<<1, I2C_Direction_Transmitter);
            while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));
    I2C_SendData(I2Cx, regI2CRB);
            while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));

    I2C_GenerateSTART(I2Cx, ENABLE);
            while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));
    I2C_Send7bitAddress(I2Cx, addressI2CRB<<1, I2C_Direction_Receiver);
    I2C_AcknowledgeConfig(I2Cx, DISABLE);
            while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED));
    *dataOutI2CRB = I2C_ReceiveData(I2Cx);      
    I2C_GenerateSTOP(I2Cx, ENABLE);
            while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));
    I2C_AcknowledgeConfig(I2Cx, ENABLE);
      
      return 1;
}



BranjeEnegaByta.PNG
 Opis:
byti:1.(address+write),2.(register),3.(address+read),4.(received byte),5.(??)
 Velikost datoteke:  18.42 KB
 Pogledana:  11 krat

BranjeEnegaByta.PNG



BranjeDvehBytov.PNG
 Opis:
byti:1.(address+write),2.(register),3.(address+read),4.(received byte 1),5.(received byte 2),6.(??)
 Velikost datoteke:  21.7 KB
 Pogledana:  3 krat

BranjeDvehBytov.PNG


Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
tilz0R
Član
Član



Pridružen-a: Čet 31 Maj 2012 15:39
Prispevkov: 898
Aktiv.: 6.24
Kraj: Črnomelj

PrispevekObjavljeno: Ned Nov 23, 2014 12:02 pm    Naslov sporočila:   Odgovori s citatom

Zdravo,

mogoče bo delovalo, mogoče ne.
Pri sebi imam za branje enega byta izklopljeno ACK funkcijo.

Zamenjaj kodo z "read" funkcijo, pred "return" stavkom.

Koda:
I2C_AcknowledgeConfig(I2Cx, ENABLE);

z
Koda:
I2C_AcknowledgeConfig(I2Cx, DISABLE);


Lahko ti pošljem mojo I2C knjižnico, sicer za F4, ampak so STD funkcije praktično iste.
Spremenit je potrebno samo konfiguracijo pinov.
Več na ZS

_________________
Knowledge sharing is caring.
majerle.eu | stm32f4-discovery.net
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Sigi
Član
Član



Pridružen-a: Čet 31 Jul 2014 11:42
Prispevkov: 199
Aktiv.: 1.69
Kraj: Kamnik

PrispevekObjavljeno: Ned Nov 23, 2014 12:56 pm    Naslov sporočila:   Odgovori s citatom

Ali si preveril errata sheet, namreč za I2C je precej napisanega. Za vsak primer preveri...

lp
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MvE
Član
Član



Pridružen-a: Ned 04 Jan 2009 12:24
Prispevkov: 146
Aktiv.: 0.79
Kraj: MB

PrispevekObjavljeno: Pon Nov 24, 2014 5:54 pm    Naslov sporočila:   Odgovori s citatom

Danes sem imel spet nekaj prostega časa, da sem lahko preizkusil.

tilz0R, kodo za I2C sem našel na tvoji strani in jo vstavil za test.... deluje! Smile Kaj je bila napaka, ne vem. Grem zdaj skozi program. Aja, pred tem sem po tvojem predlogu zamenjal tudi STOP signal (disable z enable) pa ni imelo učinka.

Prav tako sem imel v rokah errata, ampak sem moral zgrešit vrstni red ali nekaj podobnega, Resnično nisem našel napake.

Hvala vama za pomoč! Se ponovno javim ob naslednji težavi Smile

LP
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> ARM arhitektura Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 48 dni


Powered by phpBB © 2001, 2005 phpBB Group