first and working ethernet
This commit is contained in:
181
ch9120.c
Normal file
181
ch9120.c
Normal file
@@ -0,0 +1,181 @@
|
||||
#include "ch9120.h"
|
||||
|
||||
static uint8_t CH9120_Mode = TCP_SERVER;
|
||||
static uint8_t CH9120_LOCAL_IP[4] = {192, 168, 1, 201};
|
||||
static uint8_t CH9120_GATEWAY[4] = {192, 168, 1, 1};
|
||||
static uint8_t CH9120_SUBNET_MASK[4] = {255, 255, 0, 0};
|
||||
static uint8_t CH9120_TARGET_IP[4] = {192, 168, 1, 10};
|
||||
static uint16_t CH9120_PORT1 = 1000;
|
||||
static uint16_t CH9120_TARGET_PORT = 2000;
|
||||
static uint32_t CH9120_BAUD_RATE = 115200;
|
||||
|
||||
static uint8_t tx[8] = {0x57, 0xAB};
|
||||
|
||||
static void CH9120_TX_4_bytes(uint8_t data, int command) {
|
||||
for (int i = 2; i < 4; i++) {
|
||||
if (i == 2)
|
||||
tx[i] = command;
|
||||
else
|
||||
tx[i] = data;
|
||||
}
|
||||
sleep_ms(10);
|
||||
for (int o = 0; o < 4; o++)
|
||||
uart_putc(UART_ID1, tx[o]);
|
||||
sleep_ms(10);
|
||||
for (int i = 2; i < 4; i++)
|
||||
tx[i] = 0;
|
||||
}
|
||||
|
||||
static void CH9120_TX_5_bytes(uint16_t data, int command) {
|
||||
uint8_t Port[2];
|
||||
Port[0] = data & 0xff;
|
||||
Port[1] = data >> 8;
|
||||
for (int i = 2; i < 5; i++) {
|
||||
if (i == 2)
|
||||
tx[i] = command;
|
||||
else
|
||||
tx[i] = Port[i - 3];
|
||||
}
|
||||
sleep_ms(10);
|
||||
for (int o = 0; o < 5; o++)
|
||||
uart_putc(UART_ID1, tx[o]);
|
||||
sleep_ms(10);
|
||||
for (int i = 2; i < 5; i++)
|
||||
tx[i] = 0;
|
||||
}
|
||||
|
||||
static void CH9120_TX_7_bytes(uint8_t data[], int command) {
|
||||
for (int i = 2; i < 7; i++) {
|
||||
if (i == 2)
|
||||
tx[i] = command;
|
||||
else
|
||||
tx[i] = data[i - 3];
|
||||
}
|
||||
sleep_ms(10);
|
||||
for (int o = 0; o < 7; o++)
|
||||
uart_putc(UART_ID1, tx[o]);
|
||||
sleep_ms(10);
|
||||
for (int i = 2; i < 7; i++)
|
||||
tx[i] = 0;
|
||||
}
|
||||
|
||||
static void CH9120_TX_BAUD(uint32_t data, int command) {
|
||||
uint8_t Port[4];
|
||||
Port[0] = (data & 0xff);
|
||||
Port[1] = (data >> 8) & 0xff;
|
||||
Port[2] = (data >> 16) & 0xff;
|
||||
Port[3] = data >> 24;
|
||||
|
||||
for (int i = 2; i < 7; i++) {
|
||||
if (i == 2)
|
||||
tx[i] = command;
|
||||
else
|
||||
tx[i] = Port[i - 3];
|
||||
}
|
||||
sleep_ms(10);
|
||||
for (int o = 0; o < 7; o++)
|
||||
uart_putc(UART_ID1, tx[o]);
|
||||
sleep_ms(10);
|
||||
for (int i = 2; i < 7; i++)
|
||||
tx[i] = 0;
|
||||
}
|
||||
|
||||
static void CH9120_Start() {
|
||||
// Hard reset the CH9120
|
||||
gpio_put(RES_PIN, 0);
|
||||
sleep_ms(100);
|
||||
gpio_put(RES_PIN, 1);
|
||||
sleep_ms(100);
|
||||
|
||||
// Enter configuration mode
|
||||
gpio_put(CFG_PIN, 0);
|
||||
sleep_ms(500);
|
||||
}
|
||||
|
||||
static void CH9120_End() {
|
||||
tx[2] = 0x0d;
|
||||
uart_write_blocking(UART_ID1, tx, 3);
|
||||
sleep_ms(200);
|
||||
tx[2] = 0x0e;
|
||||
uart_write_blocking(UART_ID1, tx, 3);
|
||||
sleep_ms(200);
|
||||
tx[2] = 0x5e;
|
||||
uart_write_blocking(UART_ID1, tx, 3);
|
||||
sleep_ms(200);
|
||||
gpio_put(CFG_PIN, 1);
|
||||
}
|
||||
|
||||
void CH9120_init(void) {
|
||||
uart_init(UART_ID1, INIT_BAUD_RATE);
|
||||
gpio_set_function(UART_TX_PIN1, GPIO_FUNC_UART);
|
||||
gpio_set_function(UART_RX_PIN1, GPIO_FUNC_UART);
|
||||
|
||||
gpio_init(CFG_PIN);
|
||||
gpio_init(RES_PIN);
|
||||
gpio_set_dir(CFG_PIN, GPIO_OUT);
|
||||
gpio_set_dir(RES_PIN, GPIO_OUT);
|
||||
|
||||
printf("CH9120 Configuration:\n");
|
||||
printf("Mode: %s\n", (CH9120_Mode == TCP_SERVER) ? "TCP_SERVER" : "TCP_CLIENT");
|
||||
printf("Local IP: %d.%d.%d.%d\n", CH9120_LOCAL_IP[0], CH9120_LOCAL_IP[1], CH9120_LOCAL_IP[2], CH9120_LOCAL_IP[3]);
|
||||
printf("Gateway: %d.%d.%d.%d\n", CH9120_GATEWAY[0], CH9120_GATEWAY[1], CH9120_GATEWAY[2], CH9120_GATEWAY[3]);
|
||||
printf("Subnet: %d.%d.%d.%d\n", CH9120_SUBNET_MASK[0], CH9120_SUBNET_MASK[1], CH9120_SUBNET_MASK[2], CH9120_SUBNET_MASK[3]);
|
||||
printf("Local Port: %d\n", CH9120_PORT1);
|
||||
|
||||
printf("Starting CH9120 configuration...\n");
|
||||
CH9120_Start();
|
||||
printf("Setting mode...\n");
|
||||
CH9120_TX_4_bytes(CH9120_Mode, Mode1);
|
||||
printf("Setting local IP...\n");
|
||||
CH9120_TX_7_bytes(CH9120_LOCAL_IP, LOCAL_IP);
|
||||
printf("Setting subnet mask...\n");
|
||||
CH9120_TX_7_bytes(CH9120_SUBNET_MASK, SUBNET_MASK);
|
||||
printf("Setting gateway...\n");
|
||||
CH9120_TX_7_bytes(CH9120_GATEWAY, GATEWAY);
|
||||
printf("Setting target IP...\n");
|
||||
CH9120_TX_7_bytes(CH9120_TARGET_IP, TARGET_IP1);
|
||||
printf("Setting local port...\n");
|
||||
CH9120_TX_5_bytes(CH9120_PORT1, LOCAL_PORT1);
|
||||
printf("Setting target port...\n");
|
||||
CH9120_TX_5_bytes(CH9120_TARGET_PORT, TARGET_PORT1);
|
||||
printf("Setting baud rate...\n");
|
||||
CH9120_TX_BAUD(CH9120_BAUD_RATE, UART1_BAUD1);
|
||||
printf("Finalizing configuration...\n");
|
||||
CH9120_End();
|
||||
|
||||
uart_set_baudrate(UART_ID1, TRANSPORT_BAUD_RATE);
|
||||
|
||||
while (uart_is_readable(UART_ID1)) {
|
||||
uart_getc(UART_ID1);
|
||||
}
|
||||
|
||||
printf("CH9120 initialization complete\n");
|
||||
}
|
||||
|
||||
void CH9120_send_data(const char *data, size_t len) {
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
if (uart_is_writable(UART_ID1)) {
|
||||
uart_putc(UART_ID1, data[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int CH9120_receive_data(char *buffer, size_t max_len) {
|
||||
size_t count = 0;
|
||||
while (uart_is_readable(UART_ID1) && count < max_len) {
|
||||
buffer[count++] = uart_getc(UART_ID1);
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
void CH9120_process(void) {
|
||||
char buffer[256];
|
||||
int received = CH9120_receive_data(buffer, sizeof(buffer) - 1);
|
||||
if (received > 0) {
|
||||
buffer[received] = '\0';
|
||||
printf("Received: %s\n", buffer);
|
||||
|
||||
CH9120_send_data("ACK: ", 5);
|
||||
CH9120_send_data(buffer, received);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user