1 Wire communication

Hallo,

Voor een nieuw project moet ik gaan communiceren met de DS2430A 1 wire chip.
Deze zit ingebouwd in een sensor en stuurt digitale signalen uit.

Deze signalen wil ik uitlezen met een microcontroller en omzetten in een 4-20mA signaal.

Heeft iemand enige ervaring met het 1 wire communiceren?

Hier de link naar het datasheet van de DS2430A: https://datasheets.maximintegrated.com/en/ds/DS2430A.pdf

Bedankt!

Alleen met de overbekende DS18*20 temperatuur sensoren. Die werken prima, ook met een aantal op één bus. Voor het OneWire-deel bestaan goede libraries.

Met gebruik van parasitaire power heb ik overigens geen ervaring.

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Een nieuw project en je gebruikt een component wat "Not recommended is for new designs". Dat lijkt me niet handig.

Ik heb wel eens wat met een one-wire chip gedaan, denk ik 20 jaar terug of zo, dat waren van die iButton dingetjes en temperatuur sensors geloof ik.
Als er meerdere devices aan de zelfde lijn hangen moet je een arbitrage doen waarbij het device zijn 48-bit uniek nummer gebruikt om te enumereren (daarom hebben ze allemaal een uniek nummer). Best nog een ingewikkeld stukje om dat allemaal goed te krijgen.

Of deze one-wire dingen op dezelfde manier werken weet ik niet, kan er zo snel niets van in de spec terugvinden.

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.

Arduino heeft een lib voor 1-wire communicatie, 'OneWire.lib' :-) Ik heb ze gebruikt voor een DS18S20 thermometer chip. Werkt perfect, maar naar eeprom weet ik niet, zal je wat moeten aanpassen.

Je kan door de code in de lib bladeren om te zien hoe 'zij' het doen.

Groetjes,
eSe

I am an expert of electricity. My father occupied the chair of applied electricity at the state prison.

Een aantal dagen verder en ik ben zover dat ik de complete EEPROM kan uitlezen.

Ik kan bijvoorbeeld via onderstaande code Family code uitlezen.

pic basic code:

OWrite DQ, 1, [$33]
ORead DQ, 0, [Dummy1,Dummy2,Dummy3,Dummy4,Dummy5,Dummy6,Dummy7,Dummy8, Dummy9]
HRSOut Hex2 Dummy1,",",Hex2 Dummy2,",",Hex2 Dummy3,",",Hex2 Dummy4,",",Hex2 Dummy5,",",Hex2 Dummy6,",",Hex2 Dummy7,",",Hex2 Dummy8,10,13

Ook het uitlezen van andere info in de EEPROM gaat goed.

Echter, ik wil het status register van de DS2430A uitlezen.
Ik weet dat het een oude semiconducter is maar dat is nu eenmaal zo, daar heb ik geen invloed op.

Onderstaand het blokschema voor het uitlezen van het status register.

Ik heb ondertussen al van alles geprobeerd maar ik krijg geen data er uit waar ik iets mee kan.
Heb al verschillende tools gebruikt om de juiste CRC code te genereren maar ik krijg het niet voor elkaar.

pic basic code:


Device 16F877                                   ; We gebruiken een PIC16F877A Microcontroller
Xtal 4                                          ; Kristal is 4 Mhz


                                               
Config  WDT_OFF,_                               ; instellingen van alle Fuses
        PWRTE_ON,_
        LVP_OFF,_
        HS_OSC 

All_Digital true                               ; Geen analoge waarden

; Definieren
Declare Hserial_Baud 9600                       ; set baudrate op 9600
Declare Hserial_RCSTA $90                       ;  << VUL DEZE WAAREN IN MET HET PROGRAMMA
Declare Hserial_TXSTA $24                       ;   <<         PIC multi CALC 

Declare Hserial_Clear = On                      ; reset buffer bij een overflow? 

; Logische constanten
Symbol AAN = 1                                  ; Het symbool AAN heeft de waarde "1"
Symbol UIT = 0                                  ; Het symbool UIT heeft de waarde "0"

; Alegemene constanten

Symbol Contactdender = 20            
Symbol DQ = PORTA.1
Symbol LED = PORTA.0

; Commando's
Symbol SkipRom = $CC
Symbol ReadMemory = $F0
Symbol ReadRom = $33

Symbol Temp_const = $80
Symbol EEPROM_Ver = $81
Symbol Ext_Res = $82
Symbol Day = $84
Symbol Month = $85
Symbol Year = $86
Symbol Date = $84, $85, $86
Symbol Max_Load = $8F
Symbol Min_Load = $91
Symbol Metric_Size = $8B

