Gingl Zoltán, 2015, Szeged Mikrovezérlők Alkalmazástechnikája 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 1
Processzoroknál tipikusan párhuzamos átvitel adatbusz címbusz vezérlőjelek, szinkronizálás Mikrovezérlőknél soros átvitel Kevés vezeték illetve jel Modulációt igényel az információt alakítsuk egyetlen skalár jellé, bitfolyammá Demoduláció szükséges Hordozó: feszültség, áram, fény, elekromágneses hullám, hang Forma: amplitúdó, frekvencia, fáziskülönbség 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 2
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 3
Nem minden C8051Fxxx processzoron van Külső statikus memória elérése (XRAM) movx utasítás xdata int x; Más perifáriák elérésére is jó (ADC, DCA, stb.) Címvonalak (16) Adatvonalak (8) Vezérlő jelek (RD, WR, ALE) 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 4
C8051Fxxx A[15..0] A[15..0] SRAM D[7..0] D[7..0] /RD /WR /CE /OE /WR 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 5
A[15..8] A[7..0] D[7..0] P1/P5 DPH, EMI0CN, P1/P5 P1/P5 P2/P6 DPL, R0, R1 P2/P6 P3/P7 DATA P3/P7 /WR P0.7/P4.7 P0.7/P4.7 /RD P0.6/P4.6 P0.6/P4.6 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 6
A[15..8] A[7..0] D[7..0] P1/P5 DPH, EMI0CN, P1/P5 P1/P5 P2/P6 DPL, R0, R1 P2/P6 P3/P7 DATA P3/P7 /WR P0.7/P4.7 P0.7/P4.7 /RD P0.6/P4.6 P0.6/P4.6 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 7
C8051Fxxx A[15..8] A[15..8] SRAM ALE AD[7..0] 74AHC573 C D Q A[7..0] /RD /WR D[7..0] /CE /OE /WR 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 8
A[15..8] P1/P5 DPH, EMI0CN, P1/P5 P1/P5 AD[7..0] P2/P6 DPL, R0, R1 DATA P2/P6 ALE P0.5/P4.5 P0.5/P4.5 /WR P0.7/P4.7 P0.7/P4.7 /RD P0.6/P4.6 P0.6/P4.6 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 9
A[15..8] P1/P5 DPH, EMI0CN, P1/P5 P1/P5 AD[7..0] P2/P6 DPL, R0, R1 DATA P2/P6 ALE P0.5/P4.5 P0.5/P4.5 /WR P0.7/P4.7 P0.7/P4.7 /RD P0.6/P4.6 P0.6/P4.6 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 10
DATA ADDR /WR /RD /CE /OE /CE DATA C8051F ADDRESS DECODER /CE /RD DATA ADC ADDRESS /RD /WR DATA /CE /OE DATA DAC SRAM FIFO RAM 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 11
Az írás/olvasás időzítése állítható A perifériák sebességéhez kell igazítani Push-pull kimeneteket célszerű választani Olvasáskor automatikusan bemeneti mód 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 12
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 13
Processzorok és eszközök közti kommunikációhoz Egy byte átvitele bitenként Egyetlen kétállapotú jel Nincs szinkronizáló jel Az átvitel bármikor történhet Az átvitel kezdetét detektálni kell a vevőnek A kommunikáló eszközök azonos időalappal küldik és fogadják a biteket (baud rate=bit/s) Gyakran használt Sokféle hardveres megoldás (RS232, RS485, stb.) 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 14
t t t t t t t t t t START BIT B0 B1 B2 B3 B4 B5 B6 B7 STOP BIT bit sampling Start bit (logikai 0), átvitel detektálására Stop bit (logikai 1), minimum szünet küldések között Byte átviteli idő: 10 t 9 bites átvitel is választható: az utolsó bit külön programozható (TB8, olvasáskor RB8) paritásbitként, multiprocesszoros adatátvitelhez 11 t byte átviteli idő 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 15
FULL DUPLEX SIMPLEX C Device C Device TX TX TX TX RX RX RX RX HALF DUPLEX SIMPLEX C Device C Device TX TX TX TX RX RX RX RX TX KIKAPCSOLHATÓ 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 16
Timer túlcsordulások vezérlik, kétféle megoldás: Baud rate = Timer overflow rate / 16 (pl. F120) Baud rate = Timer overflow rate / 2 (pl. F410) Egy (Timer1) vagy több (Timer1-4) timer Néhány processzoron akár más TX és RX ráta Maximális ráta SYSCLK/16 vagy SYSCLK/2 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 17
Baud rate = Timer overflow rate / 16 (pl. F120) Timer 1 : TH1=256-SYSCLK/(16*Baud rate) Timer 2-4 : TMRRL=65536-SYSCLK/(16*Baud rate) Baud rate = Timer overflow rate / 2 (pl. F410) Timer 1 : TH1=256-SYSCLK/(2*Baud rate) Érdemes figyelni a kerekítési hibára! A C-ben az egész osztás nem a legközelebbire kerekít! Mindig ellenőrizzük a beállított érték okozta hibát! 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 18
Az időalapok különbözők lehetnek Az egységek órajele nem egzakt A beállítás frekvencia egésszel osztásával nem pontosan a kívánt érték A kettő eltérése mennyi lehet? maximum 3%, szigorúbban 2% teljesül? http://pdfserv.maximintegrated.com/en/an/an2141.pdf 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 19
t START BIT B0 B1 B2 B3 B4 B5 B6 B7 STOP BIT 1,03 t Az adó és vevő hibája együttesen hat hogyan? A detektálás ideálisan a bitek közepén lenne A start bit detektálása sem pontos A megbízhatóság függ a jelváltások időtartamától Függ a 2-szeres vagy 16-szoros leosztási értéktől 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 20
t t BIT BIT t/8 0,75 t 0,25 t 0,75 t BIT BIT t/4 0,5 t 0,5 t 0,5 t BIT BIT 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 21
Tegyük fel elég rövid jelváltási idők, 3% tolerancia megengedett 9600 bit/s kívánt érték F410 beállítás SYSCLK = 191406Hz 2% Timer1 8-bit auto reload mode: TH1 = 246 Baud rate = 191406Hz 2% /10/2=9570Hz 2% void Timer1_Init() { TMOD = 0x20; // 8-bit auto reload CKCON = 0x08; // timer clock = system clock TH1 = 0xF6; // reload value = 246 TL1 = 0xFF; // one step from overflow TCON = 0x40; // run timer } 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 22
Baud rate = 191406Hz/10/2 = 9570Hz 9570Hz 2% Megfelel? 9600 3% 9312-9888 9570 2% 9378-9761 A másik eszköz hibáját nem vettük figyelembe! 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 23
A szinkron módokkal nem tárgyaljuk 8 vagy 9 bites aszinkron mód Az adat fogadása engedélyezhető, tiltható A stop bit detektálása engedélyezhető csak akkor van vett adat, ha a stop bit értéke 1 9-bites módban a 9. bitet vizsgálja! Ez alkalmas címzésre, multiprocesszoros kommunikációra Ha a 9. bit 1, akkor cím érdekezik a vevőkhöz A címzett vevő kikapcsolja a bit monitorozását a vétel idejére 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 24
void UART_Init() { SCON0 = 0x10; // 8-bit, variable baud mode TI=1; // assume empty output buffer } unsigned char UARTIn(void) { while (!RI); // wait for a byte RI=0; return SBUF; // return the byte } void UARTOut(char a) { while (!TI); // wait for end of previous transmission TI=0; SBUF=a; // transmit a byte, don t wait for end } 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 25
#define BUFFERSIZE 8 // ring buffers volatile unsigned char TxBuffer[BUFFERSIZE]; volatile unsigned char RxBuffer[BUFFERSIZE]; // TX buffer read and RX buffer write pointers // used in the interrupt routine volatile unsigned char TxReadPtr=0, RxWritePtr=0; // TX buffer write and RX buffer read pointers unsigned char TxWritePtr=0, RxReadPtr=0; // Number of data in the buffers volatile unsigned char TxNumberOfData=0; volatile unsigned char RxNumberOfData=0; 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 26
void UARTInterrupt(void) interrupt UART_VECTOR { if (RI) { RI=0; if (RxNumberOfData < BUFFERSIZE) { RxBuffer[RxWritePtr]=SBUF; RxWritePtr = (RxWritePtr+1) % BUFFERSIZE; RxNumberOfData++; } } 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 27
} if (TI) { TI=0; if (TxNumberOfData) { SBUF=TxBuffer[TxReadPtr]; TxReadPtr = (TxReadPtr+1) % BUFFERSIZE; TxNumberOfData--; } } 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 28
unsigned char UARTIn(unsigned char *c) { if (RxNumberOfData) { RxNumberOfData--; *c=rxbuffer[rxreadptr]; RxReadPtr = (RxReadPtr+1) % BUFFERSIZE; return 0; } return 1; } 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 29
unsigned char UARTOut(unsigned char c) { if (TxNumberOfData < BUFFERSIZE) { TxNumberOfData++; TxBuffer[TxWritePtr]=c; TxWritePtr = (TxWritePtr+1) % BUFFERSIZE; return 0; } return 1; } 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 30
Meghajtó áramkörök nélkül Meghajtóáramkörökkel nagyobb távolságok PLC-k Műszerek oszcilloszkóp DVM Flow controller Speciális eszközök 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 31
Vdd VOLTAGE CONVERTER V+ V- TX RX R OUT T IN R IN T OUT RS232 SIGNALS C RS232 TRANSCEIVER MAX202, MAX3232 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 32
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 33
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 34
Vdd DIFFERENTIAL RS422 SIGNALS TX R OUT R IN+ R IN- C RX T IN T OUT+ T OUT- RS422 TRANSCEIVER 2 x MAX485 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 35
Vdd RTS TX TXEN R OUT D+ D- DIFFERENTIAL RS485 SIGNALS RX T IN C RS485 TRANSCEIVER MAX485, MAX3485 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 36
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 37
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 38
Vdd TX OPTICAL FIBER RX C 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 39
USB CONNECTOR USB CONNECTOR LDO REG LDO REG 5V RTS RTS CTS TX CTS TX USB-UART TRANSCEIVER D+ D- RX RX C FT232R GND USB CABLE 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 40
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 41
Bluetooth modulok UART interfésszel SPP (Serial Port Profile) standard protokoll pl. BTM112 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 42
Timer beállítás, engedélyezés A timer másra nem használható Ne keverjük: polling és interrupt mód TX legyen push-pull rövid jelváltási idők Baud rate hibájának figyelembe vétele 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 43
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 44
Processzorok, integrált áramkörök között Szinkron soros adatátvitel Órajel váltásaikor érvényes a bit Master és slave eszközök Az órajelet adó a master Az órajel garantálja az azonos időzítést a két oldalon Full duplex kimenet: MOSI (master out/slave in) bemenet: MISO (master in/slave out) órajel: SCK (serial clock) Engedélyező vonal (NSS, negated slave select) 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 45
SCK POL=1 POL=0 MOSI MISO B7 B6 B5 B4 B3 B2 B1 B0 B7 B6 B5 B4 B3 B2 B1 B0 PHA=0 MOSI MISO B7 B6 B5 B4 B3 B2 B1 B0 B7 B6 B5 B4 B3 B2 B1 B0 PHA=1 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 46
Az adó és vevő oldal azonos módban legyen (POL, PHA) Az egyik SCK él a kimenő bitet beállítja, a másik a bejövő bitet olvassa Slave: Mikor kezdődik az adat átvitele? Csak az órajel indulása nem feltétlen elég Kieshet a szinkronból az átvitel Megoldás: Slave select (NSS) jel 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 47
SCK POL=1 POL=0 NSS MOSI MISO B7 B6 B5 B4 B3 B2 B1 B0 B7 B6 B5 B4 B3 B2 B1 B0 PHA=0 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 48
GPIO NSS MISO MISO MISO MISO MOSI MOSI MOSI MOSI SCK SCK SCK SCK NSS GPIO Master Master Master Slave 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 49
MISO MOSI SCK NSS GPIO Master MISO MOSI SCK NSS Slave MISO MOSI SCK NSS Slave Több slave Egyszerre egy aktív Slave NSS választ NSS adatkezdet is 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 50
void SPIOut(unsigned char c) { SELECT = 0; SPIF = 0; SPI0DAT = c; while (!SPIF); SELECT = 1; } unsigned char SPIIn(void) { SELECT = 0; SPIF = 0; SPI0DAT = 0; // dummy write starts SPI clock while (!SPIF); SELECT = 1; return SPI0DAT; } 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 51
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 52
System Management Bus IIC vagy I²C: Inter-Integrated Circuit Áramkörök közötti egyszerű, kétvezetékes busz SCL: Órajel (100kHz vagy 400kHz) SDA: Adat Két irány (half duplex) Master, slave, multimaster Párhuzamosan kapcsolhatók eszközök 7-bites címzés Tipikusan: szenzorok, A/D, RTC, EEPROM, stb. 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 53
CROSSBAR CLOCK CONTROL FILTER SCL SHIFT REGISTER 7 6 5 4 3 2 1 0 FILTER SDA SDA CONTROL ACK 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 54
R R Vdd=5V Vdd=5V Vdd=3V Vdd=5V Vdd=3V Master 1 Master 2 Slave 1 Slave 2 SCL SDA 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 55
START ACK NACK STOP SDA SCL A6 A0 R/W D7 D0 7-bit address and direction bit 8-bit data Bármelyik vezetéket az adó és vevő is 0-ba tudja húzni SCK: csak a masterek húzhatják 0-ba Több byte is küldhető egy tranzakcióban ACK minden byte vételekor szükséges a vevőtől NACK: nem nyugtáz a vevő, vagy utolsó byte (master) STOP: a tranzakció befejezése 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 56
MASTER IRQ IRQ IRQ IRQ S ADDR W A DATA A DATA A P S ADDR W A DATA A DATA A P SLAVE IRQ IRQ IRQ 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 57
MASTER IRQ IRQ IRQ IRQ S ADDR R A DATA A DATA N P S ADDR R A DATA A DATA N P SLAVE IRQ IRQ IRQ 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 58
Master SFR-bitek STA, STO írása a jelek generáláshoz ACK írása és olvasása is SI flag (megszakítás is) 1-re vált, ha egy fázis kész A busz áll, amíg SI=1, folytatódik, ha töröljük Ezért mindig SI=0 előtt kell írni az SFR regisztereket Slave SFR-bitek STA, STO olvasása ACK írása és olvasása is 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 59
void SMBusOut(unsigned char address, unsigned char c) { STO = 0; STA = 1; // start transfer SI = 0; // continue while (!SI); // wait for start complete STA = 0; // manually clear STA SMB0DAT = address << 1; // A6..A0 + write SI = 0; // continue while (!SI); // wait for complete if (!ACK) // not acknowledged, stop { STO = 1; // stop condition bit } SI = 0; return; } SMB0DAT = c; SI = 0; while (!SI); STO = 1; SI = 0; // generate stop condition // put data into shift register // continue // wait for complete // stop condition bit // generate stop condition 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 60
unsigned char SMBusIn(unsigned char address) { STO = 0; STA = 1; // start transfer while (!SI); // wait for start complete STA = 0; // manually clear STA SMB0DAT = (address << 1) 1; // A6..A0 + read SI = 0; // continue while (!SI); // wait for complete if (!ACK) // not acknowledged, stop { STO = 1; // stop condition bit } SI = 0; return; } ACK = 0; SI = 0; while (!SI); STO = 1; SI = 0; return SMB0DAT; // generate stop condition // NACK, last byte // continue // wait for complete // stop condition bit // generate stop condition 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 61
stdio átirányítás? printf? void putchar(char c) { UARTOut(c); // UART, SPI, SMBus, stb. } char getchar(void) { return UARTIn(c); // UART, SPI, SMBus, stb. } printf("x=%d",x); // write 2015.12.06. 11:45 Digitális perifériák és használatuk 62
2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 63
CAN: Controller Area Network LIN: Local Interconnect Network USB: Universal Serial Bus Vezeték nélküli kommunikációs áramkör 2015.12.06. 11:45 Kommunikációs áramkörök és használatuk 64