 |
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Tor Okt 09, 2007 8:43 am Naslov sporočila: I2C IPcore z Spartan-3 |
|
|
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 |
|
 |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Tor Okt 09, 2007 9:00 am Naslov sporočila: |
|
|
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...  |
|
Nazaj na vrh |
|
 |
Glitch Član

Pridružen-a: Pet 07 Apr 2006 11:40 Prispevkov: 1477 Aktiv.: 6.32
|
Objavljeno: Tor Okt 09, 2007 10:16 am Naslov sporočila: |
|
|
Ce si zacetnik v VHDL, bi bilo smiselno zaceti s kaksnim bolj enostavnim projektom. Kaj pravis? |
|
Nazaj na vrh |
|
 |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Tor Okt 09, 2007 10:57 am Naslov sporočila: |
|
|
Pravim, da ne in da še vedno rabim kakšen namig pri I2C coreu.
Hvala
D. |
|
Nazaj na vrh |
|
 |
. Član

Pridružen-a: Pon 23 Avg 2004 16:16 Prispevkov: 16777190 Aktiv.: 70821.78
|
Objavljeno: Tor Okt 09, 2007 11:03 am Naslov sporočila: |
|
|
Brisana vsebina odstranjenega uporabnika. |
|
Nazaj na vrh |
|
 |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Tor Okt 09, 2007 11:06 am Naslov sporočila: |
|
|
Ja, 1.5k za vsakega, na 3.3V.
Mislim da bi moralo biti to za 400kHz ok.
LP D |
|
Nazaj na vrh |
|
 |
silica Član

Pridružen-a: Ned 29 Avg 2004 20:01 Prispevkov: 360 Aktiv.: 1.52 Kraj: Logatec
|
Objavljeno: Tor Okt 09, 2007 2:55 pm Naslov sporočila: |
|
|
Poisci XAPP333 na Xilinxovi strani.
LP Tomaz _________________ Za www.quectel.com |
|
Nazaj na vrh |
|
 |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Tor Okt 09, 2007 3:32 pm Naslov sporočila: |
|
|
Zivjo,
težave ležijo v postavljanju in čiščenju ACK bitov... že odpravljam z analyzerjem.
Hvala,
Denis |
|
Nazaj na vrh |
|
 |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Pet Okt 12, 2007 2:02 pm Naslov sporočila: |
|
|
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 |
|
 |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Ned Nov 04, 2007 7:22 pm Naslov sporočila: |
|
|
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 |
|
 |
aly Član



Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 39.71 Kraj: Kranj - struževo
|
Objavljeno: Pon Nov 05, 2007 10:47 am Naslov sporočila: |
|
|
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  |
|
Nazaj na vrh |
|
 |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Pon Nov 05, 2007 1:00 pm Naslov sporočila: |
|
|
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 |
|
 |
icek Član

Pridružen-a: Ned 15 Maj 2005 22:31 Prispevkov: 105 Aktiv.: 0.44 Kraj: Ruše
|
Objavljeno: Pon Nov 05, 2007 5:42 pm Naslov sporočila: |
|
|
Pull-upi ti v tem primeru niso potrebni, saj jih lahko "vklopiš" znotraj Spartana. |
|
Nazaj na vrh |
|
 |
dpavli Član

Pridružen-a: Čet 25 Jan 2007 9:19 Prispevkov: 121 Aktiv.: 0.54
|
Objavljeno: Pon Nov 05, 2007 5:44 pm Naslov sporočila: |
|
|
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 |
|
 |
|
|
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
|