; Variabelen
Dim Result As Word
Dim Commando As Byte

Dim Data1 As Byte 
Dim Data2 As Byte 
Dim Data3 As Byte 
Dim Data4 As Byte 
Dim Data5 As Byte 
Dim Data6 As Byte 
Dim Data7 As Byte 
Dim Data8 As Byte

Dim BData1 As Bit
Dim BData2 As Bit
Dim BData3 As Bit
Dim BData4 As Bit
Dim BData5 As Bit
Dim BData6 As Bit
Dim BData7 As Bit
Dim BData8 As Bit
Dim BData9 As Bit
Dim BData10 As Bit
Dim BData11 As Bit
Dim BData12 As Bit
Dim BData13 As Bit
Dim BData14 As Bit
Dim BData15 As Bit
Dim BData16 As Bit
Dim BData17 As Bit
Dim BData18 As Bit
Dim BData19 As Bit
Dim BData20 As Bit
Dim BData21 As Bit
Dim BData22 As Bit
Dim BData23 As Bit
Dim BData24 As Bit
Dim BData25 As Bit
Dim BData26 As Bit
Dim BData27 As Bit
Dim BData28 As Bit
Dim BData29 As Bit
Dim BData30 As Bit
Dim BData31 As Bit
Dim BData32 As Bit
Dim BData33 As Bit
Dim BData34 As Bit
Dim BData35 As Bit
Dim BData36 As Bit
Dim BData37 As Bit
Dim BData38 As Bit
Dim BData39 As Bit
Dim BData40 As Bit
Dim BData41 As Bit
Dim BData42 As Bit
Dim BData43 As Bit


Clear                                           ; Alle variabele op 0 zetten
Cls                                             ; LCD scherm wissen
                                                
DelayMS 1000                                    ; Stabilisering systemen


;******************************************************************************************************************************************************
; Start van Hoodfprogramma
;******************************************************************************************************************************************************

Start:                                          ; Programma "Start" begint 

HRSOut "Stuur commando!",10,13                  ; Microcontroller stuurt serieel "Stuur commando" uit

GoTo Doorgaan                                   ; Einde programma, ga naar programma "Doorgaan"

Doorgaan:                                       ; Programma "Doorgaan" begint
        Repeat                                  ; Herhaal onderstaan programma 
            HRSIn Dec1 Commando                 ; Waarde die serieel binnekomt aan variabele "Commando" geven 
        Until Commando >= 1 And Commando <= 10   ; Totdat de waarde van variabele "Commando" groter is als 1 en kleiner dan 6

