SPI read and write

  1'''
  2SPI - SPI_read_and_write.py with synchronous mode.
  3
  4This example demonstrates how to communicate with USBDAQF1CD (master) and 25LC640 (slave) with SPI interface.
  5
  6First, it shows how to open SPI port & DIO pins and configure SPI parameters.
  7Second, write some bytes with address into EEPROM (25LC640). We have to make sure that bytes written in address is correct however read address from EEPROM (25LC640).
  8Last, close SPI port & DIO pins.
  9
 10-------------------------------------------------------------------------------------
 11Please change correct serial number or IP and port number BEFORE you run example code.
 12
 13For other examples please check:
 14    https://github.com/WPC-Systems-Ltd/WPC_Python_driver_release/tree/main/examples
 15See README.md file to get detailed usage of this example.
 16
 17Copyright (c) 2022-2025 WPC Systems Ltd. All rights reserved.
 18'''
 19
 20## WPC
 21from wpcsys import pywpc
 22
 23## Python
 24import time
 25
 26
 27def main():
 28    ## Get Python driver version
 29    print(f'{pywpc.PKG_FULL_NAME} - Version {pywpc.__version__}')
 30
 31    ## Create device handle
 32    dev = pywpc.USBDAQF1CD()
 33
 34    ## Connect to device
 35    try:
 36        dev.connect("default")  ## Depend on your device
 37    except Exception as err:
 38        pywpc.printGenericError(err)
 39        ## Release device handle
 40        dev.close()
 41        return
 42
 43    try:
 44        ## Parameters setting
 45        port = 2  ## Depend on your device
 46        datasize = 0  ## Mode: 0 = 8-bit data, 1 = 16-bit data.
 47        first_bit = 0  ## Mode: 0 = MSB first, 1 = LSB first.
 48        prescaler = 64
 49        mode = 0  ## 0 : CPOL = 0 CPHA = 0, 1 : CPOL = 0 CPHA = 1, 2 : CPOL = 1 CPHA = 0, 3 : CPOL = 1 CPHA = 1
 50
 51        if port == 1:
 52            DO_port = 2
 53            DO_index = [0]  ## CS pin
 54
 55        elif port == 2:
 56            DO_port = 3
 57            DO_index = [2]  ## CS pin
 58
 59        timeout = 3  ## [sec]
 60
 61        ## Generate random data
 62        import numpy as np
 63        addr = np.random.randint(8)  ## Generate a random address
 64        value = np.random.randint(256)  ## Generate a random value
 65
 66        WRITE = 0x02
 67        DUMMY = 0x01
 68        READ = 0x03
 69        WREN = 0x06
 70
 71        '''
 72        Take 25LC640 for example
 73        '''
 74
 75        ## Get firmware model & version
 76        driver_info = dev.Sys_getDriverInfo(timeout)
 77        print(f"Model name: {driver_info[0]}, Firmware version: {driver_info[-1]} ")
 78
 79        '''
 80        Open DO pins & SPI port & set CS(pin0) to high
 81        '''
 82
 83        ## Open pin0 with digital output
 84        err = dev.DO_openPins(DO_port, DO_index, timeout)
 85        print(f"DO_openPins in port {DO_port}, status: {err}")
 86
 87        ## Open SPI
 88        err = dev.SPI_open(port)
 89        print(f"SPI_open in port {port}, status: {err}")
 90
 91        ## Set CS(pin0) to high
 92        err = dev.DO_writePins(DO_port, DO_index, [1], timeout)
 93        print(f"DO_writePins in port {DO_port}, status: {err}")
 94
 95        '''
 96        Set SPI parameter
 97        '''
 98
 99        ## Set SPI port and set datasize to 8-bits data
100        err = dev.SPI_setDataSize(port, datasize, timeout)
101        print(f"SPI_setDataSize in port {port}, status: {err}")
102
103        ## Set SPI port and set first_bit to MSB first
104        err = dev.SPI_setFirstBit(port, first_bit, timeout)
105        print(f"SPI_setFirstBit in port {port}, status: {err}")
106
107        ## Set SPI port and set prescaler to 64
108        err = dev.SPI_setPrescaler(port, prescaler, timeout)
109        print(f"SPI_setPrescaler in port {port}, status: {err}")
110
111        ## Set SPI port and set CPOL and CPHA to 0 (mode 0)
112        err = dev.SPI_setMode(port, mode, timeout)
113        print(f"SPI_setMode in port {port}, status: {err}")
114
115        '''
116        Write data via SPI
117        '''
118
119        ## Set CS(pin0) to low
120        err = dev.DO_writePins(DO_port, DO_index, [0], timeout)
121        print(f"DO_writePins in port {DO_port}, status: {err}")
122        time.sleep(0.01)  ## delay [sec]
123
124        ## Write WREN byte
125        err = dev.SPI_write(port, [WREN], timeout)
126        print(f"SPI_write in port {port}, status: {err}")
127        time.sleep(0.01)  ## delay [sec]
128
129        ## Set CS(pin0) to high
130        err = dev.DO_writePins(DO_port, DO_index, [1], timeout)
131        print(f"DO_writePins in port {DO_port}, status: {err}")
132        time.sleep(0.05)  ## delay [sec]
133
134        '''
135        Write data via SPI
136        '''
137
138        ## Set CS(pin0) to low
139        err = dev.DO_writePins(DO_port, DO_index, [0], timeout)
140        print(f"DO_writePins in port {DO_port}, status: {err}")
141        time.sleep(0.01)  ## delay [sec]
142
143        ## Write the generated byte into the generated address
144        err = dev.SPI_write(port, [WRITE, 0x00, addr, value], timeout)
145        print(f"SPI_write in port {port}, status: {err}")
146        print(f"Write data: 0x{value:02X}")
147        time.sleep(0.01)  ## delay [sec]
148
149        ## Set CS(pin0) to high
150        err = dev.DO_writePins(DO_port, DO_index, [1], timeout)
151        print(f"DO_writePins in port {DO_port}, status: {err}")
152        time.sleep(0.05)  ## delay [sec]
153
154        '''
155        Read data via SPI
156        '''
157
158        ## Set CS(pin0) to low
159        err = dev.DO_writePins(DO_port, DO_index, [0], timeout)
160        print(f"DO_writePins in port {DO_port}, status: {err}")
161        time.sleep(0.01)  ## delay [sec]
162
163        ## Read the written byte from the generated address
164        data = dev.SPI_readAndWrite(port, [READ, 0x00, addr, DUMMY], timeout)
165        data = ['{:02x}'.format(value) for value in data]
166        print("read data :", data)
167        time.sleep(0.01)  ## delay [sec]
168
169        ## Set CS(pin0) to high
170        err = dev.DO_writePins(DO_port, DO_index, [1], timeout)
171        print(f"DO_writePins in port {DO_port}, status: {err}")
172
173        '''
174        Close DO pins and SPI port
175        '''
176
177        ## Close SPI
178        err = dev.SPI_close(port, timeout)
179        print(f"SPI_close in port {port}, status: {err}")
180
181        ## Close pin0 with digital output
182        err = dev.DO_closePins(DO_port, DO_index, timeout)
183        print(f"DO_closePins in port {DO_port}, status: {err}")
184    except Exception as err:
185        pywpc.printGenericError(err)
186
187    finally:
188        ## Disconnect device
189        dev.disconnect()
190
191        ## Release device handle
192        dev.close()
193
194
195if __name__ == '__main__':
196    main()