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:
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