Linuxcnc vs SSERIAL

Linuxcnc vs SSERIAL

Příspěvekod fupe » 01 pro 2017, 14: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 677 krát


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 677 krát


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 viewtopic.php?f=34&t=19325&start=15#p196133
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) 24 krát

gtocptoc.rar
(12.19 KiB) 22 krát


A nakonec slibene programy.
mesa.rar
(6.28 MiB) 28 krát

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
fupe
 
Příspěvky: 541
Registrován: 27 kvě 2008, 21:10
Bydliště: Praha

Re: Linuxcnc vs SSERIAL

Příspěvekod robokop » 01 pro 2017, 15:14

jako vzdy paradni prace
RoBoKop
Vsechna prava na chyby vyhrazena (E)
Uživatelský avatar
robokop
Site Admin
 
Příspěvky: 14858
Registrován: 10 črc 2006, 12:12
Bydliště: Praha

Re: Linuxcnc vs SSERIAL

Příspěvekod napster » 01 pro 2017, 15:47

Díky za další výbornej návod!
napster
 
Příspěvky: 110
Registrován: 03 říj 2014, 19:00

Re: Linuxcnc vs SSERIAL

Příspěvekod Mex » 01 pro 2017, 20: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ý?
Mex
 
Příspěvky: 3739
Registrován: 06 úno 2014, 23:29

Re: Linuxcnc vs SSERIAL

Příspěvekod CZ_Pascal » 01 pro 2017, 21: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
CZ_Pascal
 
Příspěvky: 739
Registrován: 14 led 2008, 21:24
Bydliště: Brno

Re: Linuxcnc vs SSERIAL

Příspěvekod robokop » 01 pro 2017, 21:07

no uz chapu proc se tim protokolem moc nechlubej
RoBoKop
Vsechna prava na chyby vyhrazena (E)
Uživatelský avatar
robokop
Site Admin
 
Příspěvky: 14858
Registrován: 10 črc 2006, 12:12
Bydliště: Praha

Re: Linuxcnc vs SSERIAL

Příspěvekod fupe » 02 pro 2017, 14: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: 541
Registrován: 27 kvě 2008, 21:10
Bydliště: Praha

Re: Linuxcnc vs SSERIAL

Příspěvekod fupe » 02 pro 2017, 14: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: 541
Registrován: 27 kvě 2008, 21:10
Bydliště: Praha

Re: Linuxcnc vs SSERIAL

Příspěvekod fupe » 13 dub 2018, 13: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
fupe
 
Příspěvky: 541
Registrován: 27 kvě 2008, 21:10
Bydliště: Praha


Zpět na LinuxCNC - drive pod nazvem EMC2

Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 2 návštevníků

smishek.com