#include "stdint.h" #include "driver/uart.h" #include "dfplayermini.h" #define BUF_SIZE (1024) #define PACKET_LEN (8) #define BYTE_START (0x7E) #define BYTE_END (0xEF) struct DFPlayerMini { uart_config_t *uart_config; } dfplayermini; /* * 0x7E START * 0xFF VER * 0x06 LEN * 0x00 ACK * 0x01 CMD * 0x00 PARAM-hi * 0x00 PARAM-lo * 0x00 CHECK-hi * 0x00 CHECK-lo * 0xEF FIN */ uint8_t packet[] = { 0x7E, 0xFF, 0x06, 0x00, 0x01, 0x00, 0x00, 0xEF }; uint8_t send_packet(uint8_t cmd, uint8_t arg_low, uint8_t arg_high) { uint8_t i = 0; uint16_t sum = 0; packet[3] = cmd; packet[4] = 1; packet[5] = arg_high; packet[6] = arg_low; for(i = 1; i < 7; i++) { sum += packet[i]; } //packet[7] = -sum << 8; //packet[8] = -sum; return uart_write_bytes(UART_NUM_1, (const char*)&packet, PACKET_LEN); } uint8_t set_volume(uint8_t vol) { return send_packet(0x06, vol, 0); } void dfplayermini_uart_read_task(void *arg) { setvbuf(stdout, NULL, _IONBF, 0); uint8_t buf[PACKET_LEN]; uint8_t err; uint8_t idx = 0; uint8_t inited = 0; uint8_t timeout = 1; while(true) { int len = uart_read_bytes(UART_NUM_1, &buf[idx], 1, 20 / portTICK_RATE_MS); if(len == 0) { if(inited == 0 && timeout++ == 0) { printf("timeout, sending reset\n"); send_packet(0x0C, 0, 0); } continue; } if(buf[0] == BYTE_START) { printf("0x%02X ", buf[idx]); idx++; //printf("got start byte\n"); } if(buf[idx - 1] == BYTE_END) { printf("\n"); switch(buf[3]) { case 0x3F: printf("player ready\n"); inited = 1; //send_packet(0x0C, 0, 0); //vTaskDelay(10 / portTICK_RATE_MS); //if(!(err = send_packet(0x09, 1, 0))) { //printf("Failed to set play source: %d\n", err); //} if(!(err = set_volume(10))) { printf("Failed to set volume: %d\n", err); } vTaskDelay(100 / portTICK_RATE_MS); send_packet(0x03, 0, 0); break; } idx = 0; } } } uint8_t dfplayermini_init() { uart_config_t uart_config = { .baud_rate = 9600, .data_bits = UART_DATA_8_BITS, .parity = UART_PARITY_DISABLE, .stop_bits = UART_STOP_BITS_1, .flow_ctrl = UART_HW_FLOWCTRL_DISABLE, .source_clk = UART_SCLK_APB, }; dfplayermini.uart_config = &uart_config; uart_driver_install(UART_NUM_1, BUF_SIZE * 2, 0, 0, NULL, 0); uart_param_config(UART_NUM_1, dfplayermini.uart_config); uart_set_pin(UART_NUM_1, 13, 34, -1, -1); xTaskCreate(dfplayermini_uart_read_task, "dfplayermini_uart_read_task", 2048, NULL, 10, NULL); return 0; }