Linuxcnc vs SSERIAL
Napsal: 1. 12. 2017, 1:22
Ahoj všem,
Jak sem před časem avizoval, tak sem se pokusil rozluštit sserial protokol a trochu ho popsat pro ty kteří by se tím chtěli zabývat.
Předem bych chtěl poděkovat uživateli martyxxx bez jehož poznatků bych se do toho asi ani nepouštěl, protože bych neviděl realný cíl. On už tuto trnitou cestu prošel a to v dobách kdy bylo informací ještě méně než dnes a dokonce bez realné funkční sserial karty kterou by si odposlšech. klobouk dolu.
Jak sám poznamenal, dokumentace je z roku 2012 a od te doby do ní, na rozdíl od realného kodu, nikdo nesáhl. Takže hromada parametrů dělá něco jiného než píšou, jené zanikly a nové přibyly. Ale abych Vás neděsil, není to nakonec tak hrozný. Právě proto jsem se rozhodl sepsat pár informací, které případně pomohou rozběhnout vlastní sserial kartu, nebo si alespon udelat obrazek jak to cele funguje.
Co mě k tomu vedlo?
Chtěl bych si postavit vlastní panel pro ovládaní cnc mašiny tak, že ho pouze připojím pomocí rj45 kabelu, kde je i napajeni a linuxcnc si sám z karty "přečte" názvy pinu, ty popropojuju s patřičnými piny v systému a nic víc. Jestli z toho nekdy neco bude ukáže čas.
Zkusím to celé popsat tak, aby se do toho mohl pustit i někdo, kdo o tom podobně jako já na začátku nemel ani paru. timto se omlouvám zkusenejsim uzivatelum, ty mohou nudne pasaze preskakovat. Koukam, ze uz mi zase chybej hacky a carky, ale to je tim, ze mozek uz prepnul do rezimu logiky a vypnul korekci chyb. Jsem proste chlap a nedokazu delat dve veci najednou.
Co jsem měl k dispozici a co jsem musel dokoupit.
Mám na stole mesa kartu 7i76e
sserial kartu 7i73. Ani jedna neni moje tak snad se znich nebude kouřit.
na ebayi jsem za celych asi 150,- korun poridil logicky analyzator 24MHz 8 kanalu
a dále pro mě uplně neznámého brouka stm32f103c8t6 za 80,- (tem ma tu vyhodu ze v pohode zvlada potrebnych 2,5Mbit na uartu)
nikdy jsem pro tenhle hw nic nepsal, ale delší dobu po něm pokukuju, tak proč né.
no a na konec k tomu samozřejme jeste programator st-link v2 bratru za 55,-
jak vidite investice nula nula nic a pritom to udela cloveku takovou radost.
jeste jsem nasel v supliku prevodnik usb-rs232-ttl bez ktereho by to asi taky šlo, ale do začátku se docela hodil na prvotní ladění softu. proste jsem ho pouzival jako zdroj povelu pomoci programu terminal, kterej umi posilat hexa kody.
takhle nejak vypada sela sestava.
Mesa 7i76e ma v sobe dva sserial porty, jeden složí pro řízení IO vstupu/výstupů na vykonové časti karty (natvrdo nadratovan v karte) a druhy je k dispozici pro pripojení externi sserial karty. Problém je v tom, že vystup je diferencialní kvuli rušení a STM32 potřebuje nediferencialní. Takže jeste bylo potreba si napsat vlastni firmware pro 7i76e tak aby pribyl dalsi SSerial na portu P1 nebo p2.
k tomu jsem pouzil tenhle stary navod http://forum.strojirenstvi.cz/viewtopic ... 15#p196133" onclick="window.open(this.href);return false;
kde staci upravit asi 4 řádky a cely to zkompilovat.
Takže ve finale jsem mel k dispozici jak diff tak ttl signál z 7i76e.
Začal jsem tím, že jsem připojil analyzátor na diff vystup, kde současně byla pripojena 7i73 a poslouchal co se děje.
takhl enejak to vypada, kdyz si karty zacnou povidat.
zkusim popsat jak takova komunikace probiha trochu lidsky, pozdeji se dostame k detailum.
Podotykam, ze je zde jen komunikace mezi masterem a slave, nikoli mezi linuxcnc a master zarizenim, protoze to pro vlastni navrh karty nepotrebujeme.
Na jednom dráte je vzdy jenom jedno sserial slave zarizeni, takze je potreba mit tolik portu na masteru kolik je slave zarizeni.
kazdá serie povelu je nasledovana CRC součtem, který celou serii "znaku" zakončuje (to neplati pro všechny přikazy, nektere crc nemaji)
master pri inicializace vysle do vsech portu uvodni zvolani
0xDF plus CRC součet............. neco jako "halo, je nekdo na druhe strane?" toto zvolani opakuje nekolikrat. dokud se mu nekdo neozve. kdyz se nikdo na patricnem portu neozve, tak stichne a dal se o nic nesnazi.
slave zarizeni na takove zvolani odpovi.
0x5A + crc....... ano je tu nekdo a posloucham.
To je povel pro mastra, ze si ma s kym popovidat a z vesela se do toho pusti.
nasleduje sekvence, kde se master pta na ruzne informace typu
"jak se jmenujes?"
"jsi pripraven si vymenovat data?"
"kolik byte budes vysilat a prijimat?"
"kolik a jakych rezimu HW a SW umis?"
"na jakych adresach mas potrebne informace?"
"jak jse jmenujou piny ktere vysilas, prijimas"
a obracene sdeli master do slave potrebne informace
"nastav si sw mode cislo x" to je to cislo ktere je v hal souboru pri volani mesa karty "loadrt hm2_eth ........................................config="................... sserial_port=013xxxxx"" nula rika sw mode 0 na sserial0, swmode 1 na karte 1 a swmode 3 na karte 2, x vypne patricny sserial" doprucuju si zapnout debug pro hostmot2, pak to vypisuje hromadu zajimavych informaci pri startu linuxcnc a komunikace sserial karet.
"prenastav si promenou x na y"
atd atd.
prvni znak v sekvenci je vzdy přikaz, který říká kolik znaku bude nasledovat a rovnez rika co ocekava jako odpoved.
po uvodnim pokecani a nastaveni vseho potrebneho si karty vymenuji uz jenom provozni data kazdou 1ms. maximalne 96bitu tam a 96bitu zpatky
co budou tyto data obsahovat zalezi jen nan nas.
Uvodni vymena nastavovacich dat, kde se karty domlouvaj probiha postupne na vsech portech, nejdriv si pokeca port 0 pak 1 atd.
samotna vymena provoznich dat pak jede na vsech portech soucasne.
Toliko na uvod, aby si clovek udelal predstavu jak to cely funguje hooodne ve zkratce.
Ted se pokusim popsat par podle me dulezitych informaci jak mi budou prichazet pod ruku.
Vetsina povelu je jaks taks popsana v kazdem manuale pro mesa karty.
lze je rozdelit do nekolika skupin. RPC command , LBP , read write atd, to nebudu ted rozepisovat ale spis nakonec pripojim program, kde je to lepe videt.
Mezi nejdulezitejsi data ktera jsou pri inicializaci karty zapotrebi jsou tzv GTOC a PTOC.
GTOC- global table of contents - globalni data - v podstate informace co vsechno slave umi, jake podporuje rezimy, jake umi pouzit piny jakych tzpu, kde jsou atd.
PTOC- proces table of contents - informace potrebne pro dany rezim - inf o hw modu, info o sw modu, a seznam "pinu" ktere se prenasi.
vsechny tyhle informace se prenasi pomoci pointrů.
jeden z nejdulezitejsich prikazu je 0xBB tzv DsicoveryRPC, ktery vraci 6znaku +crc.
prvni byte rika - velikost input data v bytech
druhy byte rika - velikost output data v bytech
dalsi dva jsou prvni adresa PTOC
dalsi dva pak GTOC prvni adresa.
PTOC a GTOC tabulka je jenom takova prevodni tabulka, ktera ukazuje na PDD (proces data descriptor) coz uz jsou samotna data.
Tim se master dozvi kde zacinaji potrebne informace, nedozvi se ale jak jsou velke a kolik jich bude.
radsi uvedu priklad z odposlechnute komunikace, protoze to neumim jednoduse popsat. master
'187' (0xBB)
'18' (0x12)
slave
'12' (0x0C) byte in
'3' (0x03) byte out
'4' (0x04) PTOC
'169' (0xA9) PTOC
'166' (0xA6) GTOC
'170' (0xAA) GTOC
'208' (0xD0) crc
nam rika ze tabulka PTOC je adrese 0xA904 (LSB byte je prvni MSB druhy)
ted se master muze zeptat co na teto adrese lezi.
samotna adresa PDD se taky sklada ze dvou byte. prvni LSB je na samotne adrese PTOC a MSB na PTOC+1
master
L (0x4C)
'4' (0x04) ..............PTOC LSB
'169' (0xA9) ..........PTOC MSB
'130' (0x82)
slave
'248' (0xF8)............LSB PDD
'182' (0xB6)............crc
masterL (0x4C)
'5' (0x05) ...............PTOC LSB+1
'169' (0xA9) ............MSB
F (0x46)
slave
'160' (0xA0)
'175' (0xAF)
Tim se master dozvedel ze prvni PDD informace jsou na adrese 0xA0F8 a muze se na ne konecne zeptat.
dozvi se tam jako prvni vypis hw a sw modu, ktera karta podporuje.
kdyz chci zjistit druhou adresu PDD, tak se si k prvni PTOC adrese prictu 2 a tam se dozvim dalsi adresu PDD.
jestlize je odpoved nulova pro MSB i LSB znamena to, ze uz tam nic dalsiho neni a konci seznem PTOC a tim padem se master zacne ptat na GTOC az narazi na nuly a tim konci proces discovery.
Podobne to je se samotnymi PDD, ktery je pevne dan strukturou v zavislosti na tom jestli jsou informace typu mode (B0) nebo A0 procesni data.
Viz manual, tohle tam je popsany.
Pro prehled přikladam co jsem zachytil pri odposlechu a co jsem z toho odvodil. je to par tisic řádku a chvili trva nez se v tom clovek zorientuje. jsou tam i moje poznaky, tak snad to bude o to snazsi
A nakonec slibene programy. odbornici prominou, nejsem programator, takze sem to napsal tek nejak intutivne a hlavne jak sem psal je to muj prvni vytvor pro stm32f1, kterej asi ve finale nebude stacit poctem pinu,ale portace na neco vyssiho jako f4 by neml byt problem.
piny jsem nastavil pomoci cubemx a samotny program je v u-vision KEIL. byl to prvni soft na ktery jsem narazil a byl zadarmo aje to celkem intuitivni, ikdyz je tam hromada balastu
Samozrejme by to slo napsat elegantneji, ale jako ukazka si myslim by to mohlo poslouzit.
V samotnem programu je jeste spousta nedodelavek. jako napriklad urcovani adres, inicializace PTOC a GTOC natvrdo, pouzivani preruseni jen na cteni uart a podobny nedodelavky, ke kterym se snad nekdy vratim. A mozna jsou tam i veci navic jako pokusy s encoderem a klavesnici. Neprenasi se nic duleziteho, jen informace o encoderu, nejaky nahodny piny a signal pily abych mel jistotu ze se neco deje. prvotne mi slo zatim o rozbehani vlastni komunikace. realna data prenosu teprve prijdou.
Dlouhym zimnim vecerum zdar
pokračování příště.
Martin
Jak sem před časem avizoval, tak sem se pokusil rozluštit sserial protokol a trochu ho popsat pro ty kteří by se tím chtěli zabývat.
Předem bych chtěl poděkovat uživateli martyxxx bez jehož poznatků bych se do toho asi ani nepouštěl, protože bych neviděl realný cíl. On už tuto trnitou cestu prošel a to v dobách kdy bylo informací ještě méně než dnes a dokonce bez realné funkční sserial karty kterou by si odposlšech. klobouk dolu.
Jak sám poznamenal, dokumentace je z roku 2012 a od te doby do ní, na rozdíl od realného kodu, nikdo nesáhl. Takže hromada parametrů dělá něco jiného než píšou, jené zanikly a nové přibyly. Ale abych Vás neděsil, není to nakonec tak hrozný. Právě proto jsem se rozhodl sepsat pár informací, které případně pomohou rozběhnout vlastní sserial kartu, nebo si alespon udelat obrazek jak to cele funguje.
Co mě k tomu vedlo?
Chtěl bych si postavit vlastní panel pro ovládaní cnc mašiny tak, že ho pouze připojím pomocí rj45 kabelu, kde je i napajeni a linuxcnc si sám z karty "přečte" názvy pinu, ty popropojuju s patřičnými piny v systému a nic víc. Jestli z toho nekdy neco bude ukáže čas.
Zkusím to celé popsat tak, aby se do toho mohl pustit i někdo, kdo o tom podobně jako já na začátku nemel ani paru. timto se omlouvám zkusenejsim uzivatelum, ty mohou nudne pasaze preskakovat. Koukam, ze uz mi zase chybej hacky a carky, ale to je tim, ze mozek uz prepnul do rezimu logiky a vypnul korekci chyb. Jsem proste chlap a nedokazu delat dve veci najednou.
Co jsem měl k dispozici a co jsem musel dokoupit.
Mám na stole mesa kartu 7i76e
sserial kartu 7i73. Ani jedna neni moje tak snad se znich nebude kouřit.
na ebayi jsem za celych asi 150,- korun poridil logicky analyzator 24MHz 8 kanalu
a dále pro mě uplně neznámého brouka stm32f103c8t6 za 80,- (tem ma tu vyhodu ze v pohode zvlada potrebnych 2,5Mbit na uartu)
nikdy jsem pro tenhle hw nic nepsal, ale delší dobu po něm pokukuju, tak proč né.
no a na konec k tomu samozřejme jeste programator st-link v2 bratru za 55,-
jak vidite investice nula nula nic a pritom to udela cloveku takovou radost.
jeste jsem nasel v supliku prevodnik usb-rs232-ttl bez ktereho by to asi taky šlo, ale do začátku se docela hodil na prvotní ladění softu. proste jsem ho pouzival jako zdroj povelu pomoci programu terminal, kterej umi posilat hexa kody.
takhle nejak vypada sela sestava.
Mesa 7i76e ma v sobe dva sserial porty, jeden složí pro řízení IO vstupu/výstupů na vykonové časti karty (natvrdo nadratovan v karte) a druhy je k dispozici pro pripojení externi sserial karty. Problém je v tom, že vystup je diferencialní kvuli rušení a STM32 potřebuje nediferencialní. Takže jeste bylo potreba si napsat vlastni firmware pro 7i76e tak aby pribyl dalsi SSerial na portu P1 nebo p2.
k tomu jsem pouzil tenhle stary navod http://forum.strojirenstvi.cz/viewtopic ... 15#p196133" onclick="window.open(this.href);return false;
kde staci upravit asi 4 řádky a cely to zkompilovat.
Takže ve finale jsem mel k dispozici jak diff tak ttl signál z 7i76e.
Začal jsem tím, že jsem připojil analyzátor na diff vystup, kde současně byla pripojena 7i73 a poslouchal co se děje.
takhl enejak to vypada, kdyz si karty zacnou povidat.
zkusim popsat jak takova komunikace probiha trochu lidsky, pozdeji se dostame k detailum.
Podotykam, ze je zde jen komunikace mezi masterem a slave, nikoli mezi linuxcnc a master zarizenim, protoze to pro vlastni navrh karty nepotrebujeme.
Na jednom dráte je vzdy jenom jedno sserial slave zarizeni, takze je potreba mit tolik portu na masteru kolik je slave zarizeni.
kazdá serie povelu je nasledovana CRC součtem, který celou serii "znaku" zakončuje (to neplati pro všechny přikazy, nektere crc nemaji)
master pri inicializace vysle do vsech portu uvodni zvolani
0xDF plus CRC součet............. neco jako "halo, je nekdo na druhe strane?" toto zvolani opakuje nekolikrat. dokud se mu nekdo neozve. kdyz se nikdo na patricnem portu neozve, tak stichne a dal se o nic nesnazi.
slave zarizeni na takove zvolani odpovi.
0x5A + crc....... ano je tu nekdo a posloucham.
To je povel pro mastra, ze si ma s kym popovidat a z vesela se do toho pusti.
nasleduje sekvence, kde se master pta na ruzne informace typu
"jak se jmenujes?"
"jsi pripraven si vymenovat data?"
"kolik byte budes vysilat a prijimat?"
"kolik a jakych rezimu HW a SW umis?"
"na jakych adresach mas potrebne informace?"
"jak jse jmenujou piny ktere vysilas, prijimas"
a obracene sdeli master do slave potrebne informace
"nastav si sw mode cislo x" to je to cislo ktere je v hal souboru pri volani mesa karty "loadrt hm2_eth ........................................config="................... sserial_port=013xxxxx"" nula rika sw mode 0 na sserial0, swmode 1 na karte 1 a swmode 3 na karte 2, x vypne patricny sserial" doprucuju si zapnout debug pro hostmot2, pak to vypisuje hromadu zajimavych informaci pri startu linuxcnc a komunikace sserial karet.
"prenastav si promenou x na y"
atd atd.
prvni znak v sekvenci je vzdy přikaz, který říká kolik znaku bude nasledovat a rovnez rika co ocekava jako odpoved.
po uvodnim pokecani a nastaveni vseho potrebneho si karty vymenuji uz jenom provozni data kazdou 1ms. maximalne 96bitu tam a 96bitu zpatky
co budou tyto data obsahovat zalezi jen nan nas.
Uvodni vymena nastavovacich dat, kde se karty domlouvaj probiha postupne na vsech portech, nejdriv si pokeca port 0 pak 1 atd.
samotna vymena provoznich dat pak jede na vsech portech soucasne.
Toliko na uvod, aby si clovek udelal predstavu jak to cely funguje hooodne ve zkratce.
Ted se pokusim popsat par podle me dulezitych informaci jak mi budou prichazet pod ruku.
Vetsina povelu je jaks taks popsana v kazdem manuale pro mesa karty.
lze je rozdelit do nekolika skupin. RPC command , LBP , read write atd, to nebudu ted rozepisovat ale spis nakonec pripojim program, kde je to lepe videt.
Mezi nejdulezitejsi data ktera jsou pri inicializaci karty zapotrebi jsou tzv GTOC a PTOC.
GTOC- global table of contents - globalni data - v podstate informace co vsechno slave umi, jake podporuje rezimy, jake umi pouzit piny jakych tzpu, kde jsou atd.
PTOC- proces table of contents - informace potrebne pro dany rezim - inf o hw modu, info o sw modu, a seznam "pinu" ktere se prenasi.
vsechny tyhle informace se prenasi pomoci pointrů.
jeden z nejdulezitejsich prikazu je 0xBB tzv DsicoveryRPC, ktery vraci 6znaku +crc.
prvni byte rika - velikost input data v bytech
druhy byte rika - velikost output data v bytech
dalsi dva jsou prvni adresa PTOC
dalsi dva pak GTOC prvni adresa.
PTOC a GTOC tabulka je jenom takova prevodni tabulka, ktera ukazuje na PDD (proces data descriptor) coz uz jsou samotna data.
Tim se master dozvi kde zacinaji potrebne informace, nedozvi se ale jak jsou velke a kolik jich bude.
radsi uvedu priklad z odposlechnute komunikace, protoze to neumim jednoduse popsat. master
'187' (0xBB)
'18' (0x12)
slave
'12' (0x0C) byte in
'3' (0x03) byte out
'4' (0x04) PTOC
'169' (0xA9) PTOC
'166' (0xA6) GTOC
'170' (0xAA) GTOC
'208' (0xD0) crc
nam rika ze tabulka PTOC je adrese 0xA904 (LSB byte je prvni MSB druhy)
ted se master muze zeptat co na teto adrese lezi.
samotna adresa PDD se taky sklada ze dvou byte. prvni LSB je na samotne adrese PTOC a MSB na PTOC+1
master
L (0x4C)
'4' (0x04) ..............PTOC LSB
'169' (0xA9) ..........PTOC MSB
'130' (0x82)
slave
'248' (0xF8)............LSB PDD
'182' (0xB6)............crc
masterL (0x4C)
'5' (0x05) ...............PTOC LSB+1
'169' (0xA9) ............MSB
F (0x46)
slave
'160' (0xA0)
'175' (0xAF)
Tim se master dozvedel ze prvni PDD informace jsou na adrese 0xA0F8 a muze se na ne konecne zeptat.
dozvi se tam jako prvni vypis hw a sw modu, ktera karta podporuje.
kdyz chci zjistit druhou adresu PDD, tak se si k prvni PTOC adrese prictu 2 a tam se dozvim dalsi adresu PDD.
jestlize je odpoved nulova pro MSB i LSB znamena to, ze uz tam nic dalsiho neni a konci seznem PTOC a tim padem se master zacne ptat na GTOC az narazi na nuly a tim konci proces discovery.
Podobne to je se samotnymi PDD, ktery je pevne dan strukturou v zavislosti na tom jestli jsou informace typu mode (B0) nebo A0 procesni data.
Viz manual, tohle tam je popsany.
Pro prehled přikladam co jsem zachytil pri odposlechu a co jsem z toho odvodil. je to par tisic řádku a chvili trva nez se v tom clovek zorientuje. jsou tam i moje poznaky, tak snad to bude o to snazsi
A nakonec slibene programy. odbornici prominou, nejsem programator, takze sem to napsal tek nejak intutivne a hlavne jak sem psal je to muj prvni vytvor pro stm32f1, kterej asi ve finale nebude stacit poctem pinu,ale portace na neco vyssiho jako f4 by neml byt problem.
piny jsem nastavil pomoci cubemx a samotny program je v u-vision KEIL. byl to prvni soft na ktery jsem narazil a byl zadarmo aje to celkem intuitivni, ikdyz je tam hromada balastu
Samozrejme by to slo napsat elegantneji, ale jako ukazka si myslim by to mohlo poslouzit.
V samotnem programu je jeste spousta nedodelavek. jako napriklad urcovani adres, inicializace PTOC a GTOC natvrdo, pouzivani preruseni jen na cteni uart a podobny nedodelavky, ke kterym se snad nekdy vratim. A mozna jsou tam i veci navic jako pokusy s encoderem a klavesnici. Neprenasi se nic duleziteho, jen informace o encoderu, nejaky nahodny piny a signal pily abych mel jistotu ze se neco deje. prvotne mi slo zatim o rozbehani vlastni komunikace. realna data prenosu teprve prijdou.
Dlouhym zimnim vecerum zdar
pokračování příště.
Martin