δεδομένων μέσω i2c

T

torius

Guest
Γεια σου,

Είμαι απασχολημένος με 2 moter κωδικευτές.κωδικευτές connented αυτές είναι σε ένα FPGA.FPGA την ανάγκη να μετρούν κάθε παλμού.Έτσι, δημιουργήθηκε ένα 32 bit εγγραφή για να μετράνε.τα 32 bit μητρώο είναι χωρισμένο σε 4 φορές 8 bit.Τώρα θέλω να αποστείλει αυτές τις τιμές σε ένα μικροελεγκτή με I2C,
βρήκα ένα i2c σκλάβα για fpga4fun.Η ερώτησή μου είναι πώς να αποστέλλουν τα δεδομένα μέσω του sda.Ποιος είναι ο καλύτερος τρόπος
που έχω δοκιμάσει κάποια πράγματα, αλλά με τις γνώσεις μου verilog κώδικας δεν είναι και τόσο καλά.

Ελπίζω ότι κάποιος μπορεί να με βοηθήσει

εδώ
είναι ο κώδικας:

/ / Παράδειγμα I2C σκλάβος
/ / Www.fpga4fun.com

ενότητα I2CslaveWith8bitsIO (SDA, SCL, IOout)?

inout SDA?
εισροών SCL?

/ / Η 7-bits διεύθυνση που θέλουμε για μας I2C σκλάβος
παράμετρος I2C_ADR = 7'h27?

/ / I2C ξεκινήσει και να σταματήσει η λογική ανίχνευσης συνθήκες
/ / Αυτή είναι η "μαύρη μαγεία" τμήμα αυτού του σχεδιασμού ...
/ / Χρησιμοποιούμε δύο σύρματα με combinatorial βρόχου για την ανίχνευση της έναρξης και προϋποθέσεις
/ / Να διασφαλίσουμε αυτά τα δύο καλώδια δεν έχουν βελτιστοποιηθεί μακριά
σύρμα SDA_shadow / * σύνθεση διατηρεί = 1 * /?
σύρμα start_or_stop / * σύνθεση διατηρεί = 1 * /?
αντιστοιχίσετε SDA_shadow = (~ SCL | start_or_stop);SDA: SDA_shadow?
αντιστοιχίσετε start_or_stop = ~ SCL;1'b0: (SDA ^ SDA_shadow)?
reg incycle?

πάντα @ (negedge SCL ή posedge start_or_stop)
εάν (start_or_stop)
incycle <= 1'b0?
else if (~ SDA)
incycle <= 1'b1?/ / Τώρα είμαστε έτοιμοι να μετρήσετε το I2C bits που έρχονται σε
reg [3:0] bitcnt? / / μετράει το I2C δυφία από 7 downto 0, συν ένα ACK bit
σύρμα bit_DATA = ~ bitcnt [3]? / / την ΔΕΔΟΜΕΝΩΝ bits είναι τα πρώτα 8 bit αποστέλλονται
σύρμα bit_ACK = bitcnt [3]? / / την ACK bit είναι το 9ο bit αποστέλλονται
reg data_phase?

πάντα @ (negedge SCL ή negedge incycle)
αν (~ incycle)
αρχίζω
bitcnt <= 4'h7? / / την bit 7 λάβει πρώτα
data_phase <= 0?
τέλος
άλλος
αρχίζω
εάν (bit_ACK)
αρχίζω
bitcnt <= 4'h7?
data_phase <= 1?
τέλος
άλλος
bitcnt <= bitcnt - 4'h1?
τέλος

/ / Και να εντοπίζουν αν η διεύθυνση I2C αγώνες τους δικούς μας
σύρμα adr_phase = ~ data_phase?
reg adr_match, op_read, got_ACK?
reg SDAr?

πάντα @ (posedge SCL) SDAr <= SDA? / / SDA για posedge δείγμα, δεδομένου ότι το I2C spec διευκρινίζει στο χαμηλότερο επίπεδο που κατέχουν 0ľs χρόνο για negedge
reg [7:0] mem?
σύρμα op_write = ~ op_read?

