diff options
| author | Scott Shawcroft <scott.shawcroft@gmail.com> | 2016-11-29 16:54:20 -0800 |
|---|---|---|
| committer | Scott Shawcroft <scott.shawcroft@gmail.com> | 2016-11-29 16:54:20 -0800 |
| commit | 9b3afc7b375da6d820917fc912b88f92a5ef9873 (patch) | |
| tree | fa3b5495e75ed054aee40149a60fbf288279bf91 /shared-module/bitbangio | |
| parent | 4933fa1c27f987be558a33b1736089b04e880a03 (diff) | |
shared-bindings: Make MOSI and MISO optional for SPI.
Diffstat (limited to 'shared-module/bitbangio')
| -rw-r--r-- | shared-module/bitbangio/SPI.c | 56 | ||||
| -rw-r--r-- | shared-module/bitbangio/types.h | 2 |
2 files changed, 44 insertions, 14 deletions
diff --git a/shared-module/bitbangio/SPI.c b/shared-module/bitbangio/SPI.c index 5d77efaf9..07322abd7 100644 --- a/shared-module/bitbangio/SPI.c +++ b/shared-module/bitbangio/SPI.c @@ -26,6 +26,7 @@ #include "mpconfigport.h" +#include "py/nlr.h" #include "py/obj.h" #include "common-hal/microcontroller/types.h" @@ -40,18 +41,29 @@ extern void shared_module_bitbangio_spi_construct(bitbangio_spi_obj_t *self, const mcu_pin_obj_t * miso, uint32_t baudrate) { digitalinout_result_t result = common_hal_nativeio_digitalinout_construct(&self->clock, clock); if (result != DIGITALINOUT_OK) { - return; + nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, + "Clock pin init failed.")); } - result = common_hal_nativeio_digitalinout_construct(&self->mosi, mosi); - if (result != DIGITALINOUT_OK) { - common_hal_nativeio_digitalinout_deinit(&self->clock); - return; + if (mosi != mp_const_none) { + result = common_hal_nativeio_digitalinout_construct(&self->mosi, mosi); + if (result != DIGITALINOUT_OK) { + common_hal_nativeio_digitalinout_deinit(&self->clock); + nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, + "MOSI pin init failed.")); + } + self->has_mosi = true; } - result = common_hal_nativeio_digitalinout_construct(&self->miso, miso); - if (result != DIGITALINOUT_OK) { - common_hal_nativeio_digitalinout_deinit(&self->clock); - common_hal_nativeio_digitalinout_deinit(&self->mosi); - return; + if (miso != mp_const_none) { + result = common_hal_nativeio_digitalinout_construct(&self->miso, miso); + if (result != DIGITALINOUT_OK) { + common_hal_nativeio_digitalinout_deinit(&self->clock); + if (mosi != mp_const_none) { + common_hal_nativeio_digitalinout_deinit(&self->mosi); + } + nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, + "MISO pin init failed.")); + } + self->has_miso = true; } self->delay_half = 500000 / baudrate; @@ -66,13 +78,25 @@ extern void shared_module_bitbangio_spi_construct(bitbangio_spi_obj_t *self, extern void shared_module_bitbangio_spi_deinit(bitbangio_spi_obj_t *self) { common_hal_nativeio_digitalinout_deinit(&self->clock); - common_hal_nativeio_digitalinout_deinit(&self->mosi); - common_hal_nativeio_digitalinout_deinit(&self->miso); + if (self->has_mosi) { + common_hal_nativeio_digitalinout_deinit(&self->mosi); + } + if (self->has_miso) { + common_hal_nativeio_digitalinout_deinit(&self->miso); + } } bool shared_module_bitbangio_spi_transfer(bitbangio_spi_obj_t *self, const uint8_t *write_buffer, size_t write_buffer_len, uint8_t *read_buffer, size_t read_buffer_len) { + if (write_buffer_len > 0 && !self->has_mosi) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, + "Cannot write without MOSI pin.")); + } + if (read_buffer_len > 0 && !self->has_miso) { + nlr_raise(mp_obj_new_exception_msg(&mp_type_ValueError, + "Cannot read without MISO pin.")); + } uint32_t delay_half = self->delay_half; // only MSB transfer is implemented @@ -95,7 +119,9 @@ bool shared_module_bitbangio_spi_transfer(bitbangio_spi_obj_t *self, } // Clock out zeroes while we read. - common_hal_nativeio_digitalinout_set_value(&self->mosi, false); + if (self->has_mosi) { + common_hal_nativeio_digitalinout_set_value(&self->mosi, false); + } for (size_t i = 0; i < read_buffer_len; ++i) { uint8_t data_in = 0; for (int j = 0; j < 8; ++j, data_out <<= 1) { @@ -135,7 +161,9 @@ bool shared_module_bitbangio_spi_transfer(bitbangio_spi_obj_t *self, MICROPY_EVENT_POLL_HOOK; #endif } - common_hal_nativeio_digitalinout_set_value(&self->mosi, false); + if (self->has_mosi) { + common_hal_nativeio_digitalinout_set_value(&self->mosi, false); + } for (size_t i = 0; i < read_buffer_len; ++i) { uint8_t data_in = 0; for (int j = 0; j < 8; ++j) { diff --git a/shared-module/bitbangio/types.h b/shared-module/bitbangio/types.h index e6a29ab54..e7fd95498 100644 --- a/shared-module/bitbangio/types.h +++ b/shared-module/bitbangio/types.h @@ -41,7 +41,9 @@ typedef struct { typedef struct { mp_obj_base_t base; nativeio_digitalinout_obj_t clock; + bool has_mosi; nativeio_digitalinout_obj_t mosi; + bool has_miso; nativeio_digitalinout_obj_t miso; uint32_t delay_half; uint8_t polarity; |
