mimxrt: Enable default devices for I2C, SPI and UART.
Since all boards are configured to have a I2C(0), SPI(0) and UART(1), these can be set as default devices, allowing the instantiation of I2C(), SPI(), UART() without an id argument. Signed-off-by: robert-hh <robert@hammelrath.com>
This commit is contained in:
@@ -122,10 +122,13 @@ See :ref:`machine.UART <machine.UART>`. ::
|
|||||||
uart1 = UART(1, baudrate=115200)
|
uart1 = UART(1, baudrate=115200)
|
||||||
uart1.write('hello') # write 5 bytes
|
uart1.write('hello') # write 5 bytes
|
||||||
uart1.read(5) # read up to 5 bytes
|
uart1.read(5) # read up to 5 bytes
|
||||||
|
uart1 = UART(baudrate=19200) # open UART 1 at 19200 baud
|
||||||
|
|
||||||
The i.MXRT has up to eight hardware UARTs, but not every board exposes all
|
The i.MXRT has up to eight hardware UARTs, but not every board exposes all
|
||||||
TX and RX pins for users. For the assignment of Pins to UART signals,
|
TX and RX pins for users. For the assignment of Pins to UART signals,
|
||||||
refer to the :ref:`UART pinout <mimxrt_uart_pinout>`.
|
refer to the :ref:`UART pinout <mimxrt_uart_pinout>`. If the UART ID is
|
||||||
|
omitted, UART(1) is selected. Then, the keyword
|
||||||
|
option for baudrate must be used to change it from the default value.
|
||||||
|
|
||||||
PWM (pulse width modulation)
|
PWM (pulse width modulation)
|
||||||
----------------------------
|
----------------------------
|
||||||
@@ -305,12 +308,15 @@ rates (up to 30Mhz). Hardware SPI is accessed via the
|
|||||||
cs_pin(0)
|
cs_pin(0)
|
||||||
spi.write('Hello World')
|
spi.write('Hello World')
|
||||||
cs_pin(1)
|
cs_pin(1)
|
||||||
|
spi = SPI(baudrate=4_000_000) # Use SPI(0) at a baudrate of 4 MHz
|
||||||
|
|
||||||
For the assignment of Pins to SPI signals, refer to
|
For the assignment of Pins to SPI signals, refer to
|
||||||
:ref:`Hardware SPI pinout <mimxrt_spi_pinout>`.
|
:ref:`Hardware SPI pinout <mimxrt_spi_pinout>`.
|
||||||
The keyword option cs=n can be used to enable the cs pin 0 or 1 for an automatic cs signal. The
|
The keyword option cs=n can be used to enable the cs pin 0 or 1 for an automatic cs signal. The
|
||||||
default is cs=-1. Using cs=-1 the automatic cs signal is not created.
|
default is cs=-1. Using cs=-1 the automatic cs signal is not created.
|
||||||
In that case, cs has to be set by the script. Clearing that assignment requires a power cycle.
|
In that case, cs has to be set by the script. Clearing that assignment requires a power cycle.
|
||||||
|
If the SPI ID is omitted, SPI(0) is selected. Then, the keyword
|
||||||
|
option for baudrate must be used to change it from the default value.
|
||||||
|
|
||||||
Notes:
|
Notes:
|
||||||
|
|
||||||
@@ -355,6 +361,10 @@ has the same methods as software SPI above::
|
|||||||
|
|
||||||
i2c = I2C(0, 400_000)
|
i2c = I2C(0, 400_000)
|
||||||
i2c.writeto(0x76, b"Hello World")
|
i2c.writeto(0x76, b"Hello World")
|
||||||
|
i2c = I2C(freq=100_000) # use I2C(0) at 100kHz
|
||||||
|
|
||||||
|
If the I2C ID is omitted, I2C(0) is selected. Then, the keyword
|
||||||
|
option for freq must be used to change the freq from the default value.
|
||||||
|
|
||||||
I2S bus
|
I2S bus
|
||||||
-------
|
-------
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
#include "fsl_iomuxc.h"
|
#include "fsl_iomuxc.h"
|
||||||
#include "fsl_lpi2c.h"
|
#include "fsl_lpi2c.h"
|
||||||
|
|
||||||
|
#define DEFAULT_I2C_ID (0)
|
||||||
#define DEFAULT_I2C_FREQ (400000)
|
#define DEFAULT_I2C_FREQ (400000)
|
||||||
#define DEFAULT_I2C_DRIVE (6)
|
#define DEFAULT_I2C_DRIVE (6)
|
||||||
#define DEFAULT_I2C_TIMEOUT (50000)
|
#define DEFAULT_I2C_TIMEOUT (50000)
|
||||||
@@ -91,7 +92,7 @@ static void machine_i2c_print(const mp_print_t *print, mp_obj_t self_in, mp_prin
|
|||||||
mp_obj_t machine_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
|
mp_obj_t machine_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
|
||||||
enum { ARG_id, ARG_freq, ARG_drive, ARG_timeout};
|
enum { ARG_id, ARG_freq, ARG_drive, ARG_timeout};
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_id, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
{ MP_QSTR_id, MP_ARG_INT, {.u_int = DEFAULT_I2C_ID} },
|
||||||
{ MP_QSTR_freq, MP_ARG_INT, {.u_int = DEFAULT_I2C_FREQ} },
|
{ MP_QSTR_freq, MP_ARG_INT, {.u_int = DEFAULT_I2C_FREQ} },
|
||||||
{ MP_QSTR_drive, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_I2C_DRIVE} },
|
{ MP_QSTR_drive, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_I2C_DRIVE} },
|
||||||
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_I2C_TIMEOUT} },
|
{ MP_QSTR_timeout, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_I2C_TIMEOUT} },
|
||||||
@@ -102,7 +103,7 @@ mp_obj_t machine_i2c_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
|
|||||||
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
// Get I2C bus.
|
// Get I2C bus.
|
||||||
int i2c_id = mp_obj_get_int(args[ARG_id].u_obj);
|
int i2c_id = args[ARG_id].u_int;
|
||||||
if (i2c_id < 0 || i2c_id >= MICROPY_HW_I2C_NUM || i2c_index_table[i2c_id] == 0) {
|
if (i2c_id < 0 || i2c_id >= MICROPY_HW_I2C_NUM || i2c_index_table[i2c_id] == 0) {
|
||||||
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("I2C(%d) doesn't exist"), i2c_id);
|
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("I2C(%d) doesn't exist"), i2c_id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#include "fsl_lpspi.h"
|
#include "fsl_lpspi.h"
|
||||||
#include "fsl_lpspi_edma.h"
|
#include "fsl_lpspi_edma.h"
|
||||||
|
|
||||||
|
#define DEFAULT_SPI_ID (0)
|
||||||
#define DEFAULT_SPI_BAUDRATE (1000000)
|
#define DEFAULT_SPI_BAUDRATE (1000000)
|
||||||
#define DEFAULT_SPI_POLARITY (0)
|
#define DEFAULT_SPI_POLARITY (0)
|
||||||
#define DEFAULT_SPI_PHASE (0)
|
#define DEFAULT_SPI_PHASE (0)
|
||||||
@@ -130,7 +131,7 @@ static void machine_spi_print(const mp_print_t *print, mp_obj_t self_in, mp_prin
|
|||||||
mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
|
mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
|
||||||
enum { ARG_id, ARG_baudrate, ARG_polarity, ARG_phase, ARG_bits, ARG_firstbit, ARG_gap_ns, ARG_drive, ARG_cs };
|
enum { ARG_id, ARG_baudrate, ARG_polarity, ARG_phase, ARG_bits, ARG_firstbit, ARG_gap_ns, ARG_drive, ARG_cs };
|
||||||
static const mp_arg_t allowed_args[] = {
|
static const mp_arg_t allowed_args[] = {
|
||||||
{ MP_QSTR_id, MP_ARG_REQUIRED | MP_ARG_OBJ },
|
{ MP_QSTR_id, MP_ARG_INT, {.u_int = DEFAULT_SPI_ID} },
|
||||||
{ MP_QSTR_baudrate, MP_ARG_INT, {.u_int = DEFAULT_SPI_BAUDRATE} },
|
{ MP_QSTR_baudrate, MP_ARG_INT, {.u_int = DEFAULT_SPI_BAUDRATE} },
|
||||||
{ MP_QSTR_polarity, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_SPI_POLARITY} },
|
{ MP_QSTR_polarity, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_SPI_POLARITY} },
|
||||||
{ MP_QSTR_phase, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_SPI_PHASE} },
|
{ MP_QSTR_phase, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = DEFAULT_SPI_PHASE} },
|
||||||
@@ -146,7 +147,7 @@ mp_obj_t machine_spi_make_new(const mp_obj_type_t *type, size_t n_args, size_t n
|
|||||||
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
mp_arg_parse_all_kw_array(n_args, n_kw, all_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||||
|
|
||||||
// Get the SPI bus id.
|
// Get the SPI bus id.
|
||||||
int spi_id = mp_obj_get_int(args[ARG_id].u_obj);
|
int spi_id = args[ARG_id].u_int;
|
||||||
if (spi_id < 0 || spi_id >= MP_ARRAY_SIZE(spi_index_table) || spi_index_table[spi_id] == 0) {
|
if (spi_id < 0 || spi_id >= MP_ARRAY_SIZE(spi_index_table) || spi_index_table[spi_id] == 0) {
|
||||||
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("SPI(%d) doesn't exist"), spi_id);
|
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("SPI(%d) doesn't exist"), spi_id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@
|
|||||||
#include "modmachine.h"
|
#include "modmachine.h"
|
||||||
#include "pin.h"
|
#include "pin.h"
|
||||||
|
|
||||||
|
#define DEFAULT_UART_ID (1)
|
||||||
#define DEFAULT_UART_BAUDRATE (115200)
|
#define DEFAULT_UART_BAUDRATE (115200)
|
||||||
#define DEFAULT_BUFFER_SIZE (256)
|
#define DEFAULT_BUFFER_SIZE (256)
|
||||||
#define MIN_BUFFER_SIZE (32)
|
#define MIN_BUFFER_SIZE (32)
|
||||||
@@ -377,10 +378,17 @@ static void mp_machine_uart_init_helper(machine_uart_obj_t *self, size_t n_args,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static mp_obj_t mp_machine_uart_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
|
static mp_obj_t mp_machine_uart_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
|
||||||
mp_arg_check_num(n_args, n_kw, 1, MP_OBJ_FUN_ARGS_MAX, true);
|
mp_arg_check_num(n_args, n_kw, 0, MP_OBJ_FUN_ARGS_MAX, true);
|
||||||
|
|
||||||
// Get UART bus.
|
// Get UART bus.
|
||||||
int uart_id = mp_obj_get_int(args[0]);
|
int uart_id;
|
||||||
|
if (n_args > 0) {
|
||||||
|
uart_id = mp_obj_get_int(args[0]);
|
||||||
|
n_args--;
|
||||||
|
args++;
|
||||||
|
} else {
|
||||||
|
uart_id = DEFAULT_UART_ID;
|
||||||
|
}
|
||||||
if (uart_id < 0 || uart_id > MICROPY_HW_UART_NUM || uart_index_table[uart_id] == 0) {
|
if (uart_id < 0 || uart_id > MICROPY_HW_UART_NUM || uart_index_table[uart_id] == 0) {
|
||||||
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("UART(%d) doesn't exist"), uart_id);
|
mp_raise_msg_varg(&mp_type_ValueError, MP_ERROR_TEXT("UART(%d) doesn't exist"), uart_id);
|
||||||
}
|
}
|
||||||
@@ -409,7 +417,7 @@ static mp_obj_t mp_machine_uart_make_new(const mp_obj_type_t *type, size_t n_arg
|
|||||||
if (uart_present) {
|
if (uart_present) {
|
||||||
mp_map_t kw_args;
|
mp_map_t kw_args;
|
||||||
mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
|
mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
|
||||||
mp_machine_uart_init_helper(self, n_args - 1, args + 1, &kw_args);
|
mp_machine_uart_init_helper(self, n_args, args, &kw_args);
|
||||||
return MP_OBJ_FROM_PTR(self);
|
return MP_OBJ_FROM_PTR(self);
|
||||||
} else {
|
} else {
|
||||||
return mp_const_none;
|
return mp_const_none;
|
||||||
|
|||||||
Reference in New Issue
Block a user