fosgate7 Δημοσ. 23 Ιουνίου 2015 Δημοσ. 23 Ιουνίου 2015 Παίδες help! Προγραμματίζω έναν dspic της microchip και θέλω να τον κάνω να επικοινωνεί με ένα ολοκληρωμένο μέσω του πρωτοκόλλου I2C. Συγκεκριμένα ο μΕ είναι ο dsPIC30F2020: http://ww1.microchip.com/downloads/en/DeviceDoc/70000178d.pdf περισσότερες πληροφορίες σχετικά με το I2C module εδώ: http://www.microchip.com/stellent/groups/techpub_sg/documents/devicedoc/en026096.pdf) Το ολοκληρωμένο είναι το TC74, επίσης της microchip: http://ww1.microchip.com/downloads/en/DeviceDoc/21462D.pdf Παρακάτω είναι ένα τμήμα του κώδικα, ό,τι αφορά στο I2C. while ((I2CCONbits.ACKEN)||(I2CCONbits.RCEN)||(I2CCONbits.PEN)|| (I2CCONbits.RSEN)||(I2CCONbits.SEN)||(I2CSTATbits.TRSTAT)); I2CCONbits.SEN = 1; while ((I2CCONbits.ACKEN)||(I2CCONbits.RCEN)||(I2CCONbits.PEN)|| (I2CCONbits.RSEN)||(I2CCONbits.SEN)||(I2CSTATbits.TRSTAT)); I2CTRN = 0x96; if (I2CSTATbits.IWCOL) U1TXREG = printf("IWCOL\n"); else { while (I2CSTATbits.TRSTAT); while ((I2CCONbits.ACKEN)||(I2CCONbits.RCEN)||(I2CCONbits.PEN)|| (I2CCONbits.RSEN)||(I2CCONbits.SEN)||(I2CSTATbits.TRSTAT)); if (I2CSTATbits.ACKSTAT) U1TXREG = printf("slave NACK\n"); } I2CTRN = 0x00; if (I2CSTATbits.IWCOL) U1TXREG = printf("IWCOL\n"); else { while (I2CSTATbits.TRSTAT); while ((I2CCONbits.ACKEN)||(I2CCONbits.RCEN)||(I2CCONbits.PEN)|| (I2CCONbits.RSEN)||(I2CCONbits.SEN)||(I2CSTATbits.TRSTAT)); if (I2CSTATbits.ACKSTAT) U1TXREG = printf("slave NACK\n"); } I2CCONbits.PEN = 1; j=0xFF; while (j != 0) { j--; } while ((I2CCONbits.ACKEN)||(I2CCONbits.RCEN)||(I2CCONbits.PEN)|| (I2CCONbits.RSEN)||(I2CCONbits.SEN)||(I2CSTATbits.TRSTAT)); I2CCONbits.SEN = 1; while ((I2CCONbits.ACKEN)||(I2CCONbits.RCEN)||(I2CCONbits.PEN)|| (I2CCONbits.RSEN)||(I2CCONbits.SEN)||(I2CSTATbits.TRSTAT)); I2CTRN = 0x97; if (I2CSTATbits.IWCOL) U1TXREG = printf("IWCOL\n"); else { while (I2CSTATbits.TRSTAT); while ((I2CCONbits.ACKEN)||(I2CCONbits.RCEN)||(I2CCONbits.PEN)|| (I2CCONbits.RSEN)||(I2CCONbits.SEN)||(I2CSTATbits.TRSTAT)); if (I2CSTATbits.ACKSTAT) U1TXREG = printf("slave NACK\n"); } I2CCONbits.RCEN = 1; while (I2CCONbits.RCEN); I2CSTATbits.I2COV = 0; while ((I2CCONbits.ACKEN)||(I2CCONbits.RCEN)||(I2CCONbits.PEN)|| (I2CCONbits.RSEN)||(I2CCONbits.SEN)||(I2CSTATbits.TRSTAT)); I2CCONbits.ACKDT = 1; I2CCONbits.ACKEN = 1; I2CCONbits.PEN = 1; Temp = I2CRCV; } Η διαδικασία για να γράψεις και να διαβάσεις περιγράφεται και στα δύο datasheet, παρ' όλα αυτά δε λειτουργεί αν εκτελεστεί έστω και κατά γράμμα. Η παραπάνω διαδικασία εκτελέστηκε σε παρόμοιο μΕ και λειτούργησε. Στη δική μου περίπτωση, ο κώδικας τρέχει κανονικά, κάθε φορά όμως που στέλνω στο ολοκληρωμένο μία διεύυνση, την περνάει κατευθείαν στον register που καταχωρούνται τα δεδομένα που πρέπει να στείλει στον μΕ. Αποτέλεσμα είναι η μεταβλητή Temp, να έχει τελικά την τιμή 0x97. Επιπλέον, αν τρέξεις το πρόγραμμα γραμμή-γραμμή, κολλάει στην εντολή while (I2CCONbits.RCEN); Με λίγα λόγια, αφού γίνει set το bit που ενεργοποιεί τη λήψη στον μΕ, δεν γίνεται ποτέ clear, δηλαδή η λήψη δεν ολοκληρώνεται ποτέ! Έχει κανείς καμία ιδέα; Ευχαριστώ όποιον ασχοληθεί!!!
CtrlFreak Δημοσ. 23 Ιουνίου 2015 Δημοσ. 23 Ιουνίου 2015 Ξεκίνα περνώντας σε define τους καταχωρητές με λογικά ονόματα για να αποφύγεις τα μακρυνάρια.
nkarama Δημοσ. 24 Ιουνίου 2015 Δημοσ. 24 Ιουνίου 2015 Γιαυτό δεν αλλάζω το arduino με τίποτα. Σου κρύβει όλη αυτή την πολύπλοκότητα και σε αφήνει να ασχοληθείς με αυτά που θέλεις να κάνεις... Βέβαια δεν έχουμε ακόμα υποστήριξη σε κανένα dsp... Απο PIC δεν έχω ιδέα, αλλά έτσι κουβέντα να γίνετε, απο pull up αντιστάσεις στις 2 γραμμές, τι έχεις?
fosgate7 Δημοσ. 24 Ιουνίου 2015 Μέλος Δημοσ. 24 Ιουνίου 2015 Ξεκίνα περνώντας σε define τους καταχωρητές με λογικά ονόματα για να αποφύγεις τα μακρυνάρια. Μακρυνάρια λογικά εννοείς τις μεγάλες συνθήκες στα while. Αυτά στην ουσία είναι έλεγχος για το ότι το bus είναι idle, καθώς δεν υπάρχει κάποιο αντίστοιχο bit που να αλλάζει κατάσταση ανάλογα με την περίσταση, πρέπει να τα ελέγχω όλα μαζί! Γιαυτό δεν αλλάζω το arduino με τίποτα. Σου κρύβει όλη αυτή την πολύπλοκότητα και σε αφήνει να ασχοληθείς με αυτά που θέλεις να κάνεις... Βέβαια δεν έχουμε ακόμα υποστήριξη σε κανένα dsp... Απο PIC δεν έχω ιδέα, αλλά έτσι κουβέντα να γίνετε, απο pull up αντιστάσεις στις 2 γραμμές, τι έχεις? Από αντιστάσεις πιστεύω ότι είμαι κομπλέ, 7-8k έχω βάλει, δε νομίζω να είναι εκεί το πρόβλημα, αλλιώς λογικά δε θα λειτουργούσε γενικά!
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα