[elektro] nekem kínai
nemeth.tibor798 at t-online.hu
nemeth.tibor798 at t-online.hu
Mon Jul 11 09:47:34 CEST 2016
Hali!
Ok. Akkor majd sorok között de előbb a motiváció:
Valójában nem akarok PC-vel I2C-t kezelni mint végtermék. Mostanában
viszont megjelent egy rakás I2C periféria, leginkább arduino
alkalmazásokhoz és ezek csábítóan alacsony áron elérhetők e-bay-en.
Ugyanakkor csapnivaló a dokumentációjuk.
Végeredményben én is PIC-es ketyerébe akarom alakalmazni ezeket, de
ugye a PIC-nek se billentyűje se képernyője és még a fejlesztés
előtt jó lenne tiszában lenni a részletekkel. Ehhez tűnt csábító
lehetőségnek a CH341-es USB-I2C átalakító, ami szintén e-bay és
szintén rosszul dokumentált. STS21-et (az jól dokumentált ) már tudtam
vele kezelni, akkor szereztem a már meglévő ismereteimet CH341-ről, de
az sem volt zökkenőmentes.
Már PIC16C57-nél (huszon éve) használtam 24LC01 eepromot ami I2C-s. Ez
a PIC nem tud I2C, nekem kellett megírni mint bit-műveletek halmazát, de
ez nem volt probléma, tehát attól nem félek, hogy a végeredmény
elérése jelentős gondot okoz majd, de az újdonságokat PC-s
környezetben szerettem volna felderíteni.
Többi a sorok közt.
Idézet (Bánhidi István <banhidi.istvan at gmail.com>):
> Szia Tibi,
>
> Soraid között próbálok válaszolni.
>
> És ezt találtam még neked:
>
> http://www.codeforge.com/article/67495
>
> Itt sokminden van az I2C-ről de én konkrétan a CH341.DLL r-ől keresek
> infőt.
> üdv.
>
> Steve
>
> 2016.07.10. 22:09 keltezéssel, Nemeth Tibor írta:
>> Hali!
>>
>> 2016.07.07. 16:22 keltezéssel, Bánhidi István írta:
>>> Szia Tibi,
>>>
>>> Én nem követtem ezt a szálat, így csak beleugatok a közepébe.
>>>
>>> A linuxos driver forrása sem segít?
>>>
>>>
https://github.com/torvalds/linux/blob/master/drivers/usb/serial/ch341.c
>>>
>>> Steve
>>
>> Köszönöm a jó szándékot, de amit keresek nem találtam benne.
Közben
>> újra túrtam a netet, nem sok sikerrel. Eredetileg innen indulta:
>> http://www.wch.cn/downfile/24
>> Egyetlen új és kissé használható találat volt, talán mert a
németeknél
>> is probléma volt.
>> Azért megpróbálom még egyszer feltenni, most már egészen konkrét
>> kérdésemet.
>> Levelem végén van az eddigi legérthetőbb találat, de ez csak
vázlatos
>> ismertetése a CH341 I2C rutinjainak. Engem az első, a CH341StreamI2C
>> érdekel. Bár ez a nyelv nem erősségem, de amit leírtak azt értem
csak
>> kevés.
>> Amit már tudok, mert ki is próbáltam vagy egyértelmű ebből a
kevésből is:
>> 1 paraméter (iDevice)a lehetséges 16 darab csatlakoztatott CH341-et
>> azonosítja, ha csak 1 van akkor ez nulla.
>> 2 paraméter (iWriteLength)az I2C buszon CH341 által küldött byte-ok
száma
>> 3 paraméter a (iWriteBuffer) kiküldendő tartalom címe
>> 4 paraméter (iReadLength)az ellenkező irányú, olvasandó byte-ok
száma
>> 5 paramétert (oReadBuffer) a memóriacím ahova az olvasott byte-ok
>> kerülnek.
>
> Ez az eljárás, függvény, akármi csak egy wrapper szerű valami.
> Neked csak annyi a dolgod, hogy összerakod egy bufferbe a küldendő
> bájtokat, majd a beteszed paraméterként és kész.
>> Kérdés:
>> Mi az I2C cím ? Erre már tudom a választ, a 3 paraméter 1.
byte-ja.
>
> Igen, ehhez ismerni kell az I2C protokollt, hogy milyen
> bit/bájtsorrendet követel meg a proto és mit kér/ért a konkrét
eszköz.
> Bocs ha lámának nézlek, nem ez a szándékom, de ez meg van ugye?
> http://shrek.unideb.hu/~herakles/hallgato/anyagok/I2C.pdf
>
>> Mi értelme így ha 2. paraméter (iWriteLength) nulla?
>
> Állj! Ez a függvény csak leveszi a válladról azt a terhet, hogy
neked
> kelljen szórakozni a start, stop, ack, rw bitekkel.
> Te összerakod a küldendő bájtsorozatot egy bufferben, azaz konkrétan
> tudod, hogy hány bájtot fogsz kiküldeni, ide (iWriteLength) ezt az
> értéket kell átadni!
> Ezért nem értem a kérdésed, hogy miért lenne nulla küldés
esetén?!
>
> Arról szól a kérdésem, hogy a levél végén a német nyelvű
leírásban,
> felajánlja ezt a lehetőséget, már amennyire én értem ezt a nyelvet,
de
> ideidézem:
> // Nur Lesen: iWriteLength = 0;
> // Nur Schreiben: iReadLength = 0;
>> Mi van, ha a periféria nem akar annyi byte-ot küldeni, mint
>> (iReadLength), honnan tudom, hányat olvasott. Ez a hossz érték
szerinti
>> paraméter, tehát nem tudja átírni, visszaadni.
>
> Ha nem akar, akkor nem küld, de ebben az esetben, mivel a buszon
felhúzó
> van, ezért csupa 1-est fogsz olvasni.
> Tehát te vársz 2 bájtot, de az eszköz csak 1-et küld, akkor
szerintem
> veszel kettőt, a második bájt csupa 1 lesz, azaz 0xFF=255. Még sosem
> használtam i2c eszközt, de nálam is tervben van, mert össze kellene
> ütnöm még ebben az évben két nyomásmérő szenzor
általszolgáltatott
> jelfeldogozót, ezek i2c szenzorok. Már a fiókban lapulnak, de egyéb
> elfoglaltságaim miatt, még nem jutottam hozzájuk, és én pic-kel
fogom
> kezelni őket.
>
>> Mi történik valójában I2C buszon? Start,Stop,Ack
>
> Ez egy alap kérdés és az i2c busz lelkivilágára gondolsz vagy a
konkrét
> esetedben mit csinál a ch341 api-ja az i2c vonalakkal?! Utóbbi.
> Pl:
> CH341StreamI2C(0,3,aa,4,bb)
> Ekkor feltételezésem szerint az első (0 indexű) Ch341 I2C buszán,
>
> aa első bájtjával, mint I2C címmel , rw=write mellett végrehajt egy
> START-ot majd aa-ból még további két byte-ot kiküld,
> Vajon ad-e STOP-ot ezután? Mi van ha nem volt Ack?
> Majd aa első byte-jával mint I2C címmel, rw=Read végrehajt egy
START-ot
> majd 4 byte-ot olvasni próbál, clockol,
> és beteszi bb-be. Gondolom itt jön egy STOP.
>
> Az a helyzet, hogy gyakran arduino projektekből próbálom visszafejteni
> I2C cuccok kezelését és ott pl StartTransmission , majd write majd
> EndTransmission (vagy vm. hasonlő) szerkezetben, több programlépésben
> hajt végre egy átvitelt és ha ezt akarom lemodellezni, pontosabban
> kellen ismertnem CH341.DLL viselkedését.
>
>> Üdv
>> Németh Tibor
>>
>> // ***********
>> // *** I2C ***
>> // ***********
>> //
>> // CH341A ist immer MASTER
>> //
>> // CH341StreamI2C(): Universelles Lesen und/oder Schreiben über I2C
>> // Nur Lesen: iWriteLength = 0;
>> // Nur Schreiben: iReadLength = 0;
>> Function CH341StreamI2C(iIndex:cardinal; iWriteLength:cardinal;
>> iWriteBuffer:pvoid; iReadLength:cardinal; oReadBuffer:pvoid
>> ):boolean;stdcall; external 'CH341DLL.DLL';
>>
>> // Lesen und Schreiben von IC mit interner Speicheradresse
>> // iDevice: 0..127 = I2C-Geräteadresse (device address)
>> // iAddr: Speicheradresse; Dies ist NICHT die I2C-Geräteadresse!
>> Function CH341ReadI2C(iIndex:cardinal; iDevice: byte; iAddr: byte;
>> oByte: pbyte ):boolean; Stdcall; external 'CH341DLL.DLL';
>> Function CH341WriteI2C(iIndex:cardinal; iDevice :byte; iAddr: byte;
>> iByte: byte ):boolean; Stdcall; external 'CH341DLL.DLL';
>> // I2C-EEPROM lesen und schreiben
>> type EEPROM_TYPE
>>
=(ID_24C01,ID_24C02,ID_24C04,ID_24C08,ID_24C16,ID_24C32,ID_24C64,ID_24C128,ID_24C256,ID_24C512,ID_24C1024,ID_24C2048,ID_24C4096);
>> Function CH341ReadEEPROM(iIndex:cardinal; iEepromID:EEPROM_TYPE;
>> iAddr:cardinal; iLength:cardinal; oBuffer:Pbytearray ):boolean;stdcall;
>> external 'CH341DLL.DLL';
>> Function CH341WriteEEPROM(iIndex:cardinal; iEepromID:EEPROM_TYPE;
>> iAddr:cardinal; iLength:cardinal; iBuffer:pbytearray ):boolean;stdcall;
>> external 'CH341DLL.DLL';
>>
>> -----------------------------------------
>> elektro[-flame|-etc]
>
> ----------------------------------------- elektro[-flame|-etc]
More information about the Elektro
mailing list