I2C write and read

  1'''
  2I2C - I2C_write_read.py with asynchronous mode.
  3
  4This example demonstrates how to communicate with USBDAQF1TD. (master) and 24C08C (slave) with I2C interface.
  5
  6First, it shows how to open I2C port and configure I2C parameters.
  7Second, write some bytes with address into EEPROM (24C08C). We have to make sure that bytes written in address is correct however read address from EEPROM (24C08C).
  8Last, close I2C port
  9
 10The sensor used in this example is a 24C08C expecially for Two-wore Serial EEPROM.
 11
 12-------------------------------------------------------------------------------------
 13Please change correct serial number or IP and port number BEFORE you run example code.
 14
 15For other examples please check:
 16    https://github.com/WPC-Systems-Ltd/WPC_Python_driver_release/tree/main/examples
 17See README.md file to get detailed usage of this example.
 18
 19Copyright (c) 2022-2025 WPC Systems Ltd. All rights reserved.
 20'''
 21
 22## WPC
 23from wpcsys import pywpc
 24
 25## Python
 26import asyncio
 27import sys
 28sys.path.insert(0, 'src/')
 29
 30
 31async def main():
 32    ## Get Python driver version
 33    print(f'{pywpc.PKG_FULL_NAME} - Version {pywpc.__version__}')
 34
 35    ## Create device handle
 36    dev = pywpc.USBDAQF1TD()
 37
 38    ## Connect to device
 39    try:
 40        dev.connect("default")  ## Depend on your device
 41    except Exception as err:
 42        pywpc.printGenericError(err)
 43        ## Release device handle
 44        dev.close()
 45        return
 46
 47    try:
 48        ## Parameters setting
 49        port = 1  ## Depend on your device
 50        mode = 0
 51        device_address = 0x50  ## 01010000
 52
 53        ## Generate random data
 54        import numpy as np
 55        word_address = np.random.randint(8)  ## Generate a random address
 56        value = np.random.randint(256)  ## Generate a random value
 57
 58        '''
 59        Take 24C08C for example
 60        '''
 61
 62        ## Get firmware model & version
 63        driver_info = await dev.Sys_getDriverInfo_async()
 64        print(f"Model name: {driver_info[0]}, Firmware version: {driver_info[-1]} ")
 65
 66        '''
 67        Open I2C port
 68        '''
 69
 70        ## Open I2C
 71        err = await dev.I2C_open_async(port)
 72        print(f"I2C_open_async in port {port}, status: {err}")
 73
 74        '''
 75        Set I2C parameter
 76        '''
 77
 78        ## Set I2C port and set clock rate to standard mode
 79        err = await dev.I2C_setClockRate_async(port, mode)
 80        print(f"I2C_setClockRate_async in port {port}, status: {err}")
 81
 82        '''
 83        Write data via I2C
 84        '''
 85
 86        ## Write WREN byte
 87        err = await dev.I2C_write_async(port, device_address, [word_address, value])
 88        print(f"I2C_write_async in port {port}, status: {err}")
 89        print(f"write data: 0x{value:02X}")
 90
 91        '''
 92        Read data via I2C
 93        '''
 94
 95        err = await dev.I2C_write_async(port, device_address, [word_address])
 96        print(f"I2C_write_async in port {port}, status: {err}")
 97
 98        data = await dev.I2C_read_async(port, device_address, 1)
 99        print(f"read data: 0x{data[0]:02X}")
100
101        '''
102        Close I2C port
103        '''
104
105        ## Close I2C
106        err = await dev.I2C_close_async(port)
107        print(f"I2C_close_async in port {port}, status: {err}")
108    except Exception as err:
109        pywpc.printGenericError(err)
110
111    finally:
112        ## Disconnect device
113        dev.disconnect()
114
115        ## Release device handle
116        dev.close()
117
118
119def main_for_spyder(*args):
120    if asyncio.get_event_loop().is_running():
121        return asyncio.create_task(main(*args)).result()
122    else:
123        return asyncio.run(main(*args))
124
125
126if __name__ == '__main__':
127    asyncio.run(main())  ## Use terminal
128    # await main()  ## Use Jupyter or IPython(>=7.0)
129    # main_for_spyder()  ## Use Spyder