πάντα @ (negedge SCL ή negedge incycle)
αν (~ incycle)
αρχίζω
got_ACK <= 0?
adr_match <= 1?
op_read <= 0?
τέλος
άλλος
αρχίζω
εάν (adr_phase & bitcnt == 7 & SDAr! = I2C_ADR [6]) adr_match <= 0?
εάν (adr_phase & bitcnt == 6 & SDAr! = I2C_ADR [5]) adr_match <= 0?
εάν (adr_phase & bitcnt == 5 & SDAr! = I2C_ADR [4]) adr_match <= 0?
εάν (adr_phase & bitcnt == 4 & SDAr! = I2C_ADR [3]) adr_match <= 0?
εάν (adr_phase & bitcnt == 3 & SDAr! = I2C_ADR [2]) adr_match <= 0?
εάν (adr_phase & bitcnt == 2 & SDAr! = I2C_ADR [1]) adr_match <= 0?
εάν (adr_phase & bitcnt == 1 & SDAr! = I2C_ADR [0]) adr_match <= 0?
εάν (adr_phase & bitcnt == 0) op_read <= SDAr?
εάν (bit_ACK) got_ACK <= ~ SDAr? / / παρακολουθούμε τη ACK να είναι σε θέση να ελευθερώσει το λεωφορείο, όταν ο κυβερνήτης δεν ACK διαβάσει κατά τη διάρκεια μιας επιχείρησης

εάν (adr_match & bit_DATA & data_phase & op_write) mem [bitcnt] <= SDAr? / / μνήμη γράψετε
τέλος

/ / Και να δώσει το SDA γραμμή όταν είναι απαραίτητο.
σύρμα mem_bit_low = ~ mem [bitcnt [2:0]]?
σύρμα SDA_assert_low = adr_match & bit_DATA & data_phase & op_read & mem_bit_low & got_ACK?
σύρμα SDA_assert_ACK = adr_match & & bit_ACK (adr_phase | op_write)?
σύρμα SDA_low = SDA_assert_low | SDA_assert_ACK?
αντιστοιχίσετε SDA = SDA_low;1'b0: 1'bz?endmodule

 
Γεια σου, torius

Δεν είναι δύσκολο να κάνει απλές I2C IO χρήση HDL

Πρέπει όμως να έχουν κάποια βάση γνώσεων των I2C spec και λογική

σχεδιασμού

Η fpga4fun.coms' I2C είναι καλό παράδειγμα για μια πρωτόπειρος

δεν πιο εύκολο παράδειγμα αρέσει.

 
Γειά,

Κατανοώ την i2c πρωτόκολλο, το μόνο πρόβλημα για μένα είναι verilog κώδικα,

το μόνο πράγμα που έχω τι να κάνουμε τώρα είναι μια reg [31:0] δεδομένα.στείλετε μέσω της γραμμής sda έτσι πρέπει να στείλετε 8 bit τότε περιμένουμε ack τότε στείλτε 8 bit
κλπ, αλλά αυτό είναι το πρόβλημα, δεν γνωρίζουν πώς να το κάνουμε αυτό σε ένα καλό δρόμο.δοκιμάσει διάφορα πράγματα όπως για παράδειγμα με την περίπτωση structere αλλά did't εργασίας, ίσως μπορείτε να μου δώσετε ένα παράδειγμα για να ξεκινήσει;

thnx anyway

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Χαμόγελο" border="0" />χαιρετά torius

 
γεια,

1.

Η fpga4fun.com παρέχουν επίσης VHDL κώδικα, Ελέγξτε ξανά.<img src="http://images.elektroda.net/95_1161601083.jpg" border="0" alt=""/>
http://www.fpga4fun.com/I2Cslave1.html2.

Θα σας δώσω ορισμένα μου ιδανικό,

Στην ανάγκη σας, θα πρέπει να περιέχουν 32 bit counter, ένα 32 bit μάνδαλο ....

και κάποια λογική ελέγχου.

mcu όταν χρειαστεί να το διαβάσετε την αξία, πρώτη mcu στείλει μάνδαλο εντολή (υποδοχής γράψετε

να σκλάβος) να σας I2C σκλάβος μάνδαλο για την αξία των 32 bit σε 32 bit counter μάνδαλο.

δευτερόλεπτα mcu λάβετε MSB των 32 bit μάνδαλο (διαβάστε μορφή υποδοχής σκλάβος),

