@@ -51,6 +51,7 @@ typedef struct
51
51
uint32_t baudrate ;
52
52
volatile softuart_buffer_t buffer ;
53
53
uint16_t bit_time ;
54
+ bool invert ;
54
55
} softuart_t ;
55
56
56
57
static softuart_t uarts [SOFTUART_MAX_UARTS ] = { { 0 } };
@@ -96,7 +97,7 @@ static void handle_rx(void *arg)
96
97
d >>= 1 ;
97
98
98
99
// Read bit
99
- if (gpio_get_level (uart -> rx_pin ))
100
+ if (gpio_get_level (uart -> rx_pin ) ^ uart -> invert )
100
101
{
101
102
// If high, set msb of 8bit to 1
102
103
d |= 0x80 ;
@@ -121,7 +122,7 @@ static void handle_rx(void *arg)
121
122
ets_delay_us (uart -> bit_time );
122
123
123
124
// Done, reenable interrupt
124
- gpio_set_intr_type (uart -> rx_pin , GPIO_INTR_NEGEDGE );
125
+ gpio_set_intr_type (uart -> rx_pin , uart -> invert ? GPIO_INTR_POSEDGE : GPIO_INTR_NEGEDGE );
125
126
// gpio_isr_handler_add(uart->rx_pin, handle_rx, (void *)(uart->rx_pin));
126
127
}
127
128
@@ -151,7 +152,7 @@ static bool check_uart_enabled(uint8_t uart_no)
151
152
/// Public
152
153
///////////////////////////////////////////////////////////////////////////////
153
154
154
- bool softuart_open (uint8_t uart_no , uint32_t baudrate , uint32_t rx_pin , uint32_t tx_pin )
155
+ bool softuart_open (uint8_t uart_no , uint32_t baudrate , uint32_t rx_pin , uint32_t tx_pin , bool invert )
155
156
{
156
157
// do some checks
157
158
if (!check_uart_no (uart_no )) return false;
@@ -175,6 +176,7 @@ bool softuart_open(uint8_t uart_no, uint32_t baudrate, uint32_t rx_pin, uint32_t
175
176
uart -> baudrate = baudrate ;
176
177
uart -> rx_pin = rx_pin ;
177
178
uart -> tx_pin = tx_pin ;
179
+ uart -> invert = invert ;
178
180
179
181
// Calculate bit_time
180
182
uart -> bit_time = (1000000 / baudrate );
@@ -202,12 +204,12 @@ bool softuart_open(uint8_t uart_no, uint32_t baudrate, uint32_t rx_pin, uint32_t
202
204
203
205
// gpio_enable(tx_pin, GPIO_MODE_OUTPUT);
204
206
// gpio_pullup_en(tx_pin);
205
- gpio_set_level (tx_pin , 1 );
207
+ gpio_set_level (tx_pin , ! uart -> invert );
206
208
207
209
//install gpio isr service
208
210
gpio_install_isr_service (0 );
209
211
// Setup the interrupt handler to get the start bit
210
- gpio_set_intr_type (rx_pin , GPIO_INTR_NEGEDGE );
212
+ gpio_set_intr_type (rx_pin , uart -> invert ? GPIO_INTR_POSEDGE : GPIO_INTR_NEGEDGE );
211
213
gpio_isr_handler_add (rx_pin , handle_rx , (void * )rx_pin );
212
214
213
215
ets_delay_us (1000 ); // TODO: not sure if it really needed
@@ -238,7 +240,7 @@ bool softuart_put(uint8_t uart_no, char c)
238
240
softuart_t * uart = uarts + uart_no ;
239
241
240
242
uint32_t start_time = 0x7FFFFFFF & esp_get_time ();
241
- gpio_set_level (uart -> tx_pin , 0 );
243
+ gpio_set_level (uart -> tx_pin , uart -> invert );
242
244
243
245
for (uint8_t i = 0 ; i <= 8 ; i ++ )
244
246
{
@@ -247,15 +249,15 @@ bool softuart_put(uint8_t uart_no, char c)
247
249
if ((0x7FFFFFFF & esp_get_time ()) < start_time )
248
250
break ;
249
251
}
250
- gpio_set_level (uart -> tx_pin , c & (1 << i ));
252
+ gpio_set_level (uart -> tx_pin , c & ((! uart -> invert ) << i ));
251
253
}
252
254
253
255
while ((0x7FFFFFFF & esp_get_time ()) < (start_time + (uart -> bit_time * 9 )))
254
256
{
255
257
if ((0x7FFFFFFF & esp_get_time ()) < start_time )
256
258
break ;
257
259
}
258
- gpio_set_level (uart -> tx_pin , 1 );
260
+ gpio_set_level (uart -> tx_pin , ! uart -> invert );
259
261
ets_delay_us (uart -> bit_time * 6 );
260
262
261
263
return true;
@@ -272,6 +274,16 @@ bool softuart_puts(uint8_t uart_no, const char *s)
272
274
return true;
273
275
}
274
276
277
+ bool softuart_putn (uint8_t uart_no , const uint8_t * s , size_t n ) {
278
+ for (size_t i = 0 ; i < n ; i ++ ) {
279
+ if (!softuart_put (uart_no , s [i ])) {
280
+ return false;
281
+ }
282
+ }
283
+
284
+ return true;
285
+ }
286
+
275
287
bool softuart_available (uint8_t uart_no )
276
288
{
277
289
if (!check_uart_no (uart_no )) return false;
0 commit comments