Aus dem Datenblatt:
1 | Modes 2 and 3 have a special provision for multiprocessor communications as shown in 304HFigure 13-8. In these two modes, 9 data bits are received. The 9th bit goes into RB80. Then comes a stop bit. The port can be programmed such that when the stop bit is received, the serial port interrupt will be activated only if RB80=1. This feature is enabled by setting bit SM20 (in SCON0 register). A way to use this feature in multiprocessor systems is
|
2 | as follows:
|
3 | When the master processor wants to transmit a block of data to one of several slaves, it first sends out an address byte which identifies the target slave. An address byte differs from a data byte in that the 9th bit is 1 in an address byte and 0 in a data byte. With SM20=1, no slave will be interrupted by a data byte. An address byte, however, will interrupt all slaves, so that each slave can examine the received byte and check if it is being addressed. The addressed slave will clear its SM20 bit and prepare to receive the data bytes that will be coming.
|
4 | The slaves that weren‘t being addressed leave their SM20 set and go on about their business, ignoring the coming data bytes.
|
In anderen Worten: Alle Pakete ohne gesetztes Adressbit werden von allen
Slaves ignoriert. Dann kommt ein Paket mit gesetztem Bit. Alle Slaves
gehen in den Interrupt. Im Interrupt musst du prüfen, ob die Adresse auf
dem Device übereinstimmt. Bei allen, wo die Adresse nicht stimmt, wird
nichts gemacht. Bei dem, wo die Adresse stimmt, muss die UART vom
Programm so umkonfiguriert werden, dass es die nun folgenden Pakete auch
annimmt. (Quasi wieder auf 8-Bit UART zurück setzen. "clear its SM20
bit") Wenn der Slave alle Daten empfangen hat, muss er wieder zurück auf
"Warte auf Adresse", bzw. SM20 Bit setzen.
Edit: Hat sich mit dem Update überschnitten. Damit hinfällig.