diff options
author | Damien George <damien.p.george@gmail.com> | 2016-10-04 13:43:02 +1100 |
---|---|---|
committer | Damien George <damien.p.george@gmail.com> | 2016-10-04 13:43:02 +1100 |
commit | b932b2dd1faaf3091b13af7d213041a737e40fac (patch) | |
tree | 2428ebf68a48aebdb1d55ce800e557e37f45d13b /esp8266/modpybspi.c | |
parent | 9f1e395c167648d1b7fef1175290b0047ee6e1f4 (diff) | |
download | micropython-b932b2dd1faaf3091b13af7d213041a737e40fac.tar.gz micropython-b932b2dd1faaf3091b13af7d213041a737e40fac.zip |
extmod/machine_spi: Use delay_half, not baudrate, for internal timing.
The delay_half parameter must be specified by the port to set up the
timing of the software SPI. This allows the port to adjust the timing
value to better suit its timing characteristics, as well as provide a
more accurate printing of the baudrate.
Diffstat (limited to 'esp8266/modpybspi.c')
-rw-r--r-- | esp8266/modpybspi.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/esp8266/modpybspi.c b/esp8266/modpybspi.c index acc3c25125..e974547111 100644 --- a/esp8266/modpybspi.c +++ b/esp8266/modpybspi.c @@ -36,10 +36,24 @@ /******************************************************************************/ // MicroPython bindings for SPI +STATIC uint32_t baudrate_from_delay_half(uint32_t delay_half) { + return 500000 / delay_half; +} + +STATIC uint32_t baudrate_to_delay_half(uint32_t baudrate) { + uint32_t delay_half = 500000 / baudrate; + // round delay_half up so that: actual_baudrate <= requested_baudrate + if (500000 % baudrate != 0) { + delay_half += 1; + } + return delay_half; +} + STATIC void pyb_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_print_kind_t kind) { mp_machine_soft_spi_obj_t *self = MP_OBJ_TO_PTR(self_in); mp_printf(print, "SPI(baudrate=%u, polarity=%u, phase=%u, sck=%u, mosi=%u, miso=%u)", - self->baudrate, self->polarity, self->phase, self->sck, self->mosi, self->miso); + baudrate_from_delay_half(self->delay_half), + self->polarity, self->phase, self->sck, self->mosi, self->miso); } STATIC void pyb_spi_init_helper(mp_machine_soft_spi_obj_t *self, size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) { @@ -56,7 +70,7 @@ STATIC void pyb_spi_init_helper(mp_machine_soft_spi_obj_t *self, size_t n_args, mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args); if (args[ARG_baudrate].u_int != -1) { - self->baudrate = args[ARG_baudrate].u_int; + self->delay_half = baudrate_to_delay_half(args[ARG_baudrate].u_int); } if (args[ARG_polarity].u_int != -1) { self->polarity = args[ARG_polarity].u_int; @@ -86,7 +100,7 @@ mp_obj_t pyb_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, mp_machine_soft_spi_obj_t *self = m_new_obj(mp_machine_soft_spi_obj_t); self->base.type = &pyb_spi_type; // set defaults - self->baudrate = 500000; + self->delay_half = baudrate_to_delay_half(500000); self->polarity = 0; self->phase = 0; self->sck = 14; |