τότε λάβετε 2η ,....... LSB και ας λάβετε 32 bit μάνδαλο ανοίγω το μανδαλάκι.

εδώ θα πρέπει να δώσουν προσοχή στην αντιμετώπιση του synchr CLK και μάνδαλο σήμα,

Μπορεί πέραν μάνδαλο τιμή σφάλματος σε ορισμένες συνθήκες.

Είμαι κακή στα αγγλικά, οπότε ελπίζω ότι μπορεί να καταλάβει τι λέω ....

addn

 
Hallo, addn

πρώτον, thnx για την αντίδρασή σας.

Καταλαβαίνω τι λέτε.αυτό είναι ό, τι είχα στο μυαλό μου.

πάντα @ (προϋπόθεση) sel1 = sel1 1?

πάντα @ (προϋπόθεση) αρχίζουν
got_ACK = 1'b1? / / temp για προσομοίωση
περίπτωση (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: εάν (got_ACK) αρχίζουν
next_sel1 = 1'b1?
SDA = Enc_1T [8]?
τέλος
10: εάν (next_sel1) SDA = Enc_1T [9]?
11: εάν (next_sel1) SDA = Enc_1T [10]?
12: εάν (next_sel1) SDA = Enc_1T [11]?
13: εάν (next_sel1) SDA = Enc_1T [12]?
14: εάν (next_sel1) SDA = Enc_1T [13]?
15: εάν (next_sel1) SDA = Enc_1T [14]?
16: εάν (next_sel1) SDA = Enc_1T [15]?
17: εάν (next_sel1) SDA 1'bz =?
18: εάν (got_ACK) αρχίζουν
next_sel2 = 1'b1?
SDA = Enc_1T [16]?
τέλος
19: εάν (next_sel2) SDA = Enc_1T [17]?
20: εάν (next_sel2) SDA = Enc_1T [18]?
21: εάν (next_sel2) SDA = Enc_1T [19]?
22: εάν (next_sel2) SDA = Enc_1T [20]?
23: εάν (next_sel2) SDA = Enc_1T [21]?
24: εάν (next_sel2) SDA = Enc_1T [22]?
25: εάν (next_sel2) SDA = Enc_1T [23]?
26: εάν (next_sel2) SDA 1'bz =?
27: εάν (got_ACK) αρχίζουν
next_sel3 = 1'b1?
SDA = Enc_1T [24]?
τέλος
28: εάν (next_sel3) SDA = Enc_1T [25]?
29: εάν (next_sel3) SDA = Enc_1T [26]?
30: εάν (next_sel3) SDA = Enc_1T [27]?
31: εάν (next_sel3) SDA = Enc_1T [28]?
32: εάν (next_sel3) SDA = Enc_1T [29]?
33: εάν (next_sel3) SDA = Enc_1T [30]?
34: εάν (next_sel3) SDA = Enc_1T [31]?
35: εάν (next_sel3) SDA 1'bz =?
endcase

 
γεια,

ίσως μπορείτε να χρησιμοποιήσετε shift_reg

ex:

...................
εάν (SCL'event και SCL ='0 ') τότε
εάν (other_condition) τότε
SDA_tmp <= shift_reg (31)?
...................
shift_reg (31 downto 1) <= shift_reg (30 downto 0)?
τέλος, αν?
.....................
τέλος, αν?
...........................
SDA <='0 ', όταν (SDA_tmp ='0' και other_condition1) άλλο
"Z"?
...........................

 
Γεια σου,

Πείτε μου σας απαιτήσεις για I2C κεντρικό ελεγκτή, θα σας δώσω τον κώδικα σε VHDL

Χαιρετισμοί
vs21

 
γεια και πάλι

thnx addn πιστεύω ότι με τη μετάβαση reg την ευκολότερη

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Χαμόγελο" border="0" />thnx vs21 επίσης για την προσφορά σας, αλλά νομίζω ότι θα κάνει τώρα

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Χαμόγελο" border="0" />

αν και δεν θα replay για την προσφορά σας

<img src="http://www.edaboard.com/images/smiles/icon_smile.gif" alt="Χαμόγελο" border="0" />thnx
Torius

 

Welcome to EDABoard.com

Sponsor

Back
Top