Skip to content

Commit a30930b

Browse files
committed
Enable CS "active-high" device support
Reference adafruit/Adafruit_CircuitPython_BusDevice#71 Add a new parameter cs_active_value for devices that require CS to use "active high" logic.
1 parent 9689022 commit a30930b

File tree

4 files changed

+10
-6
lines changed

4 files changed

+10
-6
lines changed

shared-bindings/adafruit_bus_device/SPIDevice.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
//|
4949
//| :param ~busio.SPI spi: The SPI bus the device is on
5050
//| :param ~digitalio.DigitalInOut chip_select: The chip select pin object that implements the DigitalInOut API.
51+
//| :param bool cs_active_value: Set to true if your device requires CS to be active high. Defaults to false.
5152
//| :param int extra_clocks: The minimum number of clock cycles to cycle the bus after CS is high. (Used for SD cards.)
5253
//|
5354
//| Example::
@@ -73,10 +74,11 @@
7374
STATIC mp_obj_t adafruit_bus_device_spidevice_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
7475
adafruit_bus_device_spidevice_obj_t *self = m_new_obj(adafruit_bus_device_spidevice_obj_t);
7576
self->base.type = &adafruit_bus_device_spidevice_type;
76-
enum { ARG_spi, ARG_chip_select, ARG_baudrate, ARG_polarity, ARG_phase, ARG_extra_clocks };
77+
enum { ARG_spi, ARG_chip_select, ARG_cs_active_value, ARG_baudrate, ARG_polarity, ARG_phase, ARG_extra_clocks };
7778
static const mp_arg_t allowed_args[] = {
7879
{ MP_QSTR_spi, MP_ARG_REQUIRED | MP_ARG_OBJ },
7980
{ MP_QSTR_chip_select, MP_ARG_OBJ, {.u_obj = MP_OBJ_NULL} },
81+
{ MP_QSTR_cs_active_value, MP_ARG_KW_ONLY | MP_ARG_BOOL, {.u_bool = false} },
8082
{ MP_QSTR_baudrate, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 100000} },
8183
{ MP_QSTR_polarity, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
8284
{ MP_QSTR_phase, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
@@ -87,7 +89,7 @@ STATIC mp_obj_t adafruit_bus_device_spidevice_make_new(const mp_obj_type_t *type
8789

8890
busio_spi_obj_t *spi = args[ARG_spi].u_obj;
8991

90-
common_hal_adafruit_bus_device_spidevice_construct(MP_OBJ_TO_PTR(self), spi, args[ARG_chip_select].u_obj, args[ARG_baudrate].u_int, args[ARG_polarity].u_int,
92+
common_hal_adafruit_bus_device_spidevice_construct(MP_OBJ_TO_PTR(self), spi, args[ARG_chip_select].u_obj, args[ARG_cs_active_value].u_bool, args[ARG_baudrate].u_int, args[ARG_polarity].u_int,
9193
args[ARG_phase].u_int, args[ARG_extra_clocks].u_int);
9294

9395
if (args[ARG_chip_select].u_obj != MP_OBJ_NULL) {

shared-bindings/adafruit_bus_device/SPIDevice.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ extern const mp_obj_type_t adafruit_bus_device_spidevice_type;
4343

4444
// Initializes the hardware peripheral.
4545
extern void common_hal_adafruit_bus_device_spidevice_construct(adafruit_bus_device_spidevice_obj_t *self, busio_spi_obj_t *spi, digitalio_digitalinout_obj_t *cs,
46-
uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t extra_clocks);
46+
bool cs_active_value, uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t extra_clocks);
4747
extern mp_obj_t common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevice_obj_t *self);
4848
extern void common_hal_adafruit_bus_device_spidevice_exit(adafruit_bus_device_spidevice_obj_t *self);
4949

shared-module/adafruit_bus_device/SPIDevice.c

+4-3
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,14 @@
3232
#include "py/runtime.h"
3333

3434
void common_hal_adafruit_bus_device_spidevice_construct(adafruit_bus_device_spidevice_obj_t *self, busio_spi_obj_t *spi, digitalio_digitalinout_obj_t *cs,
35-
uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t extra_clocks) {
35+
bool cs_active_value, uint32_t baudrate, uint8_t polarity, uint8_t phase, uint8_t extra_clocks) {
3636
self->spi = spi;
3737
self->baudrate = baudrate;
3838
self->polarity = polarity;
3939
self->phase = phase;
4040
self->extra_clocks = extra_clocks;
4141
self->chip_select = cs;
42+
self->cs_active_value = cs_active_value;
4243
}
4344

4445
mp_obj_t common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spidevice_obj_t *self) {
@@ -66,14 +67,14 @@ mp_obj_t common_hal_adafruit_bus_device_spidevice_enter(adafruit_bus_device_spid
6667
}
6768

6869
if (self->chip_select != MP_OBJ_NULL) {
69-
common_hal_digitalio_digitalinout_set_value(MP_OBJ_TO_PTR(self->chip_select), false);
70+
common_hal_digitalio_digitalinout_set_value(MP_OBJ_TO_PTR(self->chip_select), self->cs_active_value);
7071
}
7172
return self->spi;
7273
}
7374

7475
void common_hal_adafruit_bus_device_spidevice_exit(adafruit_bus_device_spidevice_obj_t *self) {
7576
if (self->chip_select != MP_OBJ_NULL) {
76-
common_hal_digitalio_digitalinout_set_value(MP_OBJ_TO_PTR(self->chip_select), true);
77+
common_hal_digitalio_digitalinout_set_value(MP_OBJ_TO_PTR(self->chip_select), !(self->cs_active_value));
7778
}
7879

7980
if (self->extra_clocks > 0) {

shared-module/adafruit_bus_device/SPIDevice.h

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ typedef struct {
3939
uint8_t phase;
4040
uint8_t extra_clocks;
4141
digitalio_digitalinout_obj_t *chip_select;
42+
bool cs_active_value;
4243
} adafruit_bus_device_spidevice_obj_t;
4344

4445
#endif // MICROPY_INCLUDED_ATMEL_SAMD_SHARED_MODULE_BUSDEVICE_SPIDEVICE_H

0 commit comments

Comments
 (0)