podatkov prek I2C

T

torius

Guest
Hello there,

Sem zaposlen s 2 moter encoders.ti so encoders connented na FPGA.FPGA potrebo za štetje vsak utrip.tudi jaz ustvarila 32 bitni register za štetje.32 bit register je razdeljeno na 4-krat 8 bit.Zdaj hočem, da pošljejo te vrednosti mikrokrmilniška z I2C, sem našel I2C sužnji na fpga4fun.Moje vprašanje je, kako poslati podatke prek sda.Kaj je najboljši način Poskusil sem nekaj stvari, vendar mi je znano z verilog koda ni tako dober.

Upam, da nekateri moči pomoč mi

tukaj je koda:

/ / Primer I2C slave
/ / Www.fpga4fun.com

modul I2CslaveWith8bitsIO (SDA, SCL, IOout);

InOut SDA;
input SCL;

/ / 7-bitov naslov, da želimo za našo I2C slave
parameter I2C_ADR = 7'h27;

/ / I2C zagon in ustavitev pogoji odkrivanje logike
/ / To je "črno magijo", del tega modela ...
/ / Mi uporabljamo dve žici z combinatorial zanko za odkrivanje začeti in končati pogoji
/ / Kar prepričan ti dve žice ne dobite optimizirana stran
žice SDA_shadow / * sintezo vodi = 1 * /;
žice start_or_stop / * sintezo vodi = 1 * /;
dodelite SDA_shadow = (~ SCL | start_or_stop)?SDA: SDA_shadow;
dodeliti start_or_stop = ~ SCL?1'b0: (SDA ^ SDA_shadow);
reg incycle;

Vedno @ (negedge SCL ali start_or_stop posedge)
if (start_or_stop)
incycle <= 1'b0;
else if (~ SDA)
incycle <= 1'b1;/ / Sedaj smo pripravljeni za štetje I2C bitov, ki prihajajo v
reg [3:0] bitcnt; / / šteje I2C bits od 7 downto 0, plus ACK bit
wire bit_DATA = ~ bitcnt [3], / / DATA bitov se prvih 8 bitov, pošlje
wire bit_ACK = bitcnt [3], / / ACK bit je bit poslano 9.
reg data_phase;

Vedno @ (negedge SCL ali incycle negedge)
if (~ incycle)
začeti
bitcnt <= 4'h7; / / bit 7 je prejela prvo
data_phase <= 0;
konec
še
začeti
if (bit_ACK)
začeti
bitcnt <= 4'h7;
data_phase <= 1;
konec
še
bitcnt <= bitcnt - 4'h1;
konec

/ / In odkrivanja, če je naslov I2C tekem lastnega
wire adr_phase = ~ data_phase;
reg adr_match, op_read, got_ACK;
reg SDAR;

Vedno @ (posedge SCL) SDAR <= SDA; / / vzorec SDA na posedge saj spec I2C določa tako nizke, kot 0ľs imajo časa na negedge
reg [7:0] mem;
wire op_write = ~ op_read;

Vedno @ (negedge SCL ali incycle negedge)
if (~ incycle)
začeti
got_ACK <= 0;
adr_match <= 1;
op_read <= 0;
konec
še
začeti
if (adr_phase & bitcnt == 7 & SDAR! = I2C_ADR [6]) adr_match <= 0;
if (adr_phase & bitcnt == 6 & SDAR! = I2C_ADR [5]) adr_match <= 0;
if (adr_phase & bitcnt == 5 & SDAR! = I2C_ADR [4]) adr_match <= 0;
if (adr_phase & bitcnt == 4 & SDAR! = I2C_ADR [3]) adr_match <= 0;
if (adr_phase & bitcnt == 3 & SDAR! = I2C_ADR [2]) adr_match <= 0;
if (adr_phase & bitcnt == 2 & SDAR! = I2C_ADR [1]) adr_match <= 0;
if (adr_phase & bitcnt == 1 & SDAR! = I2C_ADR [0]) adr_match <= 0;
if (adr_phase & bitcnt == 0) op_read <= SDAR;
if (bit_ACK) got_ACK <= ~ SDAR; / / spremljamo ACK, da se lahko prosto avtobus, ko poveljnik ne ACK med brati operacijo

if (adr_match & bit_DATA & data_phase & op_write) mem [bitcnt] <= SDAR; / / spomin pisanje
konec

/ / In vozite črto SDA kadar je to potrebno.
wire mem_bit_low = ~ mem [bitcnt [2:0]];
wire SDA_assert_low = adr_match & bit_DATA & data_phase & op_read & mem_bit_low & got_ACK;
wire SDA_assert_ACK = adr_match & bit_ACK & (adr_phase | op_write);
wire SDA_low = SDA_assert_low | SDA_assert_ACK;
dodeliti SDA = SDA_low?1'b0: 1'bz;endmodule

 
hi, torius

To ni težko narediti preprost I2C IO uporabo HDL

ampak vi shoud nekaj podlagi znanja spec I2C in logika

idejni projekt

I2C fpga4fun.coms "Primer za to je dobro za tyro

no bolj preprosto, kot je npr.

 
Zdravo,

