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 

I2C IPcore z Spartan-3

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> FPGA in CPLD programabilna vezja
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
dpavli
Član
Član



Pridružen-a: Čet 25 Jan 2007 9:19
Prispevkov: 121
Aktiv.: 0.54

PrispevekObjavljeno: Tor Okt 09, 2007 8:43 am    Naslov sporočila:  I2C IPcore z Spartan-3 Odgovori s citatom

Pozdravljeni,

a je mogoče komu uspelo uporabiti IPcore za I2C komunikacijo z opencores.org?

Uporabil sem staro verzijo (izgleda preprostejša), vendar kljub temu da dobivam potrebne acknowledge-je in mi gre statemachine skozi vsa stanja za prenos, v data registru ne dobim ničesar.

Ob gledanju SDA in SCL linij na osciloskopu ugotovim, da je na obeh nek periodičen kvadratni signal, ki se spremeni ob proženju komunikacije (s tipko). Sklepam da to ni pravilno in bi morali biti te dve liniji ves čas na 1 razen ko se komunicira?

Za kakršnokoli pomoč že vnaprej hvala,
D.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
dpavli
Član
Član



Pridružen-a: Čet 25 Jan 2007 9:19
Prispevkov: 121
Aktiv.: 0.54

PrispevekObjavljeno: Tor Okt 09, 2007 9:00 am    Naslov sporočila:   Odgovori s citatom

Mogoče lahko dodam še izsek v VHDL-u:

Koda:
-- I2C
   procI2C: process(clk_115kHz)
   begin
      if rising_edge(clk_115kHz) then
         case I2C_state is
            when none =>
               led_delay <= "000000000000000000";
               I2C_NRESET <= '1';
               if (but0_state = pressed) then
                  I2C_state <= i1;
               end if;
            when i1 =>
               --I2C_NRESET <= '0';
               I2C_DATAOUT <= "10111010"; --0xBA
               I2C_START <= '1';
               I2C_STOP <= '0';
               I2C_READ <= '0';
               I2C_WRITE <= '1';
               I2C_ACKIN <= '0';
               I2C_state <= i2;
            when i2 =>
               if I2C_CMDACK = '1' then
                  I2C_DATAOUT <= I2C_regaddr; --registry we would like to read, 0x00
                  I2C_START <= '0';
                  I2C_STOP <= '0';
                  I2C_READ <= '0';
                  I2C_WRITE <= '1';
                  I2C_ACKIN <= '0';
                  I2C_state <= i3;
               end if;
            when i3 =>
               if I2C_CMDACK = '1' then
                  I2C_DATAOUT <= "10111011"; --0xBB
                  I2C_START <= '1';
                  I2C_STOP <= '0';
                  I2C_READ <= '0';
                  I2C_WRITE <= '1';
                  I2C_ACKIN <= '0';
                  I2C_state <= i4;
               end if;
            when i4 =>
               if I2C_CMDACK = '1' then
                  I2C_received(15 downto 8) <= I2C_DATAIN;
                  I2C_ACKOUT <= '0';--ACK
                  I2C_state <= i5;
               else
                  I2C_received(15 downto 12) <= "1000";
                  I2C_received(11 downto 8) <= "1000";      
               end if;
            when i5 =>
               if I2C_CMDACK = '1' then
                  I2C_received(7 downto 0) <= I2C_DATAIN;
                  I2C_ACKOUT <= '1';--NACK
                  I2C_STOP <= '1';
                  I2C_state <= i6;
               else
                  I2C_received(7 downto 4) <= "1000";
                  I2C_received(3 downto 0) <= "1000";               
               end if;
            when i6 =>
                  led_delay <= led_delay + "000000000000000001";
                  if led_delay > "110000110101000000" then
                     I2C_state <= none;
                  end if;
         end case;
      end if;
   end process;


Sem pa začetnik na področju VHDL-ja in bi prosu za prizanesljivost če so v kodi kakšne banalne napake.

Je pa res, da sicer zadeva deluje. Če I2C_datain nadomestim s poljubnimi vektorji, lahko na LED displayu vidim, da je logika ok, saj mi jih prikaže.

Tisti "else" pogoji so mišljeni, da mi ob napaki LED display izpiše 8888.

LP D


EDIT: preblisk -- verjetno sem ga u*ral s clocki, zdaj vidim kaj sem mu pripeljal... Sad
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Glitch
Član
Član



Pridružen-a: Pet 07 Apr 2006 11:40
Prispevkov: 1477
Aktiv.: 6.32

PrispevekObjavljeno: Tor Okt 09, 2007 10:16 am    Naslov sporočila:   Odgovori s citatom

Ce si zacetnik v VHDL, bi bilo smiselno zaceti s kaksnim bolj enostavnim projektom. Kaj pravis?
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
dpavli
Član
Član



Pridružen-a: Čet 25 Jan 2007 9:19
Prispevkov: 121
Aktiv.: 0.54

PrispevekObjavljeno: Tor Okt 09, 2007 10:57 am    Naslov sporočila:   Odgovori s citatom

Pravim, da ne in da še vedno rabim kakšen namig pri I2C coreu.

Hvala
D.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
.
Član
Član



Pridružen-a: Pon 23 Avg 2004 16:16
Prispevkov: 16777190
Aktiv.: 70819.80

PrispevekObjavljeno: Tor Okt 09, 2007 11:03 am    Naslov sporočila:   Odgovori s citatom

