GordiTron - 2024-12-13

Hello,
I have problems with the I2C communication to an ADS7828 AD converter.
I don't get any value back from the chip.
I use a Kontron chip (ARM 32SC) with Linux as the operating system.
I also use the CmpCharDevice library.

ADS7828 parameters
Address: A1 = 0 / A0 = 0 =
SD = 1 = Single End
C2 = 0 / C1= 0 / C0= 0 / Channel 0
PD1 = Internal Reference and PD0 = AD Converter ON

Here is my code:

VAR
    b_i2cAdr : BYTE := 16#48; (* Standard I2C-Adresse des ADS7828 *)
    x_Init: BOOL;(* Flag für die Initialisierung *)

    b_config_byte: BYTE;(* Konfigurationsbyte für den ADS7828 *)

    ab_cmd_buffer : ARRAY [0..0] OF BYTE; (* Buffer für den Befehl *)
    ab_data_buffer : ARRAY [0..1] OF BYTE; (* Buffer für die empfangenen Daten *)
    ui_adc_value_1 : UINT; (* Ausgelesener ADC-Wert *)

    I2C_Handle: RTS_IEC_HANDLE; (* Handle für das I2C-Device *)

    di_result_open: DINT;(* Ergebnis der Funktionsaufrufe *)
    di_result_adr: DINT;(* Ergebnis der Funktionsaufrufe *)
    di_result_wr_cmd: DINT;(* Ergebnis der Funktionsaufrufe *)  
    di_result_rd_cmd: DINT;(* Ergebnis der Funktionsaufrufe *)  
    di_result_close: DINT;(* Ergebnis der Funktionsaufrufe *)

END_VAR

//*** Init from the I2C communication port ***
IF NOT x_Init THEN
    I2C_Handle := CDOpen(szFile:= '/dev/i2c-0', dFlags:= O_RDWR, pResult:= ADR(di_result_open)); //* I2C opening *

    //*** set of the I2C address ***
    CDIoctl(hFile:=I2C_Handle , dRequest:=1795 , dParameter:=b_i2cAdr , pResult:=ADR(di_result_adr) );

    x_Init := TRUE;
END_IF

(* Hauptlogik *)
IF I2C_Handle <> 0 THEN
    (* Konfigurationsbyte setzen: Single-Ended Kanal 0, interne Referenz *)
    b_config_byte := 16#8C; (* 10001100b: AIN0, interne Referenz, Single-Ended *)
    ab_cmd_buffer[0] := b_config_byte;

    (* Schreiboperation zum Konfigurieren des Chips *)
    CDWrite(hFile:= I2C_Handle, pbyBuffer:= ADR(ab_cmd_buffer), udCount:= SIZEOF(ab_cmd_buffer), pResult:= ADR(di_result_wr_cmd));

    IF di_result_wr_cmd = 0 THEN
        (* Leseoperation, um den ADC-Wert zu erhalten *)
        CDRead(hFile:= I2C_Handle, pbyBuffer:= ADR(ab_data_buffer), udCount:= SIZEOF(ab_data_buffer), pResult:= ADR(di_result_rd_cmd));

        IF di_result_rd_cmd = 0 THEN
            (* ADC-Wert aus den Daten extrahieren *)
            ui_adc_value_1 := SHL(TO_UINT(ab_data_buffer[0]), 8) OR TO_UINT(ab_data_buffer[1]);
        ELSE
            (* Fehler beim Lesen der Daten *)
            ui_adc_value_1 := 0; (* ADC-Wert auf 0 setzen *)
        END_IF
    ELSE
        (* Fehler beim Schreiben der Konfiguration *)
        ui_adc_value_1 := 0;
    END_IF
END_IF
 

Last edit: GordiTron 6 days ago