
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
Hallo Ich habe mir jetzt ein Test Programm gebastelt was Teilweise funktioniert. Bei dem EEprom 24C256 habe ich vollen schreib und lese - Zugriff. Bei der Chipkarte (2K ohne Pin) habe ich nur lese - Zugriff. Es gelingt mir einfach nicht die Daten in den EEprom der Chipkarte zu übertragen. !!! WARUM NICHT !!! Ich habe die I2C Routine total zerlegt und lasse mir fast jeden einelnen Schritt über den PC (Terminal) ausgeben. Aber selbst dabei kann ich einfach keinen Fehler finden. Sogar der "Ack" antwortet korreckt und das Programm hängt sich nicht auf. Kann mir bitte jemand sagen warum die gesendeten Daten nicht vom EEprom der Chipkarte gespeichert werden... Das Test Programm sucht nach einschalten der Micro den I2C-Bus nach einem angeschlossensn I2C-Baustein ab. Findet er einen, so stelle er diese Adresse für das nachfolgende Programm ein. Wird kein I2C-Baustein gefunden fängt das Programm von forne an. Nun begint das Programm eine 10 in die Position 1000 (Wordregister des EEproms) zu schreiben. Anschließend wird die Position 1000 wieder zurückgelesen. Danach wird eine 11 geschrieben und zurückgelesen. usw... Bei dem EEprom 24C256 funktioniert es ohne Probleme. Auch in anderen Positionen des Word-Registers funktioniert das schreiben und lesen ohne Probleme. Bei der Chipkarte schreibt er in Position 1000 eine 10 und liest eine 232 aus. In Position 1300 schreibt er eine 10 und liest eine 20 aus. usw... !!! WARUM !!! '*************************************************************************** '* * '* C-Control Micro - Test Programm * '* * '* - automatische Suche der I2c-Bus Adresse * '* * '* - schreib / lese - Zugriff auf einen EEprom 24C256 (32K) * '* * '* - Text Ausgabe am PC (Terminal - Programm) * '* * '*************************************************************************** ' '--- Definitionen der Ports ------------------------------------------------ 'define Reset port[4] ' Reset Chipkarte define SDA port[6] ' Datenleitung I2C-Bus (10K gegen +5V) define SCL port[5] ' Tacktleitung I2C-Bus (10K gegen +5V) '--- Variablen ------------------------------------------------------------- define I2C_tmp byte[1] 'Daten Byte im I2C-Bus Intern define B1 bit[1] 'Daten Bit1 im I2C-Bus Intern define B2 bit[2] 'Daten Bit2 im I2C-Bus Intern define B3 bit[3] 'Daten Bit3 im I2C-Bus Intern define B4 bit[4] 'Daten Bit4 im I2C-Bus Intern define B5 bit[5] 'Daten Bit5 im I2C-Bus Intern define B6 bit[6] 'Daten Bit6 im I2C-Bus Intern define B7 bit[7] 'Daten Bit7 im I2C-Bus Intern define B8 bit[8] 'Daten Bit8 im I2C-Bus Intern define Adresse byte[2] 'EEprom Adresse define Daten byte[3] 'Daten im EEprom Speicher define Highbyte byte[4] 'Highbyte Word Register im EEprom define Lowbyte byte[5] 'Lowbyte Word Register im EEprom define N byte[6] 'Test Variable '--- Initialisierung Hardware ---------------------------------------------- gosub I2C_Stop 'Reset I2C-Bus Baud 9600 'RS232 Einstellen 'Reset = on : pause 25 : Reset = Off 'Reset Chipkarte '--- Übergabe der Daten für den I2C-Bus ------------------------------------ 'Highbyte = 117 'Highbyte Position 30100 'Lowbyte = 148 'Lowbyte Position 30100 Highbyte = 3 'Highbyte Position 1000 Lowbyte = 232 'Lowbyte Position 1000 ' --- Test Programm Adresse automatisch finden ----------------------------- #suche for Adresse = 0 to 254 step 2 'I2C-Bus Adresse zuweisen N = 1 'Reset Ack Auswertung I2C_tmp = Adresse 'EEprom Adresse - schreiben gosub I2C_Start 'Start und Daten übertragen gosub Ack_suche 'Auswertung Ack gosub I2C_Stop 'I2C-Bus Stop if N = 0 then goto suche_end 'wenn I2C-Baustein gefunden, dann suche beenden next Print "nichts gefunden" 'Suche erfolglos pause 250 'Test Pause 5 Sekunden goto suche 'wenn nichts gefunden, dann von forne anfangen #suche_end Print "Adr.gefunden = ";Adresse 'Test Ausgebe pause 250 'Test Pause 5 Sekunden ' --- Test Programm Daten schreiben / lesen -------------------------------- #Loop Print 'Test Ausgabe for N = 10 to 25 'Daten für den EEprom Speicher Daten = N 'Daten zuweisen gosub I2C_schreiben 'Daten in den EEprom übertragen pause 200 'Test Pause 4 Sekunden Print 'Test Ausgabe gosub I2C_lesen 'Daten aus dem EEprom einlesen Print "Daten lesen = ";Daten 'Test Ausgabe pause 200 'Test Pause 4 Sekunden Print 'Test Ausgabe Print 'Test Ausgabe Print 'Test Ausgabe next goto loop 'Endlosschleife end '------------------------------------------ ' I2C-Bus Routine '------------------------------------------ #I2C_schreiben I2C_tmp = Adresse 'EEprom Adresse zuweisen Print "Adresse = ";I2C_tmp;" = "; 'Test Ausgabe gosub I2C_Start 'Start und Daten übertragen gosub Ack 'warten auf Bestätigung vom Slave '------------------------------------------ I2C_tmp = Highbyte 'Highbyte (Word Register) zuweisen Print "Highbyte = ";I2C_tmp;" = "; 'Test Ausgabe gosub I2C_write 'Daten übertragen gosub Ack 'warten auf Bestätigung vom Slave '------------------------------------------ I2C_tmp = Lowbyte 'Lowbyte (Word Register) zuweisen Print "Lowbyte = ";I2C_tmp;" = "; 'Test Ausgabe gosub I2C_write 'Daten übertragen gosub Ack 'warten auf Bestätigung vom Slave '------------------------------------------ I2C_tmp = Daten 'Daten zuweisen Print "schreibe = ";I2C_tmp;" = "; 'Test Ausgabe gosub I2C_write 'Daten übertragen gosub Ack 'warten auf Bestätigung vom Slave '------------------------------------------ gosub I2C_Stop 'Stop return '------------------------------------------ #I2C_lesen I2C_tmp = Adresse 'EEprom Adresse zuweisen Print "Adresse = ";I2C_tmp;" = "; 'Test Ausgabe gosub I2C_Start 'Start und Daten übertragen gosub Ack 'warten auf Bestätigung vom Slave '------------------------------------------ I2C_tmp = Highbyte 'Highbyte (Word Register) zuweisen Print "Highbyte = ";I2C_tmp;" = "; 'Test Ausgabe gosub I2C_write 'Daten übertragen gosub Ack 'warten auf Bestätigung vom Slave '------------------------------------------ I2C_tmp = Lowbyte 'Lowbyte (Word Register) zuweisen Print "Lowbyte = ";I2C_tmp;" = "; 'Test Ausgabe gosub I2C_write 'Daten übertragen gosub Ack 'warten auf Bestätigung vom Slave '------------------------------------------ I2C_tmp = Adresse + 1 'EEprom Adresse (lesen) zuweisen Print "Adresse = ";I2C_tmp;" = "; 'Test Ausgabe gosub I2C_Start 'Re - Start und Daten übertragen gosub Ack 'warten auf Bestätigung vom Slave '------------------------------------------ gosub I2C_read 'Daten einlesen Daten = I2C_tmp 'Datenübergabe gosub No_Ack 'lese - Ende einleiten '------------------------------------------ gosub I2C_Stop 'Stop return '------------------------------------------ #I2C_Stop SDA = off : SCL = on : SDA = on 'Stop Bedingung return '------------------------------------------ #I2C_Start SDA = on : SCL = on 'Start Bedingung Re - Start SDA = off : SCL = off 'Start Bedingung #I2C_write if B8 = on then SDA = on else SDA = off 'Bit8 an den I2C-Bus legen if B8 = on then Print "1"; else Print "0"; 'Test Ausgabe gosub I2C_Pulse 'Pulse - Bit8 senden if B7 = on then SDA = on else SDA = off 'Bit7 an den I2C-Bus legen if B7 = on then Print "1"; else Print "0"; 'Test Ausgabe gosub I2C_Pulse 'Pulse - Bit7 senden if B6 = on then SDA = on else SDA = off 'Bit6 an den I2C-Bus legen if B6 = on then Print "1"; else Print "0"; 'Test Ausgabe gosub I2C_Pulse 'Pulse - Bit6 senden if B5 = on then SDA = on else SDA = off 'Bit5 an den I2C-Bus legen if B5 = on then Print "1"; else Print "0"; 'Test Ausgabe gosub I2C_Pulse 'Pulse - Bit5 senden if B4 = on then SDA = on else SDA = off 'Bit4 an den I2C-Bus legen if B4 = on then Print "1"; else Print "0"; 'Test Ausgabe gosub I2C_Pulse 'Pulse - Bit4 senden if B3 = on then SDA = on else SDA = off 'Bit3 an den I2C-Bus legen if B3 = on then Print "1"; else Print "0"; 'Test Ausgabe gosub I2C_Pulse 'Pulse - Bit3 senden if B2 = on then SDA = on else SDA = off 'Bit2 an den I2C-Bus legen if B2 = on then Print "1"; else Print "0"; 'Test Ausgabe gosub I2C_Pulse 'Pulse - Bit2 senden if B1 = on then SDA = on else SDA = off 'Bit1 an den I2C-Bus legen if B1 = on then Print "1" else Print "0" 'Test Ausgabe gosub I2C_Pulse 'Pulse - Bit1 senden return '------------------------------------------ #I2C_read I2C_tmp = 0 'Reset Daten deact SDA 'Datenleitung = Eingang SCL = on 'Start Einlesen if SDA then B8 = on 'Bit8 zuweisen gosub I2C_Pulse_int 'Pulse ohne SDA if SDA then B7 = on 'Bit7 zuweisen gosub I2C_Pulse_int 'Pulse ohne SDA if SDA then B6 = on 'Bit6 zuweisen gosub I2C_Pulse_int 'Pulse ohne SDA if SDA then B5 = on 'Bit5 zuweisen gosub I2C_Pulse_int 'Pulse ohne SDA if SDA then B4 = on 'Bit4 zuweisen gosub I2C_Pulse_int 'Pulse ohne SDA if SDA then B3 = on 'Bit3 zuweisen gosub I2C_Pulse_int 'Pulse ohne SDA if SDA then B2 = on 'Bit2 zuweisen gosub I2C_Pulse_int 'Pulse ohne SDA if SDA then B1 = on 'Bit1 zuweisen SCL = off 'Stop Einlesen return '------------------------------------------ #I2C_Pulse_int SCL = off : SCL = on 'Pulse für Read return '------------------------------------------ #Ack 'I2C-Bus Auswertung deact SDA 'Datenleitung = Eingang wait not SDA 'warten auf Antwort vom Slave SCL = on : SCL = off : SDA = on 'Pulse und SDA High return '------------------------------------------ #No_Ack 'I2C-Bus ohne Auswertung SDA = on : SCL = on : SCL = off 'SDA High und Pulse return '------------------------------------------ #I2C_Pulse SCL = on : SCL = off : SDA = off 'Pulse und SDA Low return '------------------------------------------ #Ack_suche 'wartet nicht auf Antwort vom Slave, nur Auswertung Slave deact SDA 'Datenleitung = Eingang if not SDA then N = 0 'Wenn Slave gefunden, dann Auswertung SCL = on : SCL = off 'Pulse return |
| Antwort schreiben |