Select Commando                                 ; Selecteer de variabele "Commando"

    Case 1:
        High LED
            OWrite DQ, 1, [SkipRom, ReadMemory, Day]
            ORead DQ, 0, [Data1]
                HRSOut "Dag van kalibratie: ", Dec Data1,10,13
        Low LED
    
    Case 2:
        High LED
            OWrite DQ, 1, [SkipRom, ReadMemory, Month]
            ORead DQ, 0, [Data1]
                HRSOut "Maand van kalibratie: ", Dec Data1,10,13
        Low LED
    
    Case 3:
        High LED
            OWrite DQ, 1, [SkipRom, ReadMemory, Year]
            ORead DQ, 0, [Data1, Data2]
            Result = Data2 * 256 + Data1
                HRSOut "Jaar van kalibratie: ", Dec Result,10,13
        Low LED
    
    Case 4: 
        High LED
            OWrite DQ, 1, [SkipRom, ReadMemory, Date]
            ORead DQ, 0, [Data1, Data2, Data3, Data4]
            Clear Result
            Result = Data4 * 256 + Data3 
                HRSOut "Datum van kalibratie: ", Dec Data1,"-", Dec Data2,"-", Dec Result,10,13
        Low LED
        
    Case 5:
        High LED
            OWrite DQ, 1, [SkipRom, ReadMemory, Max_Load]
            ORead DQ, 0, [Data1, Data2]
            Clear Result
            Result = Data2 * 256 + Data1 
                HRSOut "Max Load: ", Dec Result, " KN",10,13
        Low LED
        
    Case 6:
        High LED
            OWrite DQ, 1, [SkipRom, ReadMemory, Min_Load]
            ORead DQ, 0, [Data1, Data2]
            Clear Result
            Result = Data2 * 256 + Data1 
                HRSOut "Min Load: ", Dec Result, " KN",10,13
        Low LED
        
    Case 7:
        High LED
            OWrite DQ, 1, [SkipRom, ReadMemory, Metric_Size]
            ORead DQ, 0, [Data1, Data2]
                HRSOut "Afmeting: ", Dec Data2," mm",10,13
        Low LED
        
    Case 8:
        High LED 
            OWrite DQ, 1, [SkipRom, $66]
            ORead DQ, 0, [Data1]
                HRSOut Bin Data1,10,13
        Low LED
        
    Case 9:                                       
        High LED 
            OWrite DQ, 5, [SkipRom, $66, $B8]
            DelayMS 25
            ORead DQ, 4, [BData1, BData2, BData3, BData4, BData5, BData6, BData7, BData8, BData9, BData10, BData11, BData12, BData13, BData14, BData15, BData16, BData17, BData18, BData19, BData20, BData21, BData22, BData23, BData24, BData25, BData26]
            ORead DQ, 4, [BData27, BData28, BData29, BData30, BData31, BData32, BData33, BData34, BData35, BData36, BData37, BData38, BData39, BData40, BData41, BData42, BData43]
                HRSOut Bin BData1,",", Bin BData2,",", Bin BData3,",", Bin BData4,",", Bin BData5,",", Bin BData6,",", Bin BData7,",", Bin BData8," | ",10,13
                HRSOut Bin BData9,",", Bin BData10,",", Bin BData11,",", Bin BData12,",", Bin BData13,",", Bin BData14,",", Bin BData15,",", Bin BData16," | ",10,13
                HRSOut Bin BData17,",", Bin BData18,",", Bin BData19,",", Bin BData20,",", Bin BData21,",", Bin BData22,",", Bin BData23,",", Bin BData24," | ",10,13
                HRSOut Bin BData25,",", Bin BData26,",*", Bin BData27,",", Bin BData28,",", Bin BData29,",", Bin BData30,",", Bin BData31,",", Bin BData32," | ",10,13
                HRSOut Bin BData33,",", Bin BData34,",", Bin BData35,",", Bin BData36,",", Bin BData37,",", Bin BData38,",", Bin BData39,",", Bin BData40," | ",10,13
                HRSOut Bin BData41,",", Bin BData42,",", Bin BData43," | ",10,13
        Low LED

 EndSelect
 
 GoTo Doorgaan

End

Iemand enig idee?
Bedankt!

Voor CRC berekeningen moet je wel de juiste polynomial gebruiken, anders werkt 't niet...

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Polynomial was X8 + X5 + X4 + X0 geloof ik.

Als ik daarmee de CRC uitreken over $66 of $CC, $66 kom ik op $B8 of $41 uit.

Bij beide waardes krijg ik onjuiste data terug.

EricP

mét CE

Polynomial was X8 + X5 + X4 + X0 geloof ik.

Geloven doe je in de kerk. Zo je wilt moskee. Als je software bakt, dan WEET je dingen. Ofwel: datasheet lezen en de juiste polynoom pakken.
Overigens schijnt dit chippie niet zoveel met CRCs te doen.

Geen zin om pic-ding code door te gaan spitten, maar... 3 tellen door de datasheet heen browsen zegt dat je moet beginnen met een reset, ding antwoordt met een PRESENCE pulse. Dan doe je een SKIP ROM (of een MATCH ROM met identificatie als dat je beter past). Dan kun je een READ STATUS doen. Waarna je een KEY, 0x00, schijnt te moeten sturen. Daarop krijg je je status register terug.
Ik zie nergens staan (dat kan ook betekenen dat ik eroverheen lees :) ) dat je ergens zelf CRCs moet genereren. De checks zou ik waar mogelijk maar ff laten zitten tot je het min of meer draaiend hebt. Niet teveel 'uitdagingen' tegelijk.

Bedankt voor de reacties:)

Deze chip werkt toch met een CRC voor het opvragen van het status register.

Als ik de CRC over het commando $66 bereken komt er $B8 uit.

Als ik deze CRC meestuur krijg ik ook data terug. Iedere keer als ik een onjuiste CRC meestuur is het resultaat wat ik terug krijgt allemaal 1.

Echter, met het commando $CC, $66, $B8 krijg ik alleen maar nullen terug.

Iemand een idee wat ik verkeerd kan doen?

EricP

mét CE

Op het gevaar af dat ik nu een draai om m'n oren krijg omdat jij de DS blijkbaar wel helemaal doorgespit hebt en ik niet :+ : waar staat dat??
Als ik op CRC zoek in de door jou gelinkte datasheet, dan kom ik dat vooral in de hoek van de 64-bit-ROM tegen. Verder eigenlijk nergens...

