hi,
ich versuche es dir zu erklären:
Code:
Declare Sub Master_transmit(byref Slave_adress As Byte , Byref Send_byte As Byte , Byref Speicherpointer As Byte) 'Declarierung der Sub =>mit byref wird immer nur ein Zeiger auf die Speicherstelle
Declare Sub Twi_show_state(byref State As Byte) ' Fehleranzeige für TWI übertragung ' verwiesen und nicht ein Wert übergeben
Const Mn1_adr = &H6A 'lokale I2C Adresse (als Slave), alle geraden Zahlen von &H02 - &HFE
'Const Mn2_adr = &H6A 'fremde I2C Adresse (als Master) wir in der Sub mit übergeben
Dim Twi_mst_buff(24) As Byte 'Buffer für Masterfunktionen
Dim Twi_slv_buff(24) As Byte 'Buffer für Slavefunktionen
Dim Tempo As Byte , Twi_daten As Byte
Twi_slv_addr = Mn1_adr 'lokale I2C-Adresse
Twi_sr_data = Varptr(twi_slv_buff(1)) 'datenbuffer empfang
Twi_st_data = Varptr(twi_slv_buff(1)) 'datenbuffer senden
Twar = Twi_slv_addr + 1 'I2C Adress Mega32 + GCA
Config Twi = 100000 'I2C Speed
On Twi Twi_mst_slv_isr , Nosave 'ISR f. TWI aktivieren
Gosub Twi_sense 'Aktivieren Slave-Funktion
'Enable Timer2 'Timer
'Generell Enable Interrupts
hier werden die "globalen" Funktionen festgelegt. Das ein TWI Teilnehmer eine Master/Slavefunktion erfüllen kann, muss er einmal eine Adresse als Master haben und eine als Slave.
Dim Twi_mst_buff(24) As Byte => ist ein Array wo dann die Daten reingeschrieben werden.
Twi_st_data = Varptr(twi_slv_buff(1)) & Twi_sr_data = Varptr(twi_slv_buff(1)) => Daten für Slave sende und empfangsdaten, hier wird nur die Adresse mit varptr übergeben.
On Twi Twi_mst_slv_isr , Nosave das ist eine Interruptroutine die benötigt wird für das senden und empfangen als slave oder master. nicht weiter zu beachten.
Hier ist der Abschnitt für das Senden als Master:
Code:
If Twi_slv_flag <> 0 Then 'ständige Abfrage ob als Slave Daten anliegen =>Vorsicht, der Bus ist solange blockiert
Select Case Twi_slv_flag
Case &H60 :
Print ; "Slave empfängt" ; 'es ist was empfangen worden
Print Hex(twi_slv_addr) ; " "; 'von Adresse in Hex
For Tempo = 1 To Twi_sr_cntr 'Daten aus Twi_sr_cntr in den puffer schreiben
Print Hex(twi_slv_buff(temp)); 'print der Daten
Twi_daten = Twi_slv_buff(temp)
Next
Nach dem etwas über TWI reinkommt (Twi_slv_flag = &H60 bedeutet das was empfangen wird ) und für die Adresse bestimmt ist, werden die Daten in den Twi_slv_buff(24) geschrieben. Dann stehen die Daten die empfangen werden hintereinander in dem Array und können ausgelesen werden.
=> diese Funktion ist wichtig wenn der Kontroller als Slave angesprochen wird!
Code:
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TWI
Run_wait_master:
Gosub Mst_start 'aufruf
Select Case Twi_mst_flag 'ergebnis ?
Case Twi_m_sent: 'gesendet
Print "<<<<<<MASTER sendet:"
Print Hex(twi_mst_addr ) ; " " ; Spc(30);
For Temp = 1 To Twi_mt_cntr
Print "twi_mst_buff(temp):" ; Hex(twi_mst_buff(temp)) ; Spc(30);
Next
Print
'Reset Twi_error
Twi_mst_flag = 0
Case Twi_m_recv: 'geholt
Print ">>>>>>MASTER read:" ;
Print Twi_mst_addr ; " ";
For Temp = 1 To Twi_mr_cntr
Print Twi_mst_buff(temp); 'Hex(twi_mst_buff(temp));
Next
Print
'Reset Twi_error
Twi_mst_flag = 0
Case Else: 'irgendein Problem
'Set Twi_error
'Print "Twi_error" ; Twi_error
Print "fehler" ; Chr(7) ; Hex(twi_mst_addr) ; " ";
Call Twi_show_state(twi_mst_flag)
End Select
Return
'+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ TWI Sendesub
Sub Master_transmit(byref Slave_adress As Byte , Byref Send_byte As Byte , Byref Speicherpointer As Byte) 'Sub in der die Adresse des Empfängers steht und der Zeiger aus der Callprozedur
Twi_mst_addr = Slave_adress 'I2C adresse
Twi_mt_cntr = Send_byte '8 ' erstmal 8 Byte senden
Twi_mt_data = Varptr(speicherpointer(1)) ' adresse Daten
Twi_mr_cntr = 0
'Twi_mr_cntr = 1 ' dann 3 Byte empfangen
'Twi_mr_data = Varptr(twi_mst_buff(1)) ' empfangsbuffer
Gosub Run_wait_master ' auf gehts
End Sub
Return
Hier ist der Abschnitt für das Senden als Master:
Sub Master_transmit(byref Slave_adress As Byte , Byref Send_byte As Byte , Byref Speicherpointer As Byte)
In der Sub werden folgende Daten festgelegt:
*Twi_mst_addr = &H61 => ist die TWI-Adresse des Slavs an die Daten gehen sollen
*Twi_mt_cntr = => wieviel Byte sollen gesendet werden
*Twi_mt_data = Varptr(speicherpointer(1)) => die zu übertragenden Daten, aber nur die Adresse der Daten wo sie im Ram liegen, nicht die Daten an sich.
*Gosub Run_wait_master und jetzt wird mit den Infos in die Senderoutine gesprungen => siehe im Code.
Du kannst nicht direkt die Informationen zwischen zwei Platinen über eine dritte auslesen. Du musst diese an den Bus hängen und diese abhorchen:
1. den Startpunkt einer Sendung von Daten detektieren
2. die Adresse in dem Sendeframe herausfiltern und
3. die Daten auswerten
Dabei musst du alle Start/Stop/daten... zeitrichtig auswerten, nicht so einfach!
Als Erklärung auch noch hier einiges:
https://www.roboternetz.de/phpBB2/vi...=409315#409315
https://www.roboternetz.de/phpBB2/ze...096&highlight=
Wenn Du dann die Übertragung verstanden hast, solltest Du dir ein protokoll oder Ähnliches ausdenken, um die Daten ordentlich zu senden/empfangen und diese dann weiter zu verarbeiten. Schau mal nach SNAP-Protokoll.
Gruß MAT
Lesezeichen