2017-07-26 5 views
2

Ich habe einige Links besucht und nach einigen Beispielprogrammen für die I2C-Programmierung gesucht. Ich möchte meinen eigenen Code für das I2C-Protokoll schreiben. Angenommen, DS1307 RTC und LCD sind mit 8051 verbunden. Ich benutze die Keil-Software, um ein C-Programm zu schreiben. Es ist sehr schwierig für mich ganzes Programm von I2C zu schreiben, also habe ich versuchte Programm in kleinen Teilen zu brechen:Wie funktioniert das I2C-Protokoll?

  • Modul 1: definieren und Stifte für LCD und DS1307 RTC
  • Modul 2: Schreiben Sie C-Code für DS1307 (stellen Funktionen für DS1307 wie lesen, schreiben)
  • Modul 3: write C-Code für LCD (Daten-, Befehls- initialisieren, usw.)
  • Modul 4: Hauptfunktion

ich verstehe Modul 1, aber Ich suche Hilfe, um Modul zu verstehen e 2. Also nochmal ich will Modul 2 in kleinen Teilen zerlegen.

Wie wird das Modul 2 in kleinen Teilen zum leichteren Verständnis unterbrochen? Wie viele Funktionen sollten in Modul2 sein?

+2

Der 8051 selbst enthält keinen I2C-Controller. Es gibt viele Geräte, die einen 8051 zusammen mit anderen Chips auf dem Chip, z.B. ein I2C-Controller. Was ist dein Fall? Wenn Ihr Chip nicht über einen integrierten I2C-Controller verfügt, müssen Sie Bit-Bang mit den nativen 8051-Ports durchführen. Versuchen Sie, das Netz nach etwas wie "8051 bit bang I2C" zu suchen. Es gibt Ihnen mehrere Codebeispiele, z.B. https://www.8051projects.net/wiki/I2C_Implementation_on_8051 Wenn Ihr Chip einen I2C-Controller enthält, wird Ihnen das Datenblatt erklären, wie Sie es verwenden. – 4386427

Antwort

0

Das Modul 2 ist im Wesentlichen I2C-Treiber mit Bit Banging von 8051-Port. I2C-Protokoll folgt einer Sequenz. Es wird durch die Startsequenz gestartet und durch die Stoppsequenz gestoppt. Sie können verschiedene Funktionen haben. Die Kommunikation wird vom Master gestartet und jeder Slave hat eine Adresse. In module2 schreiben Sie alle folgenden Funktionen.

Zum Beispiel kann die I2-Lesesequenz wird

werden folgende
I2C_Start(); // set I2C start sequence 
I2C_Send(slave_address|1); Send I2C slave address in read mode 
I2C_read_ACK(); //master will know slave got data 
while(number_of bytes){ 
I2C_Read(); 
I2C_send_ACK(); 
number_of bytes--; 
} 
I2C_NAK(); //slave need to know so it will not prepare next data. 
I2C_Stop(); //stop communication 

Auch die Schreib auf Slave unten haben Schritte

I2C_Start(); // set I2C start sequence 
I2C_Send(slave_address); Send I2C slave address in write mode 
I2C_read_ACK(); //master will know slave got data 
while(number_of bytes){ 
I2C_Write(); 
I2C_read_ACK(); //master will know slave got data 
number_of bytes--; 
} 
I2C_Stop(); //stop communication 

Ich sehe Fahrer auch bei https://circuitdigest.com/microcontroller-projects/digital-clock-using-8051-microcontroller

Offizielle I2C Protokoll ist hier

https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwici4Ocn6jVAhUIwlQKHV_zAJ8QFggoMAA&url=https%3A%2F%2Fwww.nxp.com%2Fdocuments%2Fuser_manual%2FUM10204.pdf&usg=AFQjCNHgNi6wOD4MjIDsnT0DXTYLS_-gPQ