netx User Peripherials 2008 Jiri Spale, Programmierung eingebetteter Systeme 1
Pin Sharing netx: mehr Funktionen als Pins Sharing (gemeinsame Benutzung) 2 Sharing-Modi: Asynchronous Pin Sharing netx500 und netx100 nur diese Art Zwischen jedem Multifunktionspin und seinen internen Signalen befindet sich ein MUX, gesteuert durch NET_IO_CFG Register Die Eintragung neuer Werte in den NET_IO_CFG Register ist gesichert, da Fehleinträge HW-Schäden verursachen können (netx, Peripherien): Vor jedem Update muss zuerst ein Access Key gelesen und zurück geschrieben w. Synchronous Pin Sharing via MUX-Matrix (MMIO) mehr flexibel als asynchron geht nur, wenn die geshareten Signale in gleichen Clock Domains liegen netx50 beide Arten, mehr synchrone Art Jeder der 40 IO-Pins bei netx50 hat sein Configuration Register, mittels dessen kann jede der 148 interner Funktionen an den Pin geroutet werden Sicherung wie bei asynchronem Modus 2008 Jiri Spale, Programmierung eingebetteter Systeme 2
Digitale paralelle Ein- und Ausgänge 2 Arten 1. GPIO General Purpose IOs Komplexe Parametrisierung Zusammenarbeit mit Timern 2. PIO Peripherial IOs Einfache bidirektionale IO-Pins, Schreib- und Lese-Funktion 2008 Jiri Spale, Programmierung eingebetteter Systeme 3
GPIOs - Übersicht Eckdaten netx500: 16 Stück arbeiten mit zusammen - mit 5 internen General Purpose Timern - mit dem IEEE1588 systimer I/O-Signale Reaktion auf Timer-Erreignisse Funktionen einstellbar: Input/Output, invertiert/nichtinvertiert Outputs individuell oder en Bloc per Register einstellbar Jeder GPIO kann einem Timer oder der System Time zugeordnet werden einstellbar als Capture-Input oder PWM-Output Jeder GPIO kann INT auslösen 2008 Jiri Spale, Programmierung eingebetteter Systeme 4
PIOs - Übersicht Eckdaten netx500: 84 Stück, jeder angeschlossen zum Paar von programmierbaren IO controllers Jeder PIO-Controller Spezialisierung eines Teils des Dual-Port-Memory Host Interfaces Funktionen einstellbar: simple I/O oder zur Realisierung vom Feldbus-Slaves PIO 0-30: shared mit Motor Controls Pins, LCD Controller und ETM (Embedded Trace Macrocell, ein Debug-Instrument) PIO 32-84: shared mit Host Interface Pins Host Interface Pins können konfiguriert werden: 1. Address Data Bus für den Host Interface Extension Bus 2. Dual Port Memory Interface 3. Pins, die nicht für 1. benutzt sind, als bidirektionale IO-Pins PIO 31 existiert nicht 2008 Jiri Spale, Programmierung eingebetteter Systeme 5
Register (für jeden GPIO-Pin) GPIO - Register GPIO_CFGx Configuration Register GPIO_THRSH_CAPTx Data Register GPIO_CFGx COUNT_REF: Zuordnung zu einem Counter Mode: Kontrolle der Output-Pins separat oder en bloc INV: invertierend oder nicht IOCFG: Capture, PWM, simple IO 2008 Jiri Spale, Programmierung eingebetteter Systeme 6
GPIO-Pin als Input Zustand in NETX_GPIO_IN Register Capture-Funktion: Timer-Zustand eingelesen bei - steigende/fallende Flanke am GPIO-Pin - log.0/log.1-pegel am GPIO-Pin oder Interrupt ausgelöst bei - steigende/fallende Flanke am GPIO-Pin - log.0/log.1-pegel am GPIO-Pin 2008 Jiri Spale, Programmierung eingebetteter Systeme 7
GPIO-Pin als Output Modus separate Kontrole (MODE-Feld) Jeder Pin eigenes Register gut, wenn jeder Pin andere SW-Aufgabe erledigt Modus gemeinsame Kontrole (MODE-Feld) alle Pins gesteuert via GPIO_OUT Register oder Gruppen von Pins können zusätzlich durch separet Register gesteuert w. Pins können Timern zugeordnet werden und als PWM fungieren Bsp: pgpio->cfg[8] = 0x00000011; // Output, controlled by GPIO line register pgpio->cfg[9] = 0x00000011; pgpio->cfg[10] = 0x00000011; pgpio->cfg[11] = 0x00000011; pgpio->cfg[12] = 0x00000000; // Input, Standard read mode pgpio->cfg[13] = 0x00000000; pgpio->cfg[14] = 0x00000000; pgpio->cfg[15] = 0x00000000; while(1) pgpio->line_out = pgpio->line_in>>4; // copy inputs to outputs 2008 Jiri Spale, Programmierung eingebetteter Systeme 8
GPIO-Timers netx GP-Timers integriert in die GPIO-Unit System Timer integriert in Communication Controller Block (kalibriert für RT-Eth-Pakete) GP-Timer 32-Bit Symetrisch Asymetrisch Int bei 0 Int bei Max. 2008 Jiri Spale, Programmierung eingebetteter Systeme 9
GPIO-Timer-Register Counter Control Register CNT_Event Timer oder Counter, Pegel oder Flanken ONCE - One-Shot oder kontinuierlich SYM_NASYM - Symmetrisch oder asymmetrisch IRQ_EN - Mit oder ohne Ints 2008 Jiri Spale, Programmierung eingebetteter Systeme 10
GPIO: PWM-Modus #1 timervalue > treshold GPIO-Pin=log.1 timervalue <= treshold GPIO-Pin=log.0 INV aktiv INV inaktiv Es können mehrere PWM-Signale erzeugt werden, die sich zum gleichen Timer beziehen motion control 2008 Jiri Spale, Programmierung eingebetteter Systeme 11
GPIO: PWM-Modus #2 Bsp. pgpio->cfg[11] = 0x19 pgpio->counter_control[0] = 0x5C0 pgpio->tc[11] = 0x100000; pgpio->counter_max[0] = 0x1000000; // Max count pgpio->counter_control[0] = 0x01 // Start // Output, PWM mode, Counter0 // Symmetric, continuous reload, // connected to GPIO11 // Threshold value 2008 Jiri Spale, Programmierung eingebetteter Systeme 12
GPIO Capture Mode GPIO-Input Signal verwender zur Speicherung des aktuellen Timer-Wertes im Threshold Register Capture-Erreignis: aufsteigende Flanke oder High Level bei Benutzung von INV auch fallende Flanke oder Low Level Bsp. pgpio->cfg[12] = 0x08; // Input, non-inverted, capture, counter 0 pgpio->counter_control[0] = 0x642; // Asymmetric, continuous, GPIO12 pgpio->counter_max[0] = 100000; // Set the maximum count value pgpio->counter_control[0] = 0x01 // Start the timer Bei aufsteigender Flanke am GPIO12 wird der aktuelle Wert vom Timer in den Threshold-Register gespeichert netx500: 16 capture channels 2008 Jiri Spale, Programmierung eingebetteter Systeme 13
PIOs #1 PIO0-PIO30: shared mit Motion Control, LCD und ETM-Pins PIO32-PIO84: shared mit Host Interface Pins Gilt für alle PIOs: IO Configuration Register Wahl: peripherial function oder IO IO Configuration Mask Register Einstellung, welcher Pin im IO Config. Reg. geändert werden darf IO Configuration Access Key Register (CAK) Schutz von beiden obigen Regs vor irrtümlicher Änderung: Vor jedem Lesen/Schreiben der obigen 2 Regs: vom CAK: Key Value lesen und zurückschreiben Nach jeder Änderung von Conf. Reg.: Key Value ungültigt gemacht Diese Prozedur muss bei jeder HW-Änderung gemacht w. 2008 Jiri Spale, Programmierung eingebetteter Systeme 14
PIOs #2 Gilt für PIO0-PIO30: Output Enable Register Output Driver aktivieren Input Register Eingangs-Werte ablesen Output Register Werte für Ausgänge definieren 2008 Jiri Spale, Programmierung eingebetteter Systeme 15
PIOs #3 Gilt für PIO32-PIO84: DPM_ARM_IF_CFG0 Register Modus-Wahl: Extension Bus Dual-Port-Memory I/O-Mode disable nur Pins, die nicht für Address Data Bus benutzt sind, dürfen als IO konfiguriert. w. (mit DPM_ARM_IO_MODEx) DPM_ARM_IO_DRV_ENx Register Freigabe von Output-Treiber, falls benutzt als Outputs Mode 0 Mode 1 DPM_ARM_IO_DATAx Register Bei Eingängen: Status lesen Bei Ausgängen: Belegung definieren 2008 Jiri Spale, Programmierung eingebetteter Systeme 16
Gilt für PIO32-PIO84: PIOs #4 DPM_ARM_IO_MODE0 Register 32 Bits für PIO 32..63: Wahl 0: PIO Mode 1: Host Interface Mode Falls in DPM_ARM_IF_CFG0 I/O-Mode eingestellt, sind die Einstellungen in DPM_ARM_IO_MODEx wirkungslos! (Dual-Port-Mem oder Ext. Bus Interface, falls enabled) DPM_ARM_IO_MODE1 Register 21 Bits für PIO 64..84: Wahl 0: PIO Mode 1: Host Interface Mode IN_CONTROL (2-Bit-Info) 00 Reset condition : Eingangsdaten gelesen beim Systemstart 01 Eingangsdaten mit 100MHz Systemtakt abgetastet 10 Eingangsdaten nur abgetastet, wenn PIO77=log.0 11 Eingangsdaten nur abgetastet, wenn PIO77=log.1 2008 Jiri Spale, Programmierung eingebetteter Systeme 17
Asynchrone serielle Übertragung Bsp.: Zu senden: A 0x41 0100 0001 Übertragungsparameter: 115200 Baud 8 Datenbits 1 Stoppbit Gerade Parität (even Parity) Parität-Regeln: Anzahl Datenbits gerade (even): odd parity bit=1 (dann: ungerade Anzahl aller Bits (Data+Parität) Anzahl Datenbits ungerade (odd): even parity bit=1 CLK_TR 115,2 * 11 khz = 1,2672 MHz DATA idle 0 0 1 0 0 0 0 0 1 0 1 idle Startbit Datenbits Stoppbit gerade Parität CLK_RECV 1 Baud = 1 Symbol/s = 1 Byte/s = 1 Bps 2008 Jiri Spale, Programmierung eingebetteter Systeme 18
UART - Übersicht Merkmale: 3 16550-kompatible UARTs Jeder mit16 Bytes FIFO ausgestattet Max. Rate 3,125 MBaud HW flow control via CTS/RTS möglich UART Pins multiplexed mit GPIO Mögliche Konfigurationen 5, 6, 7, 8 Databits 1 oder 2 Stop-Bits gerade, ungerade oder keine Parität IrDA SIR Kodierung/Dekodierung (Anschluss Infrarot Transceiver vorgesehen Spezielle zusätzliche Eigenschaften von UART0 als Hilscher Diagnostic Port für netx boot loader serial boot mode 2008 Jiri Spale, Programmierung eingebetteter Systeme 19
UART Initialisierung #1 1. GPIO/UART-Pins in UART-Mode pgpio->cfg[0]=0x02; //Uart0 pgpio->cfg[1]=0x02; //Uart1 2. UART-Clock einstellen (das 16fache der gewünschten Baud-Rate) Einstellung durch Dividieren der Bus-Takts (Prescaler). 2 Modi, einstellbar in Baud Rate Mode Control Register: BAUD_DIV = (100 MHz/(16* baudrate))-1 // mode control=0 BAUD_DIV = (16*baudRate)/systemFrequency)*2 16 // mode control=1 Beispiel für 9600 Baud und Mode Rate Control = 0: BAUD DIV = (100*10 6 /(16*9600))-1 = 650 Der max. 16-Bit-Wert für Prescaler (Divisor) liegt getrennt in 2 Registern: puart0->brm_cr=0; puart0->bauddiv_lsb = (650&0xFF); puart0->bauddiv_msb = (650>>8); 2008 Jiri Spale, Programmierung eingebetteter Systeme 20
UART Initialisierung #2 3. Format des UART-Paketes und FIFO-Benutzung einstellen Register: Line Control Register Bsp: puart0->line_cr = 0x60; 8 bits no parity one stop bit; 4. UART in Betrieb setzen Für Daten Senden: Transmit Driver in DRV ENABLE Register freigeben Falls HW control flow gewünscht: RTS Driver HW im gleichen Reg freigeben /* Set TX-Driver to enabled */ puart0->drv_enable=0x01; /* Finally enable the UART */ puart0->cr = UART_ENABLED; 5. Weitere nützliche Register UARTx_FLAG Flag Register weitere Status-Infos ausgeben UARTx_RTS_CTRL RTS Control Register RTS, CTS 2008 Jiri Spale, Programmierung eingebetteter Systeme 21
UART Receive und Transmit Transmit Schreiben in Data Register Receive Lesen aus in Data Register Mögliche Einstellung bei FIFO-Benutzung: FIFO generiert ein Interrupt, falls FIFO fill-level den vordefinierten Wert erreicht. Einstellung dieses Wertes: in - Transmit FIFO Interrupt Trigger Level Register - Receive FIFO Interrupt Trigger Level Register Receive kann erfolgen Interrupt Mode Polling Mode 2008 Jiri Spale, Programmierung eingebetteter Systeme 22
UART und Interrupts 4 UART-Interrupt-Signale Receive Int Transmit Int Character Timeout Modem Status Int Diese 4 Signale sind geodert und in 1 Int->Channel zugeführt dem VIC Wenn Interrupt kommt - Flag gesetzt in Interrupt Identification Register Bestim. der Quelle - Lesen der Daten aus dem Data Register - Lesen des Status Register 2008 Jiri Spale, Programmierung eingebetteter Systeme 23
AD-Wandler 2x 10-Bit AD-Umsetzer Jeder mit - 4-Kanal Eingangsmultiplexer - Sample&Hold Unit Also: 8 Kanäle, die parallel ausgewertet werden können Maximale Abtastfrequenz: 1 MHz für jeden ADU Kein Draht zum VIC, Interrupts nicht möglich! (leider) Gesteuert über 1 einzigen Register: ADC Analog Digital Register 2 Ansteuerungsmöglichkeiten: - Zugriff über xpec (empfohlen, bessere Performance wg. Pre-Processing): Über xpec0: ADC-Adresse=0x0017009c Über xpec1: ADC-Adresse=0x0017409c Über xpec2: ADC-Adresse=0x0017809c Über xpec3: ADC-Adresse=0x0017c09c - Zugriff über ARM CPU: Jede der 4 Adresse kann benutzt werden, nur die xpec-unit, die zu dieser Adresse gehört, muss ausgeschaltet werden! 2008 Jiri Spale, Programmierung eingebetteter Systeme 24
AD-Wandler #2 ADC0 eingesetzt: externe R, C, L benötigt Anmerkung 1 Anmerkung 2 ADC1 nicht eingesetzt Anmerkung 1: zu anderen eingesetzten ADUs Anmerkung 2: optional zur Filterung von AGND; die Induktivität muss unter Berücksichtigung des konktreten Falls bestimmt werden. 2008 Jiri Spale, Programmierung eingebetteter Systeme 25
ADC beim Lesezugriff AD-Wandler #3 ADCx_BUSY ADCx_D[9:0] bei ADC1_BUSY=1 solange pollen, bis 0 (Wandlung-Ende) konvertierter Wert 2008 Jiri Spale, Programmierung eingebetteter Systeme 26
ADC beim Schreibzugriff AD-Wandler #4 DONT_WRITE_ADCx ADCx_START ADCx_EN ADCx_SEL[2:0] muss log.1 sein während des Schreibens Start Wandlung ADUx ADUx erlauben Kanalauswahl von ADUx: 0x0 000 Pin ADCxIN0 0x2 010 Pin ADCxIN1 0x4 100 Pin ADCxIN2 0x6 110 Pin ADCxIN3 2008 Jiri Spale, Programmierung eingebetteter Systeme 27
Dokumentation #1 Controller NetX500 Product Brief - Übersicht über die Funktionalitäten - Anschließen zusätzlicher HW-Komponenten Technical Reference Guide - elektrische Eigenschaften, typische Werte, Grenzwerte - Schaltpläne Program Reference Guide wichtig für Programmierer! - Namen und Adressen von Registern - Bedeutung einzelner Bits oder Bitgruppen 2008 Jiri Spale, Programmierung eingebetteter Systeme 28
Dokumentation #2 Bord NXSB100 Manual NXSB 100 Board Documentation - welche der netx500-eigenschaften sind zugänglich - Pinbelegung des Bords NXSB 100 Schematic - Schaltplan NXSB 100 Bill of Material 2008 Jiri Spale, Programmierung eingebetteter Systeme 29
Dokumentation #3 Bord NXHX500 NXHX500-RE description - welche der netx500-eigenschaften sind zugänglich - Pinbelegung des Bords 2008 Jiri Spale, Programmierung eingebetteter Systeme 30
Dokumentation #4 Hitex Entwicklungssoftware Starterkit Hilscher netx - Installation, Inbetriebnahme - Programm-Beispiele rcx rcx API - Aufrufe des real-time BS - Parameter-Beschreibung 2008 Jiri Spale, Programmierung eingebetteter Systeme 31