Skip to content

Commit 3ce7bdd

Browse files
committed
Add preliminary busio.UART support
- Enabled BUSIO in mpconfigport.mk - Stubs added for busio.I2C & busio.SPI - Implemented busio.UART to basic working functionality - Added MCU-specific UART data in peripherals/<mcu>/max32_uart.c & max32_uart.h - Still have a couple issues where UART generates garbage characters or does not respond to timeouts / generate asynchronous IRQs
1 parent 0220236 commit 3ce7bdd

File tree

8 files changed

+529
-292
lines changed

8 files changed

+529
-292
lines changed

ports/analog/common-hal/busio/I2C.c

Lines changed: 10 additions & 106 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
#include "shared-bindings/microcontroller/__init__.h"
3131
#include "shared-bindings/microcontroller/Pin.h"
3232

33-
static I2CSPM_Init_TypeDef i2cspm_init;
3433
static bool in_used = false;
3534

3635
// Construct I2C protocol, this function init i2c peripheral
@@ -39,37 +38,7 @@ void common_hal_busio_i2c_construct(busio_i2c_obj_t *self,
3938
const mcu_pin_obj_t *sda,
4039
uint32_t frequency, uint32_t timeout) {
4140

42-
// Ensure the object starts in its deinit state.
43-
common_hal_busio_i2c_mark_deinit(self);
44-
45-
if ((scl != NULL) && (sda != NULL)) {
46-
if (scl->function_list[ DEFAULT_I2C_PERIPHERAL == I2C1?
47-
FN_I2C1_SCL : FN_I2C0_SCL] == 1 &&
48-
scl->function_list[DEFAULT_I2C_PERIPHERAL == I2C1?
49-
FN_I2C1_SDA : FN_I2C0_SDA] == 1) {
50-
self->scl = scl;
51-
self->sda = sda;
52-
self->has_lock = false;
53-
i2cspm_init.sclPort = self->scl->port;
54-
i2cspm_init.sclPin = self->scl->number;
55-
i2cspm_init.sdaPort = self->sda->port;
56-
i2cspm_init.sdaPin = self->sda->number;
57-
i2cspm_init.port = DEFAULT_I2C_PERIPHERAL;
58-
i2cspm_init.i2cRefFreq = 0;
59-
i2cspm_init.i2cMaxFreq = I2C_FREQ_STANDARD_MAX;
60-
i2cspm_init.i2cClhr = i2cClockHLRStandard;
61-
62-
self->i2cspm = i2cspm_init.port;
63-
I2CSPM_Init(&i2cspm_init);
64-
common_hal_mcu_pin_claim(scl);
65-
common_hal_mcu_pin_claim(sda);
66-
in_used = true;
67-
} else {
68-
mp_raise_ValueError(MP_ERROR_TEXT("Hardware in use, try alternative pins"));
69-
}
70-
} else {
71-
raise_ValueError_invalid_pins();
72-
}
41+
7342
}
7443

