import spidev, time import numpy as np from plot_stamps import plot_stamps bitrate = 11000000 print(f'rate {bitrate/1e6}MBit/s bit period should be {1000000000/bitrate}ns') spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = bitrate spi.mode = 0b10 pck_len = 64 stamp_count = 10000 stamps = np.zeros(stamp_count) test_pck = bytearray(pck_len) for b in range(len(test_pck)): test_pck[b] = b + 1 print(test_pck) bonked = False bonk_count = 0 for i in range(stamp_count): # if bonked: # break ret = spi.xfer(test_pck) stamps[i] = time.perf_counter() * 1e6 start = -1 for j in range(len(ret)): if start == -1: if ret[j] == 0: start = j continue else: if ret[j] != j - start: # print(f'BONK at {i} char {j} {start} {ret[j]}') # print(ret) bonk_count += 1 bonked = True break spi.close() print(f"bonk {bonk_count} / {stamp_count}") plot_stamps(stamps, stamp_count, pck_len, bonk_count / stamp_count) # 1Mbit seems solid, # 2.5Mbit and we have very occasional starvation # 5Mbit and we have at least one bad packet every run (1/1000?) # 5Mbit with more F_CPU (250MHz) it is obviously improved (1/5000?) # 10Mbit at 250MHz we are back to ~ (1/2000) starvations,