1'''
2SPI - SPI_read_and_write.py with synchronous mode.
3
4This example demonstrates how to communicate with USBDAQF1D (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.USBDAQF1D()
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()