Linuxcnc vs SSERIAL

Odpovědět
fupe
Příspěvky: 566
Registrován: 27. 5. 2008, 9:10
Bydliště: Praha

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
7i76e.jpg

sserial kartu 7i73. Ani jedna neni moje tak snad se znich nebude kouřit.

7i73.jpg
na ebayi jsem za celych asi 150,- korun poridil logicky analyzator 24MHz 8 kanalu

analyzer.jpg
analyzer.jpg (11.4 KiB) Zobrazeno 1538 x
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)


stm32f103c8.jpg
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,-
st-link-v2.jpg
st-link-v2.jpg (21.4 KiB) Zobrazeno 1538 x
jak vidite investice nula nula nic a pritom to udela cloveku takovou radost.

jeste jsem nasel v supliku prevodnik usb-rs232-ttl
convert-ttl-rs232.jpg
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.
sestava.jpg
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.
start-sserial.jpg
initial-sserial.jpg
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.
rozbor-excel.jpg
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
rozbor.rar
(1.41 MiB) Staženo 122 x
gtocptoc.rar
(12.19 KiB) Staženo 65 x
A nakonec slibene programy.
mesa.rar
(6.28 MiB) Staženo 65 x
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
Uživatelský avatar
robokop
Site Admin
Příspěvky: 15468
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

1. 12. 2017, 2:14

jako vzdy paradni prace
Vsechna prava na chyby vyhrazena (E)
napster
Příspěvky: 110
Registrován: 3. 10. 2014, 7:00

1. 12. 2017, 2:47

Díky za další výbornej návod!
Mex
Příspěvky: 4151
Registrován: 6. 2. 2014, 10:29

1. 12. 2017, 7:52

Fupe zase bezva. :-)

K protokolu sserial: jsem sám, komu připadá, že autor toho Discovery byl při vymýšlení pořádně sjetý?
Uživatelský avatar
CZ_Pascal
Příspěvky: 754
Registrován: 14. 1. 2008, 8:24
Bydliště: Brno

1. 12. 2017, 8:06

Strašně moc děkuju :!:

Mám v plánu si s tím časem pohrát ale toho času mám tak strašně málo, že jsem hrozně rád že nám jej takhle šetříš a prokousáváš se tím za nás.

Ono takhle na stříbrným podnose to není žádná raketová věda, ale bez vysvětlení je to docela nepěkná šifra :roll: .

.... teď jenom jestli se k tomu ještě v tomhle století dostanu :cry:
Uživatelský avatar
robokop
Site Admin
Příspěvky: 15468
Registrován: 10. 7. 2006, 12:12
Bydliště: Praha
Kontaktovat uživatele:

1. 12. 2017, 8:07

no uz chapu proc se tim protokolem moc nechlubej
Vsechna prava na chyby vyhrazena (E)
fupe
Příspěvky: 566
Registrován: 27. 5. 2008, 9:10
Bydliště: Praha

2. 12. 2017, 1:34

Mex píše:Fupe zase bezva. :-)

K protokolu sserial: jsem sám, komu připadá, že autor toho Discovery byl při vymýšlení pořádně sjetý?
je to trochu levou rukou pod pravou nohou.
A to ten protokol umi prenaset 2 4 nebo 8 byte na jeden zatah. Pritom si to pri discovery povida po jednom a jednom, kterej pak sklada, aby se mohl znova jedna plus jedna byte zeptat kde jsou opravdu data.
mozna postupnej vyvoj. treba nyni uz ssserial podporuje i jiny typy dat nez jsou v manualu. napr encoder tam nezminujou, absolutni encoder a podobne. Je to k dohledani na projektu GRBL ve zdrojacich.
Ono je tam toho mozna vic, co jeste neni dotazeny, napada me treba nastaveni promenych volatile pres prikazovou radku.
kdyz ma promena vic jak 2byte tak nastavi jenom ty prvni 2. musim to ozkouset na nejnovejsim linuxcnc.
Nastaveni promenych je dobry treba k urceni typu encoderu.natvrdo se to zapise do epromky a behem prenosu uz se to neresi. je to proste v karte.
I s tou epromkou sem si zkousel hral na STM32 a krasne to umi emulovat. myslim, ze by to bylo pouzitelny.
fupe
Příspěvky: 566
Registrován: 27. 5. 2008, 9:10
Bydliště: Praha

2. 12. 2017, 1:39

CZ_Pascal píše:Strašně moc děkuju :!:

Ono takhle na stříbrným podnose to není žádná raketová věda, ale bez vysvětlení je to docela nepěkná šifra :roll: . :cry:
lepší než sudoku, vydrželo mi to měsíc, než si začalo povídat.
fupe
Příspěvky: 566
Registrován: 27. 5. 2008, 9:10
Bydliště: Praha

13. 4. 2018, 1:35

Tak jsem si s tím zase chvíli hrál.
IMAG4255-20180413-140519759.jpg
už tak nejak umím ovládat klavesnici 8x8, několik klaves najednou, diody taky blikaj, encoder encoderuje a dokonce se mi podařilo rozběhat i LCD. Vložit vlastní fonty.
Zatím je to takový polotovar, ale zdá se to pužitelný.
Bohužel jsem narazil na BUG pod uspace v lcd.c. neposíla to správný znaky v hlavičce. Obešel jsem to tak, že jsem si poupravil komponentu lcd.c, snad se podaří dohnat vyvojáře aby na to koukli.
Napadlo mě, že bych vytáhl ze skříně starý ovldač na TEENSY++ a předělal ho na stm32.
P1270092.JPG
Pak možná příjde na řadu ten velký panel, ale ještě nevím jak by měl vypadat a co by měl obsahovat.
Vidím to asi takhle.....
8x8 klaves každou s diodou pro signalizaci stavu.
tri maly encodery pro feed-override, spindle-override, rapid-override, jeden velky encoder pro jogovani. encodery maj tu vyhodu, že po restartu se vše vynuluje, když budu chtít na rozdíl od potenciometrů.
U každého maleho encoderu diody po obvodu pro signalizaci v procentech, dá se to rychle pohledem zkontrolovat. Není problém pridat i 7segmentovy display kde by byla hodnota v číslech.
klávesy i diody lze přiřadit dle libosti jednotlivym funkcím přímo pod LCNC. otestováno funguje.
Tím že to běží přes sserial s limitem 96bitů , tak je hromada informaci posílana seriově. Teda všechno je posíláno seriove, ale nekterý informace jsou v kazdem "paketu" 1000x za vteřinu a některý, jako jsou znaky na display se posílají jako stream.
1000 znaku za sekundu je dostatečně rychlé. Ani LCD display to nestíhá zobrazovat.
Tak uvidéme jak to půjde dál.
Martin
Odpovědět

Zpět na „LinuxCNC - drive pod nazvem EMC2“