#include #include #include #include #include #include #include "bk_private/bk_init.h" #include #include #include #include "cli.h" #include "media_service.h" #include #include #include #if CONFIG_BUTTON #include #include #endif #include "sys_driver.h" #include "sys_hal.h" #include #include "gpio_driver.h" #include "bk_genie_comm.h" #include "wifi_boarding_utils.h" #if (CONFIG_SYS_CPU0) #include "beken_config.h" #include "aud_intf.h" #include "bk_factory_config.h" #if CONFIG_NETWORK_AUTO_RECONNECT #include "bk_genie_smart_config.h" #endif #include "motor.h" #endif #include "app_event.h" #include "countdown.h" #include #include #include "components/bluetooth/bk_dm_bluetooth.h" #include #include #include #include #include const int RED = 0x00FF00; const int BLUE = 0x0000FF; const int GREEN = 0xFF0000; const int WHITE = 0xFFFFF; typedef struct { beken_thread_t handle; beken_semaphore_t uart_rx_semaphore; beken_semaphore_t spi_tx_finish_semaphore; spi_role_t role; uint32_t baud_rate; spi_id_t spi_id; uart_id_t uart_id; uint32_t data_len; uint8_t *data; uint8_t *uart_get_data; uint8_t *spi_get_buffer; dma_id_t spi_tx_dma_chan; /**< SPI tx dma channel */ dma_id_t spi_rx_dma_chan; /**< SPI rx dma channel */ bool exchange_flag; } spi_data_test_config_t; spi_data_test_config_t s_spi_test; int adjustColorBrightness(int color, float brightness) { // 提取红、绿、蓝通道的值 int red = (color >> 16) & 0xFF; int green = (color >> 8) & 0xFF; int blue = color & 0xFF; // 根据亮度值对每个通道的值进行缩放 red = (int)(red * brightness); green = (int)(green * brightness); blue = (int)(blue * brightness); // 重新组合成新的颜色值 return (red << 16) | (green << 8) | blue; } int open_dmaspi(int color, float brightness){ bk_printf("SPI xinxin\n"); int controlled_lednum = 6; // int total_lednum = 6; bk_err_t err; spi_config_t config = {0}; config.role = SPI_ROLE_MASTER; config.bit_width = SPI_BIT_WIDTH_8BITS; config.polarity = 0; config.phase = 0; config.wire_mode = SPI_4WIRE_MODE; config.baud_rate = 6500000; config.bit_order = SPI_MSB_FIRST; // gpio_dev_unmap(GPIO_46); // config.dma_mode = 1; // // 分配DMA通道 // config.spi_tx_dma_chan = bk_dma_alloc(DMA_DEV_GSPI0); // config.spi_tx_dma_width = DMA_DATA_WIDTH_8BITS; config.dma_mode = 1; s_spi_test.spi_tx_dma_chan = bk_dma_alloc(DMA_DEV_DTCM); config.spi_tx_dma_chan = s_spi_test.spi_tx_dma_chan; s_spi_test.spi_rx_dma_chan = bk_dma_alloc(DMA_DEV_DTCM); config.spi_rx_dma_chan = s_spi_test.spi_rx_dma_chan; config.spi_tx_dma_width = DMA_DATA_WIDTH_8BITS; config.spi_rx_dma_width = DMA_DATA_WIDTH_8BITS; // bk_spi_driver_init(); // bk_spi_init(0, &config); err = bk_spi_driver_init(); if (err != BK_OK) { bk_printf("SPI driver init failed, err: %d\n", err); return -1; } bk_spi_init(0, &config); // bk_spi_register_tx_finish_isr(0, (spi_isr_t)spi_data_test_tx_finish_isr, NULL); // 初始化 SPI 设备 // err = bk_spi_init(0, &config); // if (err != BK_OK) { // bk_printf("SPI init failed, err: %d\n", err); // bk_spi_driver_deinit(); // return -1; // } // 注册发送完成回调函数 int tx_len = 6 * 24; // 6 个灯,每个灯 24 位 UINT8 *buf = os_malloc(tx_len * sizeof(UINT8)); if (buf == NULL) { bk_printf("Memory allocation failed!\n"); return -1; } int index = 0; // 对颜色进行亮度调整 int adjustedColor = adjustColorBrightness(color, brightness); // 为灯填充数据 for (int j = 0; j < controlled_lednum; j++) { for (int i = 23; i >= 0; i--) { int bit = (adjustedColor >> i) & 0x01; if (bit) { buf[index++] = 0xFC; } else { buf[index++] = 0xE0; } } } // for (int i = 0; i < tx_len; i++) // { // buf[i] = 0xFC; // } // 发送数据 err = bk_spi_dma_write_bytes(0, buf, tx_len); // err = bk_spi_write_bytes(0, buf, tx_len); if (err != BK_OK) { bk_printf("SPI write bytes failed, err: %d\n", err); } else { bk_printf("SPI write bytes success\n"); } rtos_delay_milliseconds(100); // 释放DMA通道 //bk_dma_free(DMA_DEV_GSPI0, config.spi_tx_dma_chan); // 反初始化SPI // bk_spi_deinit(id); os_free(buf); bk_spi_deinit(0); bk_dma_free(DMA_DEV_DTCM, s_spi_test.spi_tx_dma_chan); bk_dma_free(DMA_DEV_DTCM, s_spi_test.spi_rx_dma_chan); return 0; } void clearallled() { // int controlled_lednum = 6; int total_lednum = 6; int err; spi_config_t config = {0}; config.role = SPI_ROLE_MASTER; config.bit_width = SPI_BIT_WIDTH_8BITS; config.polarity = 0; config.phase = 0; config.wire_mode = SPI_4WIRE_MODE; config.baud_rate = 8000000; config.bit_order = SPI_MSB_FIRST; // gpio_dev_unmap(GPIO_46); config.dma_mode = 1; s_spi_test.spi_tx_dma_chan = bk_dma_alloc(DMA_DEV_DTCM); config.spi_tx_dma_chan = s_spi_test.spi_tx_dma_chan; s_spi_test.spi_rx_dma_chan = bk_dma_alloc(DMA_DEV_DTCM); config.spi_rx_dma_chan = s_spi_test.spi_rx_dma_chan; config.spi_tx_dma_width = DMA_DATA_WIDTH_8BITS; config.spi_rx_dma_width = DMA_DATA_WIDTH_8BITS; err = bk_spi_driver_init(); if (err != BK_OK) { bk_printf("SPI driver init failed, err: %d\n", err); return ; } bk_spi_init(0, &config); int tx_len = total_lednum * 24; // 6 个灯,每个灯 24 位 UINT8 *buf = os_malloc(tx_len * sizeof(UINT8)); if (buf == NULL) { bk_printf("Memory allocation failed!\n"); return; } // 先将整个 buf 数组初始化为 0 for (int i = 0; i < tx_len; i++) { buf[i] = 0xC0; } err = bk_spi_dma_write_bytes(0, buf, tx_len); // err = bk_spi_write_bytes(0, buf, tx_len); if (err != BK_OK) { bk_printf("SPI write bytes failed, err: %d\n", err); } else { bk_printf("SPI write bytes success\n"); } rtos_delay_milliseconds(100); // 释放DMA通道 //bk_dma_free(DMA_DEV_GSPI0, config.spi_tx_dma_chan); // 反初始化SPI // bk_spi_deinit(id); os_free(buf); bk_spi_deinit(0); bk_dma_free(DMA_DEV_DTCM, s_spi_test.spi_tx_dma_chan); bk_dma_free(DMA_DEV_DTCM, s_spi_test.spi_rx_dma_chan); return; } // 控制多个灯同时显示指定颜色,并可调节亮度 void setAllLedsColor(int color, float brightness) { bk_err_t err; int controlled_lednum = 6; int total_lednum = 6; spi_config_t config = {0}; config.role = SPI_ROLE_MASTER; config.bit_width = SPI_BIT_WIDTH_8BITS; config.polarity = 0; config.phase = 0; config.wire_mode = SPI_4WIRE_MODE; config.baud_rate = 6500000; config.bit_order = SPI_MSB_FIRST; // gpio_dev_unmap(GPIO_46); bk_spi_driver_init(); bk_spi_init(0, &config); bk_printf("SPI blue\n"); err = bk_spi_driver_init(); if (err != BK_OK) { bk_printf("SPI driver init failed, err: %d\n", err); // bk_spi_driver_deinit(); return ; } // 初始化 SPI 设备 err = bk_spi_init(0, &config); if (err != BK_OK) { bk_printf("SPI init failed, err: %d\n", err); // bk_spi_driver_deinit(); return ; } int tx_len = total_lednum * 24; // 6 个灯,每个灯 24 位 UINT8 *buf = os_malloc(tx_len * sizeof(UINT8)); if (buf == NULL) { bk_printf("Memory allocation failed!\n"); // bk_spi_driver_deinit(); return; } // 先将整个 buf 数组初始化为 0 // 先将整个 buf 数组初始化为 0 对应的编码 if (controlled_lednum != total_lednum) { for (int i = 0; i < tx_len; i++) { buf[i] = 0xC0; } } // os_memset(buf, 0, tx_len); bk_printf("setAllLedsColor\n"); int index = 0, ret; // 对颜色进行亮度调整 int adjustedColor = adjustColorBrightness(color, brightness); // 为灯填充数据 for (int j = 0; j < controlled_lednum; j++) { for (int i = 23; i >= 0; i--) { int bit = (adjustedColor >> i) & 0x01; if (bit) { buf[index++] = 0xFC; } else { buf[index++] = 0xC0; } } } ret = bk_spi_write_bytes(0, buf, tx_len); if (ret) bk_printf("spi dma send error%d\r\n", ret); else { for (int i = 0; i < tx_len; i++) { bk_printf("%02x,", buf[i]); if ((i + 1) % 32 == 0) bk_printf("\r\n"); } bk_printf("\r\n"); } os_free(buf); //bk_spi_driver_deinit(); return; } // void turnonall_Led(int Colour,float brightness){ // // float brightness = 1; // 亮度值,范围从 0.0 到 1.0 // setAllLedsColor(Colour, brightness); // } static int colorIndex = 0; void turnonall_Led(float brightness) { int colors[] = {RED, GREEN, WHITE}; int currentColor = colors[colorIndex]; // 调用设置颜色的函数 open_dmaspi(currentColor, brightness); // 更新颜色索引,实现循环 colorIndex = (colorIndex + 1) % 3; }