From fc64706b655a99c64ed12409a66382746864ccc7 Mon Sep 17 00:00:00 2001 From: root Date: Fri, 28 Jan 2022 18:09:02 +0000 Subject: [PATCH] Add locking in spi --- compLib/Spi.py | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/compLib/Spi.py b/compLib/Spi.py index d585365..a370b20 100644 --- a/compLib/Spi.py +++ b/compLib/Spi.py @@ -1,5 +1,6 @@ import importlib -from threading import Thread, Lock +from threading import Thread +import multiprocessing from enum import IntEnum import time import sys @@ -8,13 +9,14 @@ from compLib.LogstashLogging import Logging SPI_BUS = 1 SPI_DEVICE = 2 -SPI_SPEED = 1000000 +SPI_SPEED = 4000000 SPI_BUFFER_SIZE = 32 SPI_HEALTH = True # For development purposes spi_found = importlib.util.find_spec("spidev") is not None spi = None +spi_lock = multiprocessing.Lock() if spi_found: import spidev spi = spidev.SpiDev() @@ -23,8 +25,6 @@ if spi_found: spi.mode = 0 spi.bits_per_word = 8 - spi_mutex = Lock() - class Register(IntEnum): IDENTIFICATION_MODEL_ID = 1, IDENTIFICATION_MODEL_REV_MAJOR = 2, @@ -115,13 +115,16 @@ class Spi(object): return [] * SPI_BUFFER_SIZE write_reg = tx_buffer[1] + tx_buffer_copy = tx_buffer.copy() - spi.xfer(tx_buffer) - rx_buffer = spi.xfer([0] * SPI_BUFFER_SIZE) - - if rx_buffer[1] != write_reg: - Logging.get_logger().error(f"SPI error during read/write of register {write_reg}!") - return [0] * SPI_BUFFER_SIZE + with spi_lock: + spi.xfer(tx_buffer) + rx_buffer = spi.xfer([0] * SPI_BUFFER_SIZE) + + if rx_buffer[1] != write_reg: + Logging.get_logger().error(f"SPI error during read/write of register {write_reg}! Retrying automatically") + time.sleep(0.01) + return Spi.transfer(tx_buffer_copy) return rx_buffer @@ -202,7 +205,7 @@ class Spi(object): def health_check_loop(): while SPI_HEALTH: Spi.health_check() - time.sleep(0.5) + time.sleep(5) @staticmethod def get_version():