7544
// Never reset I2C obj when reload
@@ -85,53 +54,26 @@ bool common_hal_busio_i2c_deinited(busio_i2c_obj_t *self) {
8554

8655
// Deinit i2c obj, reset I2C pin
8756
void common_hal_busio_i2c_deinit(busio_i2c_obj_t *self) {
88-
if (common_hal_busio_i2c_deinited(self)) {
89-
return;
90-
}
91-
I2C_Reset(self->i2cspm);
92-
common_hal_reset_pin(self->sda);
93-
common_hal_reset_pin(self->scl);
94-
self->i2cspm = NULL;
95-
in_used = false;
96-
common_hal_busio_i2c_mark_deinit(self);
57+
// FIXME: Implement
9758
}
9859

9960
void common_hal_busio_i2c_mark_deinit(busio_i2c_obj_t *self) {
100-
self->sda = NULL;
61+
// FIXME: Implement
10162
}
10263

10364
// Probe device in I2C bus
10465
bool common_hal_busio_i2c_probe(busio_i2c_obj_t *self, uint8_t addr) {
105-
I2C_TransferSeq_TypeDef seq;
106-
I2C_TransferReturn_TypeDef ret;
107-
uint8_t data = 0;
108-
109-
seq.addr = addr << 1;
110-
seq.flags = I2C_FLAG_READ;
111-
112-
seq.buf[0].data = &data;
113-
seq.buf[0].len = 1;
66+
// FIXME: Implement
11467

115-
ret = I2CSPM_Transfer(self->i2cspm, &seq);
116-
if (ret != i2cTransferDone) {
117-
return false;
118-
}
11968
return true;
12069
}
12170

12271
// Lock I2C bus
12372
bool common_hal_busio_i2c_try_lock(busio_i2c_obj_t *self) {
124-
if (common_hal_busio_i2c_deinited(self)) {
125-
return false;
126-
}
127-
bool grabbed_lock = false;
12873

129-
if (!self->has_lock) {
130-
grabbed_lock = true;
131-
self->has_lock = true;
132-
}
74+
// FIXME: Implement
13375

134-
return grabbed_lock;
76+
return false;
13577
}
13678

13779
// Check I2C lock status
@@ -148,19 +90,7 @@ void common_hal_busio_i2c_unlock(busio_i2c_obj_t *self) {
14890
uint8_t common_hal_busio_i2c_write(busio_i2c_obj_t *self, uint16_t addr,
14991
const uint8_t *data, size_t len) {
15092

151-
I2C_TransferSeq_TypeDef seq;
152-
I2C_TransferReturn_TypeDef ret;
153-
154-
seq.addr = addr << 1;
155-
seq.flags = I2C_FLAG_WRITE;
156-
157-
seq.buf[0].data = (uint8_t *)data;
158-
seq.buf[0].len = len;
159-
160-
ret = I2CSPM_Transfer(self->i2cspm, &seq);
161-
if (ret != i2cTransferDone) {
162-
return MP_EIO;
163-
}
93+
// FIXME: Implement
16494
return 0;
16595
}
16696

@@ -169,19 +99,7 @@ uint8_t common_hal_busio_i2c_read(busio_i2c_obj_t *self,
16999
uint16_t addr,
170100
uint8_t *data, size_t len) {
171101

172-
I2C_TransferSeq_TypeDef seq;
173-
I2C_TransferReturn_TypeDef ret;
174-
175-
seq.addr = addr << 1;
176-
seq.flags = I2C_FLAG_READ;
177-
178-
seq.buf[0].data = data;
179-
seq.buf[0].len = len;
180-
181-
ret = I2CSPM_Transfer(self->i2cspm, &seq);
182-
if (ret != i2cTransferDone) {
183-
return MP_EIO;
184-
}
102+
// FIXME: Implement
185103
return 0;
186104
}
187105

@@ -190,21 +108,7 @@ uint8_t common_hal_busio_i2c_write_read(busio_i2c_obj_t *self, uint16_t addr,
190108
uint8_t *out_data, size_t out_len,
191109
uint8_t *in_data, size_t in_len) {
192110

193-
I2C_TransferSeq_TypeDef seq;
194-
I2C_TransferReturn_TypeDef ret;
195-
196-
seq.addr = addr << 1;
197-
seq.flags = I2C_FLAG_WRITE_READ;
198-
// Select command to issue
199-
seq.buf[0].data = out_data;
200-
seq.buf[0].len = out_len;
201-
// Select location/length of data to be read
202-
seq.buf[1].data = in_data;
203-
seq.buf[1].len = in_len;
204-
205-
ret = I2CSPM_Transfer(self->i2cspm, &seq);
206-
if (ret != i2cTransferDone) {
207-
return MP_EIO;
208-
}
111+
// FIXME: Implement
112+
209113
return 0;
210114
}

ports/analog/common-hal/busio/SPI.c

Lines changed: 16 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -34,17 +34,9 @@
3434
// Note that any bugs introduced in this file can cause crashes
3535
// at startupfor chips using external SPI flash.
3636

37-
static SPIDRV_HandleData_t spidrv_eusart_handle;
38-
static SPIDRV_Init_t spidrv_eusart_init = SPIDRV_MASTER_EUSART1;
39-
static bool in_used = false;
40-
static bool never_reset = false;
41-
4237
// Reset SPI when reload
4338
void spi_reset(void) {
44-
if (!never_reset && in_used) {
45-
SPIDRV_DeInit(&spidrv_eusart_handle);
46-
in_used = false;
47-
}
39+
// FIXME: Implement
4840
return;
4941
}
5042

@@ -54,64 +46,14 @@ void common_hal_busio_spi_construct(busio_spi_obj_t *self,
5446
const mcu_pin_obj_t *mosi,
5547
const mcu_pin_obj_t *miso,
5648
bool half_duplex) {
57-
Ecode_t sc = ECODE_OK;
58-
59-
if (half_duplex) {
60-
mp_raise_NotImplementedError(
61-
MP_ERROR_TEXT("Half duplex SPI is not implemented"));
62-
}
63-
64-
if ((sck != NULL) && (mosi != NULL) && (miso != NULL)) {
65-
if (sck->function_list[FN_EUSART1_SCLK] == 1
66-
&& miso->function_list[FN_EUSART1_RX] == 1
67-
&& mosi->function_list[FN_EUSART1_TX] == 1) {
68-
69-
self->sck = sck;
70-
self->mosi = mosi;
71-
self->miso = miso;
72-
self->handle = &spidrv_eusart_handle;
73-
self->polarity = 0;
74-
self->phase = 0;
75-
self->bits = 8;
76-
77-
spidrv_eusart_init.portTx = mosi->port;
78-
spidrv_eusart_init.portRx = miso->port;
79-
spidrv_eusart_init.portClk = sck->port;
80-
spidrv_eusart_init.pinTx = mosi->number;
81-
spidrv_eusart_init.pinRx = miso->number;
82-
spidrv_eusart_init.pinClk = sck->number;
83-
spidrv_eusart_init.bitRate = 1000000;
84-
spidrv_eusart_init.frameLength = 8;
85-
spidrv_eusart_init.dummyTxValue = 0;
86-
spidrv_eusart_init.type = spidrvMaster;
87-
spidrv_eusart_init.bitOrder = spidrvBitOrderMsbFirst;
88-
spidrv_eusart_init.clockMode = spidrvClockMode0;
89-
spidrv_eusart_init.csControl = spidrvCsControlApplication;
90-
spidrv_eusart_init.slaveStartMode = spidrvSlaveStartImmediate;
91-
92-
sc = SPIDRV_Init(self->handle, &spidrv_eusart_init);
93-
if (sc != ECODE_EMDRV_SPIDRV_OK) {
94-
mp_raise_ValueError(MP_ERROR_TEXT("SPI init error"));
95-
}
96-
} else {
97-
mp_raise_ValueError(MP_ERROR_TEXT("Hardware in use, try alternative pins"));
98-
}
99-
} else {
100-
raise_ValueError_invalid_pins();
101-
}
102-
103-
in_used = true;
104-
common_hal_mcu_pin_claim(sck);
105-
common_hal_mcu_pin_claim(mosi);
106-
common_hal_mcu_pin_claim(miso);
49+
50+
51+
// FIXME: Implement
10752
}
10853

10954
// Never reset SPI when reload
11055
void common_hal_busio_spi_never_reset(busio_spi_obj_t *self) {
111-
never_reset = true;
112-
common_hal_never_reset_pin(self->mosi);
113-
common_hal_never_reset_pin(self->miso);
114-
common_hal_never_reset_pin(self->sck);
56+
// FIXME: Implement
11557
}
11658

11759
// Check SPI status, deinited or not
@@ -122,23 +64,7 @@ bool common_hal_busio_spi_deinited(busio_spi_obj_t *self) {
12264
// Deinit SPI obj
12365
void common_hal_busio_spi_deinit(busio_spi_obj_t *self) {
12466

125-
if (common_hal_busio_spi_deinited(self)) {
126-
return;
127-
}
128-
129-
Ecode_t sc = SPIDRV_DeInit(self->handle);
130-
if (sc != ECODE_EMDRV_SPIDRV_OK) {
131-
mp_raise_RuntimeError(MP_ERROR_TEXT("SPI re-init"));
132-
}
133-
134-
in_used = false;
135-
self->sck = NULL;
136-
self->mosi = NULL;
137-
self->miso = NULL;
138-
self->handle = NULL;
139-
common_hal_reset_pin(self->mosi);
140-
common_hal_reset_pin(self->miso);
141-
common_hal_reset_pin(self->sck);
67+
// FIXME: Implement
14268
}
14369

14470
// Configures the SPI bus. The SPI object must be locked.
@@ -147,55 +73,15 @@ bool common_hal_busio_spi_configure(busio_spi_obj_t *self,
14773
uint8_t polarity,
14874
uint8_t phase,
14975
uint8_t bits) {
150-
Ecode_t sc;
151-
// This resets the SPI, so check before updating it redundantly
152-
if (baudrate == self->baudrate && polarity == self->polarity
153-
&& phase == self->phase && bits == self->bits) {
154-
return true;
155-
}
156-
157-
sc = SPIDRV_DeInit(self->handle);
158-
if (sc != ECODE_EMDRV_SPIDRV_OK) {
159-
mp_raise_RuntimeError(MP_ERROR_TEXT("SPI re-init"));
160-
}
161-
in_used = false;
162-
self->baudrate = baudrate;
163-
self->phase = phase;
164-
self->bits = bits;
165-
self->polarity = polarity;
166-
167-
spidrv_eusart_init.bitRate = baudrate;
168-
spidrv_eusart_init.frameLength = 8;
169-
if (polarity == 0 && phase == 0) {
170-
spidrv_eusart_init.clockMode = spidrvClockMode0;
171-
} else if (polarity == 0 && phase == 1) {
172-
spidrv_eusart_init.clockMode = spidrvClockMode1;
173-
} else if (polarity == 1 && phase == 0) {
174-
spidrv_eusart_init.clockMode = spidrvClockMode2;
175-
} else if (polarity == 1 && phase == 1) {
176-
spidrv_eusart_init.clockMode = spidrvClockMode3;
177-
}
178-
179-
sc = SPIDRV_Init(self->handle, &spidrv_eusart_init);
180-
if (sc != ECODE_EMDRV_SPIDRV_OK) {
181-
mp_raise_RuntimeError(MP_ERROR_TEXT("SPI re-init"));
182-
}
183-
in_used = true;
76+
77+
// FIXME: Implement
18478
return true;
18579
}
18680

18781
// Lock SPI bus
18882
bool common_hal_busio_spi_try_lock(busio_spi_obj_t *self) {
189-
if (common_hal_busio_spi_deinited(self)) {
190-
return false;
191-
}
192-
bool grabbed_lock = false;
193-
if (!self->has_lock) {
194-
grabbed_lock = true;
195-
self->has_lock = true;
196-
}
197-
198-
return grabbed_lock;
83+
// FIXME: Implement
84+
return false;
19985
}
20086

20187
// Check SPI lock status
@@ -213,18 +99,17 @@ bool common_hal_busio_spi_write(busio_spi_obj_t *self,
21399
const uint8_t *data,
214100
size_t len) {
215101

216-
Ecode_t result = SPIDRV_MTransmitB(self->handle, data, len);
217-
return result == ECODE_EMDRV_SPIDRV_OK;
102+
// FIXME: Implement
103+
return false;
218104
}
219105

220106
// Read data into buffer
221107
bool common_hal_busio_spi_read(busio_spi_obj_t *self,
222108
uint8_t *data, size_t len,
223109
uint8_t write_value) {
224110

225-
self->handle->initData.dummyTxValue = write_value;
226-
Ecode_t result = SPIDRV_MReceiveB(self->handle, data, len);
227-
return result == ECODE_EMDRV_SPIDRV_OK;
111+
// FIXME: Implement
112+
return false;
228113
}
229114

230115
// Write out the data in data_out
@@ -234,8 +119,8 @@ bool common_hal_busio_spi_transfer(busio_spi_obj_t *self,
234119
uint8_t *data_in,
235120
size_t len) {
236121

237-
Ecode_t result = SPIDRV_MTransferB(self->handle, data_out, data_in, len);
238-
return result == ECODE_EMDRV_SPIDRV_OK;
122+
// FIXME: Implement
123+
return false;
239124
}
240125

241126
// Get SPI baudrate

0 commit comments

Comments
 (0)