Hanyho bastlírna
Poslední změny
Arduino - KeyCode/Alarm
Hardware
Mega8 Loader
Hardware
LPC interface
Hardware
Simple SNMP
Hardware
Řadič LCD
Hardware
Raspberry PI
Hardware
J-Link
Hardware
AVR miniTOOL
Hardware
ARM C3 STM32
Hardware
10-BaseT
Hardware
LCD SPI
Hardware
UDP Audio
Hardware
ZyXEL patch
Hardware
KIT NXP LPC17xx
Hardware
I2C LPT
Hardware
Digilent S3 DSP
Hardware
Xilinx DLC10
Hardware
Patmel USB
Hardware
POE injektor
Hardware
Xilinx ISE
Software

Ethernet 10-BaseT


nejednou při nějakých pokusech bylo potřeba s kitem nebo jinou věcí nějak rozumě komunikovat, tj. sériový port je sice prima a většínou postačuje, ale když je potřeba přenášet větší objem dat, nebo to není v dosahu počítače tak hned méme se sériovým portem trochu problém, délka kabelu je omezena na nějakých 10m atd... použitím ethernetu problém s délkou kabelu odpadá a přináší to ještě další výhody: větší rychlost (až necelých 10mbit) a možnost napájení zařízení po kabelu (POE), pokud si vystačíme pouze s odesíláním dat tak i minimem součástek = příznivá cena do cca 200 CZK...



10mbit ehternet v začátcích nebyl tak komplikovaný jako jeho dnešní 100mbit 1000mbit verze, tehdejší vývojáři neměli k dispozici skoro nic, krom základních logických IO (74xx) a znali pár triků s tranzistory, stačí tedy dodržet několik zásad a můžeme v jejich krocích fungovat i dnes a většina metalických síťových zařízení tuto pomalou komunikaci stále z důvodu zpětné kompatibility podporuje...

pár věcí, které je nutné dodržet:  

za cenu několika málo TTL obvodů a MCU může vyrobit jednoduchý ethernetový vysílač, a k němu dostavět např. převodník ADC nebo připojit SPI, I2C apod., stavíme-li např. nějaký teploměr nebo čidlo které jen něco snímá a není potřeba s ním obousměrně komunikovat, vystačíme si s odesíláním, vybereme nějaký vhodný MCU (AVR/PIC/ARM) který má alepoň 20 MIPS případně více, a můžeme odesílat IPX nebo UDP pakety případně cokoli jiného co bude mít zdrojovou a cílovou MAC a na konci CRC, zvolil jsem UDP, je to nejjednoduší typ nespojité IP komunikace bez kontroly doručení a nedoručení tak že nevadí jen odesíláme a lze ho snadno zachytit na libovolném počítači nebo routeru...

příklad UDP paketu:

 55 55 55 55 55 55 55 D5
 00 10 A4 7B EA 80 00 12 34 56 78 90 08 00
 45 00 00 2E B3 FE 00 00 80 11 05 40 C0 A8 00 2C C0 A8 00 04 04 00 04
 00 00 1A 2D E8 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11
 B3 31 88 1B

minimální délka paketu 64x8bitů:

 Ethernet preamble/SFD (synchronizer): 55 55 55 55 55 55 55 D5 (nepočítá se do dat)
 Ethernet destination address: 00 10 A4 7B EA 80 (6) - MAC cílové stanice
 Ethernet source address: 00 12 34 56 78 90 (6) - naše MAC
 Ethernet type: 08 00 (2) 0x8000 - IP
 IP header: 45 00 00 2E B3 FE 00 00 80 (9)
 IP protocol: 11 (=UDP) (1)
 IP checksum: 05 40 (2)
 IP source (192.168.0.44): C0 A8 00 2C (4)
 IP destination (192.168.0.4): C0 A8 00 04 (4)
 UDP source port (1024): 04 00 (2)
 UDP destination port (1024): 04 00 (2)
 UDP payload length (18): 00 1A (2)
 UDP checksum: 2D E8 (2)
 UDP payload (18 bytes): 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 (18) - data která přenášíme
 Ethernet checksum: B3 31 88 1B (4) - kontrolní součet počítá se do délky dat

 celkem (64x8bitů) - minimální délka