Razumem I2C protokol, edini problem mi je verilog kodo,

Edina stvar, kar sem moraš storiti zdaj je reg [31:0] podatkov.pošljete po sda črto, tako da moram poslati 8 bitov torej čakati na ack nato pošlje 8 bitov itd, ampak to je problem, ne vem, kako to storiti na dober način.poskusili različne stvari, na primer s sodno structere vendar did't delo, morda vi moči izročiti mi na primer za začetek?

thnx anyway

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Nasmeh" border="0" />ogovoriti torius

 
živjo,

1.

Fpga4fun.com tudi VHDL kode, Preverite še enkrat.<img src="http://images.elektroda.net/95_1161601083.jpg" border="0" alt="Data through i2c" title="Podatkov prek I2C"/>
http://www.fpga4fun.com/I2Cslave1.html2.

Dam vam nekaj moj ideal,

V vašem potrebujejo, bi morali vsebovati 32 bitni števec, 32 bit zapah ....

in nekaj kontrolnih logiko.

MCU, ko je treba brati protivrednost, prvi MCU pošlje zapah ukaz (gostitelja napisati

do slave) na svoj I2C slave za zapah vrednosti 32 bitni števec, v 32 bit zapah.

drugi MCU prejme MSB 32-bitni zapah (gostiteljica preberite obrazec slave),

prejme 2. ,....... prejeli LSB in pustite 32 bitni zapah Odpreti dvigom reče.

Tukaj boste morali posvetiti pozornost synchr boja CLK in zapah signal,

V nasprotnem primeru lahko ključavnica vrednost napake v nekaterih stanju.

Jaz sem slaba v angleščini, tako da upanje lahko razumete, kaj sem rekel ....

addn

 
Hallo, addn

Prvi, Thnx za vaše reakcije.

Razumem, kaj praviš.to je tisto, kar sem imel v mislih.

Vedno @ (pogoj) sel1 = sel1 1;

Vedno @ (pogoj) začnejo
got_ACK = 1'b1; / / temp za simulacijo
primeru (sel1)
0: SDA = Enc_1T [0];
1: SDA = Enc_1T [1];
2: SDA = Enc_1T [2];
3: SDA = Enc_1T [3];
4: SDA = Enc_1T [4];
5: SDA = Enc_1T [5];
6: SDA = Enc_1T [6];
7: SDA = Enc_1T [7];
8: SDA = 1'bz; / / ackbit
9: if (got_ACK) začnejo
next_sel1 = 1'b1;
SDA = Enc_1T [8];
konec
10: if (next_sel1) SDA = Enc_1T [9];
11: if (next_sel1) SDA = Enc_1T [10];
12: if (next_sel1) SDA = Enc_1T [11];
13: if (next_sel1) SDA = Enc_1T [12];
14: if (next_sel1) SDA = Enc_1T [13];
15: if (next_sel1) SDA = Enc_1T [14];
16: if (next_sel1) SDA = Enc_1T [15];
17: if (next_sel1) SDA = 1'bz;
18: if (got_ACK) začnejo
next_sel2 = 1'b1;
SDA = Enc_1T [16];
konec
19: if (next_sel2) SDA = Enc_1T [17];
20: if (next_sel2) SDA = Enc_1T [18];
21: if (next_sel2) SDA = Enc_1T [19];
22: if (next_sel2) SDA = Enc_1T [20];
23: if (next_sel2) SDA = Enc_1T [21];
24: if (next_sel2) SDA = Enc_1T [22];
25: if (next_sel2) SDA = Enc_1T [23];
26: if (next_sel2) SDA = 1'bz;
27: if (got_ACK) začnejo
next_sel3 = 1'b1;
SDA = Enc_1T [24];
konec
28: if (next_sel3) SDA = Enc_1T [25];
29: if (next_sel3) SDA = Enc_1T [26];
30: if (next_sel3) SDA = Enc_1T [27];
31: if (next_sel3) SDA = Enc_1T [28];
32: if (next_sel3) SDA = Enc_1T [29];
33: if (next_sel3) SDA = Enc_1T [30];
34: if (next_sel3) SDA = Enc_1T [31];
35: if (next_sel3) SDA = 1'bz;
endcase

 
živjo,

Morda jih lahko uporabite shift_reg

ex:

...................
če (SCL'event in SCL = '0 ') then
if (other_condition) in nato
SDA_tmp <= shift_reg (31);
...................
shift_reg (31 downto 1) <= shift_reg (30 downto 0);
end if;
.....................
end if;
...........................
SDA <= '0 ', ko (SDA_tmp = '0' in other_condition1) else
'Z';
...........................

 
Živjo,

Povej mi svoje zahteve za krmilnik gostitelja I2C, vam bom dal kodo v VHDL

S spoštovanjem
vs21

 
hello spet

thnx addn mislim s svojo premik reg svojo veliko lažje

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Nasmeh" border="0" />thnx vs21 tudi za vašo ponudbo, ampak mislim, da bo zdaj

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Nasmeh" border="0" />

in če ne bom Replay na vašo ponudbo

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Nasmeh" border="0" />thnx
Torius

 

Welcome to EDABoard.com

Sponsor

Back
Top