Dus om de discussie weer ff synchroon te trekken (dat praat zoveel makkelijker): waar staat dat?

Klopt Eric.

Echter in de sensoren die ik wil uitlezen zit een ASIC chip die voor de communicatie het dallas ds2430a protocol gebruikt.

De datasheets zijn nagenoeg hetzelfde op een paar kleine vershillen na.

Eerder in dit topic heb ik een blokschema gestuurd. Hierbij nog enkele stukjes die over het uitlezen van het Status register gaan.

Handig, als na twee weken blijkt dat het helemaal niet om de chip gaat die je opgaf, maar een compleet andere!... :(
(beter meteen aangeven welke chip je gebruikt, dat voorkomt nodeloze en verkeerde posts...)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Arco,

Denk dat het niet nodig is om jezelf hier kwaad om te maken.

Ik heb bijna geen documentatie over deze sensoren, bijna alles moet ik dus zelf uitzoeken. Geen probleem, dat is juist het mooie er aan.

Tot een paar dagen geleden dacht ik ook dat het met de validation key moest gebeuren zoals aangegeven in het datasheet van de DS2430A.

Iedere dag word ik hier wat wijzer over, echter loop ik op het status register nu echt vast. Daarom kan ik alle hulp van jullie gebruiken.

Excuus voor de foute info.

EricP

mét CE

Check. Vandaar de verwarring. Leuk, zo'n ASIC uitspitten. Zeker als de documentatie onvolledig is en je maar moet hopen dat het ding doet wat er gespecificeerd is...

Afijn, als je een ongeldige CRC stuurt, zegt je spec dat het ding in idle gaat. Aangezien 1-Wire met een pull-up iets werkt, zou je dan allemaal eentjes verwachten. Dat lijkt correct te zijn.

In deze context zou mijn insteek zijn (zeker als je weet wat de waarde die je terug krijgt zou moeten zijn): probeer 256 verschillende CRCs. Dan weet je gelijk welke wat zinnigs opleveren. Beetje reverse engineering dus...

Dat dacht ik dus ook.

Heb ik gedaan en ben er op het moment vrij zeker van dat de juiste CRC B8 moet zijn.

Heb nu de code zo gemaakt:

pic basic code:

Dim Bdata as bit
OWrite DQ, 1, [SkipRom, ReadStatus, CRC]
            While 1 = 1
            ORead DQ, 4, [Bdata]
            HRSOut Bin1 Bdata,","
            Wend

Ik verwacht 43 bits data van het status register.

Als ik nu kijk wat ik serieel terug krijg zijn de eerste 43 bits 0 en alles wat daarna kijkt 1.

Lijkt alsof hij dus wel iets doet met de 1e 43 bits maar ze zijn allemaal 0.

Nogmaals, het uitlezen van de EEPROM gaat goed en stabiel. Ik weet dus niet goed waar ik het probleem moet zoeken.

EricP

mét CE

Ja, en wat gebeurt er met de andere 255 mogelijkheden voor CRC? Leveren die alle 255 alleen maar 'eentjes' op??

Verder zie ik in je spec nog wat met een 'pulse train'. Geen idee wat het doet en hoe je dat genereert, maar het lijkt erop dat het chippie minstens 12mS 1.8432MHz wil zien op z'n 1-Wire line. Geen idee waarom, hoezo enz. Maar dat is mijn interpretatie. Ik kan me voorstellen als daar wat rammelt, je status register niet geset is en je dus alleen maar 0-en terug krijgt. Ik zie niks terug wat dat doet in je code (en het is geloof ik ook niet echt 1-Wire standaard, maar wie ben ik om dat te roepen?)

Ik denk dat je gelijk hebt Eric.

Ik ben nu een leeg Status register aan het uitlezen vandaar dat alle waarden 0 zijn.

Eerst moet ik het commando geven om een conversion te starten.

Hoe kan ik in PicBasic een mooie pulse train van 1.8432MHz genereren?
Ben nu met het Freqout commando aan het stoeien maar krijg nog geen mooie frequenties.
Heb ergens gelezen dat dit commando maar max 32KHz kan realiseren.

Hoe kan ik in PicBasic een mooie pulse train van 1.8432MHz genereren?

Dat kan niet, is veel te hoog. Zeker niet met zo'n oude pic op 4MHz)
Wel kunnen sommige pics de oscillatorfrequentie / 4 geven. Dan moet je dus een 7.3728MHz kristal gebruiken.

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Bedankt Arco!

Ga nu kijken of het mogelijk is om dit softwarematig in Proton te doen.
Anders is het wellicht hardware-matig mogelijk.

Softwarematig kan nooit; je kunt uit een 4MHz klok natuurlijk nooit een 1.8432MHz klok maken. (omdat ze niet deelbaar zijn door elkaar)

Arco - "Simplicity is a prerequisite for reliability" - www.arcovox.com

Nee dat begrijp ik.
Heb het 7.3728Mhz kristal in bestelling staan.

Hardwarematig een component zoeken wat de klokfrequentie kan delen is dan de volgende stap.

EricP

mét CE

Hmz... Beroerde interfacing. Ik vind het in elk geval een raar concept.
Er zal wel ergens wat mee geclocked worden.

Als je nou gewoon eens lomp doet... ze speccen (minimaal) 12mS op die frequentie... Als je nou eens telt hoeveel cycles dat zijn en daar (op een lagere) frequentie eens ruim boven gaat zitten... En dan eens kijkt wat er gebeurt? Ja, je zit buiten spec, maar het zou me niks verbazen als het gewoon werkt. Niet prima voor productie (tenzij je meer van die ASIC weet en dus kan concluderen dat het zo ook kan), maar wel prima voor engineering / experimentje.

Ik heb nog steeds gen antwoord op wat de andere CRC opleveren. We *denken* nu wel te weten wat er aan de hand is, maar je kunt je zelf aardig het bos in redeneren als je iets aanneemt en dat niet op z'n minst 'pi maal duim' controleert.

Ik weet niet hoe het in pic-ding-basic kan, maar je kunt natuurlijk iets klussen met een 1.8MHz Xtal en een hardware switch die de 1-Wire ff op dat Xtal hangt (ofwel: 1-Wire is al pull-up, dus als je het pic-ding eraf laat blijven en de ASIC blijft er ook af, dan kun je 'm met een open collector (open drain) achtig iets wel laag krijgen en laten pulsen). Nog iets verzinnen met het juiste moment zodat je geen hele korte puls in het begin krijgt, maar dat lijkt me wel te doen.

Eric,

Een lagere frequentie is zeker het proberen waard.
Uiteindelijk zal ik de snelheid wel zo hoog mogelijk willen hebben. Maar dan kan ik in ieder geval al wat proberen.

Wat de CRC's betreft, ik heb alle CRC's die ik kon bedenken geprobeerd en bij allemaal was het resultaat 1111111111.
De CRC B8 was de enige waarbij het resultaat afweek (0000000000).

Ga er dus even van uit dat deze juist is. Kan dit verder niet bewijzen omdat het toch veel uitzoeken en proberen is zonder complete datasheets.

EricP

mét CE

Ik denk ook wel dat je gelijk hebt hoor. Maar ik heb met me ook wel eens suf zitten zoeken naar zoiets, dus ik neem het niet meer zo makkelijk aan. Dat heeft al veel te vaak veel te veel uren gekost.
Controle is natuurlijk niet zo heel moeilijk in deze: maak een loopje waarin je alle CRC probeert en laat je software ff uitspugen waar wat anders dan 0xFF terug komt. Het pic-ding doet het werk en jij kunt koffie leuten :).

Snelheid zo hoog mogelijk, ach... hoe vaak wil je een status register uitlezen? Is het de moeite waard? - aangenomen dat het OK is om buiten spec van het chippie te werken.

Nou is 1-Wire ff te lang gelden voor mij, maar aangenomen (en dat mag jij dus controleren! :) ) dat je de most significant bit eerst op de lijn zet: idle is de bus 'hoog', elke 0x55 die je stuurt heeft 8 bits en daarmee 4 cylces. Je 1.8MHz voor 12mS zou volgens mijn natte vinger iets van 22000 cycles moeten zijn (je mag het zelf precies uitrekenen). Per 0x55 die je TXed doe je er 4. Waarop diezelfde natte vinger zegt dat je dat 5500 keer moet doen. Het was minimaal 12mS, het is de natte vinger, dus doe het eens 5700x... (of je rekent het netjes uit :) ) en kijk wat er dan gebeurt.
Het is lomp en buiten spec. Je krijgt natuurlijk geen mooie, regelmatige blokgolf - daarvoor zal de software implementatie wel voor zorgen, maar je hebt wel al je cycles. En wellicht is het 'good enough' om in elk geval te kunnen testen (en later te zien hoe je het netjes oplost).