at už je obsahem cokoli, tak jsou to pořád jen sériová data s definovanou strukturou (hlavička paketu a kontrolní součet) a rychlostí (10mbit), na pokus jsem si vybral MCU AT-MEGA88 20MIPS (dvojnásobek rychlosti přenášených dat, dále asi jako jediný z celé řady má USART který podporuje SPI režim, samotné SPI které řada MCU AT-Mega má bohužel nemá dvojitý buffer pro zápis do TX registru, tak že další bajt pro odeslání lze zapsat až když se odešle bajt předchozí, a bohužel jde zapsat až dva cykly po odeslání tj. na výstupu by chyběly dva bity, tím se stává klasické SPI u AVR řady MCU pro náš jednoduchý účel nepoužitelné, naopak USART u tohoto typu i v SPI režimu tento buffer má, tak že ho lze použít, tj. když se odesílá předchozí bajt už můžu zapsat další a odchozí data jsou spojitá a to je to co potřebujeme...

na obrázku jsou vidět odsílané pakety, nahoře DATA, dole #TXFRAME (signál který jsem si vytvořil pro synchronizaci osciloskopu případně pro TX_ LED, log 1 po čas odesílání paketu), je možné jej využít třeba pro resetování čítače kterým generujeme "link" pulsy pokud se o to nechceme starat v MCU, které má už tak dost starostí s odesíláním, případně sbíráním odesílaných dat
 

zapojení viz schéma, přijímač zde není uplně potřeba, ale je vhodné nějaký doplnit abychom měli informaci o tom že jsme připojeni a že naše odeslané pakety má šanci nějaké zařízení zachytit, pak by jsme neměli odesílat když odesílá někdo jiný stačí detekce že je něco přítomno, dle vlastního vkusu můžeme připojit cokoli na zbylé piny (vyvedl jsem si na konektor), např. nějaká tlačítka, měřené hodnoty (ADC) apod.

příklad jednoduchého přijímače:
analog to digital signal converter
výstup tohoho zesilovače stačí zapojit na INT našeho MCU a nulovat si nějaký čítač abychom věděli že se něco děje...

k naprogramování MCU mám programátor STK500 ale lze asi použít i nějaký jiný, pokud podporuje zmíněné MCU

na software je asi "nejsložitější" sestavit CRC kontrolní součet každého odesílaného rámce, vytvořit CRC32 v nějakém CPLD/FPGA je hračka, ale na 8bit MCU to už tak snadno nejde a zabere to několik mnoho instrukcí, zkoušel jsem různé možnosti jak CRC optimálně vytvořit a jako nejlepší se ukázalo použití statické 8bit polynom tabulky a hodnoty je rychlejší číst z ní, než se snažit rotovat bity v registrech nebo se snažit jinak dopočítat...

int32 crc= 0xFFFFFFFF

crc = (crc >> 8) ^ crc_table[(crc ^ (data[n])) & 0xFF];
funkci zavoláme pro každý bajt, nejříve si vyzvedneme z crc tabulky hodnotu (32bit) a provedeme xor a nejméně významným bajtem crc, provedeme kopii zbylých tří dajtů aby jsme dosáhli posunu zbytku bitů o 8 a nejvyššího dosadíme 0x00 a dokončíme xor se zbylými třemi bajty, na závěr smyčky musíme výsledný kontrolní součet před použitím negovat...
crc32table:
 .db   0x00, 0x00, 0x00, 0x00, 0x77, 0x07, 0x30, 0x96, 0xEE, 0x0E, 0x61, 0x2C, 0x99, 0x09, 0x51, 0xBA
 .db   0x07, 0x6D, 0xC4, 0x19, 0x70, 0x6A, 0xF4, 0x8F, 0xE9, 0x63, 0xA5, 0x35, 0x9E, 0x64, 0x95, 0xA3
 .db   0x0E, 0xDB, 0x88, 0x32, 0x79, 0xDC, 0xB8, 0xA4, 0xE0, 0xD5, 0xE9, 0x1E, 0x97, 0xD2, 0xD9, 0x88
 .db   0x09, 0xB6, 0x4C, 0x2B, 0x7E, 0xB1, 0x7C, 0xBD, 0xE7, 0xB8, 0x2D, 0x07, 0x90, 0xBF, 0x1D, 0x91
 .db   0x1D, 0xB7, 0x10, 0x64, 0x6A, 0xB0, 0x20, 0xF2, 0xF3, 0xB9, 0x71, 0x48, 0x84, 0xBE, 0x41, 0xDE
 .db   0x1A, 0xDA, 0xD4, 0x7D, 0x6D, 0xDD, 0xE4, 0xEB, 0xF4, 0xD4, 0xB5, 0x51, 0x83, 0xD3, 0x85, 0xC7
 .db   0x13, 0x6C, 0x98, 0x56, 0x64, 0x6B, 0xA8, 0xC0, 0xFD, 0x62, 0xF9, 0x7A, 0x8A, 0x65, 0xC9, 0xEC
 .db   0x14, 0x01, 0x5C, 0x4F, 0x63, 0x06, 0x6C, 0xD9, 0xFA, 0x0F, 0x3D, 0x63, 0x8D, 0x08, 0x0D, 0xF5
 .db   0x3B, 0x6E, 0x20, 0xC8, 0x4C, 0x69, 0x10, 0x5E, 0xD5, 0x60, 0x41, 0xE4, 0xA2, 0x67, 0x71, 0x72
 .db   0x3C, 0x03, 0xE4, 0xD1, 0x4B, 0x04, 0xD4, 0x47, 0xD2, 0x0D, 0x85, 0xFD, 0xA5, 0x0A, 0xB5, 0x6B
 .db   0x35, 0xB5, 0xA8, 0xFA, 0x42, 0xB2, 0x98, 0x6C, 0xDB, 0xBB, 0xC9, 0xD6, 0xAC, 0xBC, 0xF9, 0x40
 .db   0x32, 0xD8, 0x6C, 0xE3, 0x45, 0xDF, 0x5C, 0x75, 0xDC, 0xD6, 0x0D, 0xCF, 0xAB, 0xD1, 0x3D, 0x59
 .db   0x26, 0xD9, 0x30, 0xAC, 0x51, 0xDE, 0x00, 0x3A, 0xC8, 0xD7, 0x51, 0x80, 0xBF, 0xD0, 0x61, 0x16
 .db   0x21, 0xB4, 0xF4, 0xB5, 0x56, 0xB3, 0xC4, 0x23, 0xCF, 0xBA, 0x95, 0x99, 0xB8, 0xBD, 0xA5, 0x0F
 .db   0x28, 0x02, 0xB8, 0x9E, 0x5F, 0x05, 0x88, 0x08, 0xC6, 0x0C, 0xD9, 0xB2, 0xB1, 0x0B, 0xE9, 0x24
 .db   0x2F, 0x6F, 0x7C, 0x87, 0x58, 0x68, 0x4C, 0x11, 0xC1, 0x61, 0x1D, 0xAB, 0xB6, 0x66, 0x2D, 0x3D
 .db   0x76, 0xDC, 0x41, 0x90, 0x01, 0xDB, 0x71, 0x06, 0x98, 0xD2, 0x20, 0xBC, 0xEF, 0xD5, 0x10, 0x2A
 .db   0x71, 0xB1, 0x85, 0x89, 0x06, 0xB6, 0xB5, 0x1F, 0x9F, 0xBF, 0xE4, 0xA5, 0xE8, 0xB8, 0xD4, 0x33
 .db   0x78, 0x07, 0xC9, 0xA2, 0x0F, 0x00, 0xF9, 0x34, 0x96, 0x09, 0xA8, 0x8E, 0xE1, 0x0E, 0x98, 0x18
 .db   0x7F, 0x6A, 0x0D, 0xBB, 0x08, 0x6D, 0x3D, 0x2D, 0x91, 0x64, 0x6C, 0x97, 0xE6, 0x63, 0x5C, 0x01
 .db   0x6B, 0x6B, 0x51, 0xF4, 0x1C, 0x6C, 0x61, 0x62, 0x85, 0x65, 0x30, 0xD8, 0xF2, 0x62, 0x00, 0x4E
 .db   0x6C, 0x06, 0x95, 0xED, 0x1B, 0x01, 0xA5, 0x7B, 0x82, 0x08, 0xF4, 0xC1, 0xF5, 0x0F, 0xC4, 0x57
 .db   0x65, 0xB0, 0xD9, 0xC6, 0x12, 0xB7, 0xE9, 0x50, 0x8B, 0xBE, 0xB8, 0xEA, 0xFC, 0xB9, 0x88, 0x7C
 .db   0x62, 0xDD, 0x1D, 0xDF, 0x15, 0xDA, 0x2D, 0x49, 0x8C, 0xD3, 0x7C, 0xF3, 0xFB, 0xD4, 0x4C, 0x65
 .db   0x4D, 0xB2, 0x61, 0x58, 0x3A, 0xB5, 0x51, 0xCE, 0xA3, 0xBC, 0x00, 0x74, 0xD4, 0xBB, 0x30, 0xE2
 .db   0x4A, 0xDF, 0xA5, 0x41, 0x3D, 0xD8, 0x95, 0xD7, 0xA4, 0xD1, 0xC4, 0x6D, 0xD3, 0xD6, 0xF4, 0xFB
 .db   0x43, 0x69, 0xE9, 0x6A, 0x34, 0x6E, 0xD9, 0xFC, 0xAD, 0x67, 0x88, 0x46, 0xDA, 0x60, 0xB8, 0xD0
 .db   0x44, 0x04, 0x2D, 0x73, 0x33, 0x03, 0x1D, 0xE5, 0xAA, 0x0A, 0x4C, 0x5F, 0xDD, 0x0D, 0x7C, 0xC9
 .db   0x50, 0x05, 0x71, 0x3C, 0x27, 0x02, 0x41, 0xAA, 0xBE, 0x0B, 0x10, 0x10, 0xC9, 0x0C, 0x20, 0x86
 .db   0x57, 0x68, 0xB5, 0x25, 0x20, 0x6F, 0x85, 0xB3, 0xB9, 0x66, 0xD4, 0x09, 0xCE, 0x61, 0xE4, 0x9F
 .db   0x5E, 0xDE, 0xF9, 0x0E, 0x29, 0xD9, 0xC9, 0x98, 0xB0, 0xD0, 0x98, 0x22, 0xC7, 0xD7, 0xA8, 0xB4
 .db   0x59, 0xB3, 0x3D, 0x17, 0x2E, 0xB4, 0x0D, 0x81, 0xB7, 0xBD, 0x5C, 0x3B, 0xC0, 0xBA, 0x6C, 0xAD
 .db   0xED, 0xB8, 0x83, 0x20, 0x9A, 0xBF, 0xB3, 0xB6, 0x03, 0xB6, 0xE2, 0x0C, 0x74, 0xB1, 0xD2, 0x9A
 .db   0xEA, 0xD5, 0x47, 0x39, 0x9D, 0xD2, 0x77, 0xAF, 0x04, 0xDB, 0x26, 0x15, 0x73, 0xDC, 0x16, 0x83
 .db   0xE3, 0x63, 0x0B, 0x12, 0x94, 0x64, 0x3B, 0x84, 0x0D, 0x6D, 0x6A, 0x3E, 0x7A, 0x6A, 0x5A, 0xA8
 .db   0xE4, 0x0E, 0xCF, 0x0B, 0x93, 0x09, 0xFF, 0x9D, 0x0A, 0x00, 0xAE, 0x27, 0x7D, 0x07, 0x9E, 0xB1
 .db   0xF0, 0x0F, 0x93, 0x44, 0x87, 0x08, 0xA3, 0xD2, 0x1E, 0x01, 0xF2, 0x68, 0x69, 0x06, 0xC2, 0xFE
 .db   0xF7, 0x62, 0x57, 0x5D, 0x80, 0x65, 0x67, 0xCB, 0x19, 0x6C, 0x36, 0x71, 0x6E, 0x6B, 0x06, 0xE7
 .db   0xFE, 0xD4, 0x1B, 0x76, 0x89, 0xD3, 0x2B, 0xE0, 0x10, 0xDA, 0x7A, 0x5A, 0x67, 0xDD, 0x4A, 0xCC
 .db   0xF9, 0xB9, 0xDF, 0x6F, 0x8E, 0xBE, 0xEF, 0xF9, 0x17, 0xB7, 0xBE, 0x43, 0x60, 0xB0, 0x8E, 0xD5
 .db   0xD6, 0xD6, 0xA3, 0xE8, 0xA1, 0xD1, 0x93, 0x7E, 0x38, 0xD8, 0xC2, 0xC4, 0x4F, 0xDF, 0xF2, 0x52
 .db   0xD1, 0xBB, 0x67, 0xF1, 0xA6, 0xBC, 0x57, 0x67, 0x3F, 0xB5, 0x06, 0xDD, 0x48, 0xB2, 0x36, 0x4B
 .db   0xD8, 0x0D, 0x2B, 0xDA, 0xAF, 0x0A, 0x1B, 0x4C, 0x36, 0x03, 0x4A, 0xF6, 0x41, 0x04, 0x7A, 0x60
 .db   0xDF, 0x60, 0xEF, 0xC3, 0xA8, 0x67, 0xDF, 0x55, 0x31, 0x6E, 0x8E, 0xEF, 0x46, 0x69, 0xBE, 0x79
 .db   0xCB, 0x61, 0xB3, 0x8C, 0xBC, 0x66, 0x83, 0x1A, 0x25, 0x6F, 0xD2, 0xA0, 0x52, 0x68, 0xE2, 0x36
 .db   0xCC, 0x0C, 0x77, 0x95, 0xBB, 0x0B, 0x47, 0x03, 0x22, 0x02, 0x16, 0xB9, 0x55, 0x05, 0x26, 0x2F
 .db   0xC5, 0xBA, 0x3B, 0xBE, 0xB2, 0xBD, 0x0B, 0x28, 0x2B, 0xB4, 0x5A, 0x92, 0x5C, 0xB3, 0x6A, 0x04
 .db   0xC2, 0xD7, 0xFF, 0xA7, 0xB5, 0xD0, 0xCF, 0x31, 0x2C, 0xD9, 0x9E, 0x8B, 0x5B, 0xDE, 0xAE, 0x1D
 .db   0x9B, 0x64, 0xC2, 0xB0, 0xEC, 0x63, 0xF2, 0x26, 0x75, 0x6A, 0xA3, 0x9C, 0x02, 0x6D, 0x93, 0x0A
 .db   0x9C, 0x09, 0x06, 0xA9, 0xEB, 0x0E, 0x36, 0x3F, 0x72, 0x07, 0x67, 0x85, 0x05, 0x00, 0x57, 0x13
 .db   0x95, 0xBF, 0x4A, 0x82, 0xE2, 0xB8, 0x7A, 0x14, 0x7B, 0xB1, 0x2B, 0xAE, 0x0C, 0xB6, 0x1B, 0x38
 .db   0x92, 0xD2, 0x8E, 0x9B, 0xE5, 0xD5, 0xBE, 0x0D, 0x7C, 0xDC, 0xEF, 0xB7, 0x0B, 0xDB, 0xDF, 0x21
 .db   0x86, 0xD3, 0xD2, 0xD4, 0xF1, 0xD4, 0xE2, 0x42, 0x68, 0xDD, 0xB3, 0xF8, 0x1F, 0xDA, 0x83, 0x6E
 .db   0x81, 0xBE, 0x16, 0xCD, 0xF6, 0xB9, 0x26, 0x5B, 0x6F, 0xB0, 0x77, 0xE1, 0x18, 0xB7, 0x47, 0x77
 .db   0x88, 0x08, 0x5A, 0xE6, 0xFF, 0x0F, 0x6A, 0x70, 0x66, 0x06, 0x3B, 0xCA, 0x11, 0x01, 0x0B, 0x5C
 .db   0x8F, 0x65, 0x9E, 0xFF, 0xF8, 0x62, 0xAE, 0x69, 0x61, 0x6B, 0xFF, 0xD3, 0x16, 0x6C, 0xCF, 0x45
 .db   0xA0, 0x0A, 0xE2, 0x78, 0xD7, 0x0D, 0xD2, 0xEE, 0x4E, 0x04, 0x83, 0x54, 0x39, 0x03, 0xB3, 0xC2
 .db   0xA7, 0x67, 0x26, 0x61, 0xD0, 0x60, 0x16, 0xF7, 0x49, 0x69, 0x47, 0x4D, 0x3E, 0x6E, 0x77, 0xDB
 .db   0xAE, 0xD1, 0x6A, 0x4A, 0xD9, 0xD6, 0x5A, 0xDC, 0x40, 0xDF, 0x0B, 0x66, 0x37, 0xD8, 0x3B, 0xF0
 .db   0xA9, 0xBC, 0xAE, 0x53, 0xDE, 0xBB, 0x9E, 0xC5, 0x47, 0xB2, 0xCF, 0x7F, 0x30, 0xB5, 0xFF, 0xE9
 .db   0xBD, 0xBD, 0xF2, 0x1C, 0xCA, 0xBA, 0xC2, 0x8A, 0x53, 0xB3, 0x93, 0x30, 0x24, 0xB4, 0xA3, 0xA6
 .db   0xBA, 0xD0, 0x36, 0x05, 0xCD, 0xD7, 0x06, 0x93, 0x54, 0xDE, 0x57, 0x29, 0x23, 0xD9, 0x67, 0xBF
 .db   0xB3, 0x66, 0x7A, 0x2E, 0xC4, 0x61, 0x4A, 0xB8, 0x5D, 0x68, 0x1B, 0x02, 0x2A, 0x6F, 0x2B, 0x94
 .db   0xB4, 0x0B, 0xBE, 0x37, 0xC3, 0x0C, 0x8E, 0xA1, 0x5A, 0x05, 0xDF, 0x1B, 0x2D, 0x02, 0xEF, 0x8D

původní experimentální verze zapojení na pokusy, přijímač byl v dalších verzích nahrazen obvodem MC4386 je citlivější a obsahuje klopný obvod s hysterezí, tím jsou minimalizovány zákmity...