Brisana vsebina odstranjenega uporabnika.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
dpavli
Član
Član



Pridružen-a: Čet 25 Jan 2007 9:19
Prispevkov: 121
Aktiv.: 0.54

PrispevekObjavljeno: Tor Okt 09, 2007 11:06 am    Naslov sporočila:   Odgovori s citatom

Ja, 1.5k za vsakega, na 3.3V.

Mislim da bi moralo biti to za 400kHz ok.

LP D
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
silica
Član
Član



Pridružen-a: Ned 29 Avg 2004 20:01
Prispevkov: 360
Aktiv.: 1.52
Kraj: Logatec

PrispevekObjavljeno: Tor Okt 09, 2007 2:55 pm    Naslov sporočila:   Odgovori s citatom

Poisci XAPP333 na Xilinxovi strani.

LP Tomaz

_________________
Za www.quectel.com
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
dpavli
Član
Član



Pridružen-a: Čet 25 Jan 2007 9:19
Prispevkov: 121
Aktiv.: 0.54

PrispevekObjavljeno: Tor Okt 09, 2007 3:32 pm    Naslov sporočila:   Odgovori s citatom

Zivjo,

težave ležijo v postavljanju in čiščenju ACK bitov... že odpravljam z analyzerjem.

Hvala,
Denis
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
dpavli
Član
Član



Pridružen-a: Čet 25 Jan 2007 9:19
Prispevkov: 121
Aktiv.: 0.54

PrispevekObjavljeno: Pet Okt 12, 2007 2:02 pm    Naslov sporočila:   Odgovori s citatom

Zadeva deluje - zanimivo (in obenem neprijetno) pri tem coreu je, da je potrebno vpeljati dodatno logiko, če hočemo prebrati kakšen byte več kot le zadnjega (po defaultu zna v stateu, ki sem ga označil z 'i5', prebrati le zadnjih 8 bitov).

Če bo kdo kdaj rabil kakšne informacije za ta core, mu bom rade volje pomagal v tej temi.

LP D
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
dpavli
Član
Član



Pridružen-a: Čet 25 Jan 2007 9:19
Prispevkov: 121
Aktiv.: 0.54

PrispevekObjavljeno: Ned Nov 04, 2007 7:22 pm    Naslov sporočila:   Odgovori s citatom

A mogoče kdo ve, kako bi lahko združil dva I2C busa z FPGA-jem? Gre za takšno situacijo:

SDA1, SCL1 ---(pull-upi)---- [ FPGA ] ----(pull-upi)--- SDA2, SCL2

Index1 pomeni masterja, index2 pa slavea. V mislih sem imel nekaj takega kar prikazuje spodnja koda, vendar se mi dozdeva, da takšna stvar ne bo delovala bidirekcionalno, ampak bo samo prenašala ukaze masterja (1) k slaveu (2), komunikacija v drugi smeri pa ne bo možna:

Koda:
SDA2 <= '0' when SDA1 = '0' else 'Z';
SCL2 <= '0' when SCL1 = '0' else 'Z';


Kakšen predlog? Ali pa sem morda samo zakompliciral in je dovolj, da en par pull-upov odstranim, da ostanejo open-drain izhodi in enostavno samo prevežem zadevo (tako da označim vse pine tipa 'inout')?

Hvala za pomoč,
D.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
aly
Član
Član



Pridružen-a: Tor 28 Sep 2004 14:51
Prispevkov: 9407
Aktiv.: 39.71
Kraj: Kranj - struževo

PrispevekObjavljeno: Pon Nov 05, 2007 10:47 am    Naslov sporočila:   Odgovori s citatom

Narediti moraš dve enosmerni povezavi (vsako v eno smer) in ju potem zunaj hardversko združiti.
_________________
I'm going to stand outside, so if anyone asks, I'm outstanding Smile
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran MSN Messenger - naslov
dpavli
Član
Član



Pridružen-a: Čet 25 Jan 2007 9:19
Prispevkov: 121
Aktiv.: 0.54

PrispevekObjavljeno: Pon Nov 05, 2007 1:00 pm    Naslov sporočila:   Odgovori s citatom

aly je napisal/a:
Narediti moraš dve enosmerni povezavi (vsako v eno smer) in ju potem zunaj hardversko združiti.


Tnx,
D
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
icek
Član
Član



Pridružen-a: Ned 15 Maj 2005 22:31
Prispevkov: 105
Aktiv.: 0.44
Kraj: Ruše

PrispevekObjavljeno: Pon Nov 05, 2007 5:42 pm    Naslov sporočila:   Odgovori s citatom

Pull-upi ti v tem primeru niso potrebni, saj jih lahko "vklopiš" znotraj Spartana.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
dpavli
Član
Član



Pridružen-a: Čet 25 Jan 2007 9:19
Prispevkov: 121
Aktiv.: 0.54

PrispevekObjavljeno: Pon Nov 05, 2007 5:44 pm    Naslov sporočila:   Odgovori s citatom

Sem šel po tej alternativi, da FPGA ne bo "šlatu" I2C busa ampak sem zadeve prevezal izven - manj dela, I2C master je pa tako ali tako FX2LP.

Hvala vseeno
LP Denis
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> FPGA in CPLD programabilna vezja Č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: 493 dni


Powered by phpBB © 2001, 2005 phpBB Group