Skip to content

Commit b4fb858

Browse files
committed
first uart example
1 parent 8a25d02 commit b4fb858

File tree

2 files changed

+128
-1
lines changed

2 files changed

+128
-1
lines changed

docs/todo

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
- Update connection parameters are not allowed during iPhone HID encryption, slave turns off the ability to automatically update connection parameters during encryption.
33
- Bei einem erneuten verbindungsaufbau wird das gestoppte updaten der daten nicht wieder gestartet
44

5-
- Code cleanup
5+
- Code cleanup und kommentieren
6+
- ESP muss seine persistent private Adresse irgendwie zwischenspeichern für neustarts
7+
- der Report descriptor schickt einfach für alle 16 kanäle die kompletten 11 bit und macht da nichts spezielles somit sollte es dann egal sein, was damit gemacht wird --> vergleichen mit originalen Descriptor
68

79

810
Kann ich nicht ändern --> wie https://github.com/h2zero/NimBLE-Arduino/blob/release/1.4/src/NimBLEDevice.cpp alles gemacht:

main/crsf.c

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
#include <stdio.h>
2+
#include "freertos/FreeRTOS.h"
3+
#include "freertos/task.h"
4+
#include "driver/uart.h"
5+
#include "driver/gpio.h"
6+
#include "esp_log.h"
7+
8+
uint8_t crcSingleChar(uint8_t crc, uint8_t a)
9+
{
10+
crc ^= a;
11+
//zeichen wird acht mal nach links geschoben und jedes mal geschaut ob höchste stelle eine 1 ist, wenn dann polynom xor --> klassisches crc rechnen
12+
for (int i = 0; i < 8; i++) {
13+
crc = (crc << 1) ^ ((crc & 0x80) ? 0xD5 : 0);
14+
}
15+
return crc;
16+
}
17+
18+
//get crc from message
19+
uint8_t crcMessage(uint8_t message[], uint8_t length)
20+
{
21+
uint8_t crc = 0;
22+
for (int i = 0; i < length; i++) {
23+
crc = crcSingleChar(crc, message[i]);
24+
}
25+
return crc;
26+
}
27+
28+
static void echo_task(void *arg)
29+
{
30+
/* Configure parameters of an UART driver,
31+
* communication pins and install the driver */
32+
uart_config_t uart_config = {
33+
.baud_rate = 420000,
34+
.data_bits = UART_DATA_8_BITS,
35+
.parity = UART_PARITY_DISABLE,
36+
.stop_bits = UART_STOP_BITS_1,
37+
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
38+
.source_clk = UART_SCLK_APB,
39+
};
40+
41+
//UART 2 verwenden, da uart 0 für console benötigt wird und uart1 hab ich gelesen für spi oder irgendetwas anderes
42+
ESP_ERROR_CHECK(uart_driver_install(UART_NUM_2, 1024 * 2, 0, 0, NULL, 0));
43+
uart_set_line_inverse(UART_NUM_2,UART_SIGNAL_RXD_INV);
44+
ESP_ERROR_CHECK(uart_param_config(UART_NUM_2, &uart_config));
45+
ESP_ERROR_CHECK(uart_set_pin(UART_NUM_2, 4, 16, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
46+
47+
// Configure a temporary buffer for the incoming data
48+
uint8_t *data = (uint8_t *) malloc(1024);
49+
50+
//store channel data in array
51+
uint16_t channelData[16] = {0};
52+
53+
while (1) {
54+
// Read data from the UART
55+
int len = uart_read_bytes(UART_NUM_2, data, 1024, 20 / portTICK_RATE_MS);
56+
57+
//mit daten arbeiten, wenn welche vorhanden sind
58+
if(len > 0){
59+
//daten durchgehen
60+
for(int i = 0; i < len; i++){
61+
//Paketaufbau: 0xEE (Addresse) + 0x18 (Länge in Byte) + 0x16 (Typenfeld: Kanaldaten)
62+
if((data[i] == 0xEE) && (i+25)<len){
63+
if(data[i+2] == 0x16){
64+
//CRC überprüfen ob kein rest rauskommst
65+
if(crcMessage(data+i+2, data[i+1]) == 0){
66+
67+
//used = wie viel Bits bereits in einen Byte verwendet wurden
68+
int used = 0;
69+
//dataIndex = Index des Datenbytes im Buffer
70+
int dataIndex = i+3;
71+
72+
//Da 16 kanäle vorhanden sind muss es 16 mal durchgegangen werden
73+
for(int j = 0; j<16; j++){
74+
//Die restlichen vorhandenen Daten eines Bytes an LSB setzen
75+
uint16_t value = data[dataIndex] >> used;
76+
77+
//ein neues Byte muss verwendet werden
78+
dataIndex++;
79+
80+
//Anzahl der noch vorhanden Bits eines Bytes im angefangenen Byte
81+
uint8_t availableBits = 8-used;
82+
83+
if(11-availableBits > 8){
84+
//3Bytes werden benötigt, wenn für ein Kanal (11Bit) noch mehr als 8 Bit benötigt werden
85+
86+
//komplettes zweites Byte verwenden
87+
value = value | (data[dataIndex] << availableBits);
88+
//ein neues Byte muss verwendet werden
89+
dataIndex++;
90+
91+
//vom dritten Byte noch die benötigten Bits in die MSB stellen schieben
92+
value = value | ((data[dataIndex]&((1U << (11-(8+availableBits))) - 1U)) << (8+availableBits));
93+
94+
//Anzahl der verwendeten Bits im akutellen Byte neu berechnen
95+
used = 11-(8+availableBits);
96+
} else {
97+
//Wenn nur ein zweites Byte für 11Bit-Daten benötigt wird
98+
99+
//Aus dem zweiten Byte noch die fehlenden Bits an die MSB stellen schieben von 11 Bit
100+
value = value | ((data[dataIndex]&((1U << (11-availableBits)) - 1U)) << availableBits);
101+
102+
//berechnen wie viele Bits im aktuellen Byte schon verwendet wurden
103+
used = 11-availableBits;
104+
}
105+
106+
//Kanaldaten abspeichern
107+
channelData[j] = value;
108+
}
109+
//Kanaldaten ausgeben
110+
ESP_LOGI("Channel-Data","%4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d %4d", channelData[0], channelData[1], channelData[2], channelData[3], channelData[4], channelData[5], channelData[6], channelData[7], channelData[8], channelData[9], channelData[10], channelData[11], channelData[12], channelData[13], channelData[14], channelData[15]);
111+
break;
112+
}
113+
}
114+
}
115+
}
116+
//RX Buffer leeren wenn Frame gelesen wurde
117+
uart_flush(UART_NUM_2);
118+
}
119+
}
120+
}
121+
122+
void app_main(void)
123+
{
124+
xTaskCreate(echo_task, "uart_echo_task", 2048, NULL, 10, NULL);
125+
}

0 commit comments

Comments
 (0)