RYMCU

启英泰伦 CI1303 算法 SDK 开发入门教程

ronger 7 天前
# 启英泰伦 # CI1303

前期准备

  1. 下载 纯离线 SDK-算法版:CI130X_SDK_ALG
  2. 编译软件安装与使用

SDK 软件结构

SDK 目录结构

--components                 // 功能组件
----asr                      // 语音识别
----alg                      // 语音前处理算法库
------denoise                // 降噪
----assist                   // 辅助函数,例如:测试算法的计时函数等
----audio_in_manage          // 音频采集实时任务
----audio_pre_rslt_iis_out   // 语音前处理结果输出组件
----ci_nvdm                  // 用户数据管理
----cmd_info                 // 固件信息解析
----codec_manage             // codec管理器
----fft                      // fft管理器
----flash_control            // flash管理器
----flash_encrypt            // flash加密策略
----freertos                 // 操作系统
----led                      // 三色灯控管理器
----log                      // 日志打印
----msg_com                  // 串口协议
----ota                      // OTA升级
----player                   // 播放器
----RISCV                    // RISCV相关
----sys_monitor              // 系统监控器
--projects                   // 应用示例代码
----offline_asr_sample       // ci13XX系列芯片模板工程
--driver                     // 驱动
----boards                   // 板级支持,例如1302/1306
----ci130x_chip_driver       // 芯片内部驱动,如IIC驱动
----third_device_driver      // 外部驱动,如外部codec驱动ES8388
--startup                    // 启动代码
--system                     // 统一使用的头定义等
--tools                      // 固件构建工具
--utils                      // 调试工具集

用户代码区域

SDK 用户代码区域

下列文件所在目录:CI130X_SDK/projects/offline_asr_sample/src/

文件名 描述
sample_main.c 主函数所在文件:包含任务创建、平台初始化、系统启动代码
system_hook.c 事件钩子接口 c 文件:系统启动、唤醒、退出唤醒、语音识别事件钩子函数
system_hook.h 事件钩子接口 h 文件
system_msg_deal.c 系统消息处理任务 c 文件
system_msg_deal.h 系统消息处理任务 h 文件
user_config.h 用户配置宏定义.h 文件
user_msg_deal.c 用户代码.c 文件:串口协议、IIC 协议、按键消息等用户处理
user_msg_deal.h 用户代码.h 文件

添加代码示例

以实现串口播放外部音频功能为例,找到 CI130X_SDK/projects/offline_asr_sample/src

  1. 先修改 user_config.h

    • 找到 USE_CI_D02GS02S_BOARD, 并在下方添加 CI1303 模块配置代码

      userconfig1.png

      #define USE_CI_D03GS02S_BOARD       1  //CI-D0XGS02S,SMT模块,芯片型号必须设置为1303
      
      #elif (USE_CI_D03GS02S_BOARD == 1)
      #define CI_CHIP_TYPE                1303    //flash:4MB,SSOP24
      #define BOARD_PORT_FILE             "CI-D03GS02S.c"
      
    • 配置时钟源为内部时钟源, 找到 USE_EXTERNAL_CRYSTAL_OSC, 在判断条件中增加 || (CI_CHIP_TYPE == 1303)

      userconfig4.png

      //**时钟源配置
      #if ((CI_CHIP_TYPE == 1312) || (CI_CHIP_TYPE == 1311) || (CI_CHIP_TYPE == 1303))
      #define USE_EXTERNAL_CRYSTAL_OSC        0
      #else
      #define USE_EXTERNAL_CRYSTAL_OSC        1           //0:使用内部RC作为时钟源。1:使用外部晶振作为时钟源。
      #endif
      
    • 关闭波特率自适应功能配置, 找到 UART_BAUDRATE_CALIBRATE, 修改为 #define UART_BAUDRATE_CALIBRATE 0

      userconfig5.png

      //**波特率自适应功能配置
      #if (USE_EXTERNAL_CRYSTAL_OSC == 0)             //使用内部RC时,建议开启波特率自适应(需要电控增加对应支持)。
      #define UART_BAUDRATE_CALIBRATE         0       //是否使能波特率自适应功能。
      ...
      #endif
      
    • 关闭语音模块通讯协议(暂时不使用该功能)

      image.png

      #define MSG_COM_USE_UART_EN            0   //0,关闭语音模块通讯协议。1,开启语音模块通讯协议。
      
    • 开启通过串口接收音频数据播放配置, 找到 VOICE_PLAY_BY_UARTPCM_VOICE_PLAY_BY_UART 修改为相应的配置
      userconfig3.png

      #define VOICE_PLAY_BY_UART                 (1)                   //通过串口接收音频数据播放配置
      
      // 设置 PCM_VOICE_PLAY_BY_UART 为 0, 开启 MP3 格式支持
      #define PCM_VOICE_PLAY_BY_UART      (0)                          //播放PCM格式 PCM和MP3格式只能选一个
      
  2. 修改 cias_uart_protocol.h

    • 修改 UART_VOICE_BAUDUART_BaudRate921600
      image.png
  3. 修改 cias_uart_protocol.c

    • 找到 network_recv_data_task, 修改 scu_set_dma_mode(DMAINT_SEL_CHANNELALL);scu_set_dma_mode(DMAINT_SEL_CHANNEL1);
      ciasuartprotocol1.png

示例代码文件

主控端发送测试音频数据示例

#include <Arduino.h>

// 请再说一遍.mp3
const char* mp3_data = "4944330300000000001E505249560000000A000043493E0A000000510000FFF328C4000A083A6C094210008FFF3870307E0FFFFE08063FFFFF0C7FCBBFE5C3FFEA04C1F7CB820084B83808021503F041CA040E2A005DB61860000001B5D66B2C400FC8154752FFF328C41210E846FE5F8210028A7309A5DB3FFFFFE5320F5B832C48A3830030BA0B88D09DCA0FA00CF282A3C5C06E04D5349B5A503268BC5A932F43B7BF5DB6C175DB6D5BC00243FFF328C4090DE19EF65DC71002F3B4D3CD78DC78AB9EC9CFF7454DF44F46DD3B7FE4D7EC43C207F995E1CA2D5D843A030B042692FA37ACB2042C51859364ACC36000E0A3C78F633CFFF328C40C0F405ADE5AC6D826624614367136A70A4ED4CC4021C9CE84131DEEE19AAA82EF5848187736544298352DFFFFF26D875EDFFF7A58CFFD8BBBE852D4DDBB60004826A7B9FFF328C40A0F08CEE25CE6104A7E89C7311238DF13934811CDA42EBACFDC4CBCEA28C9AD6B4810B7FDA5FF096B0D1B8C1C6F702946BFFFFFFFECBDBFFFFE852A24111B8DD0284E81FFF328C4080DE8E2CA5EC850CA9EBF0AEDD02D52C697CAE597E61743ACCFE1CA7CEA3B7155E10FDFE157F8500CCDE879BFFFFD6A7FFF3DFFFFCB3E786D088984FC2067D0B566058AFFF328C40B0E90C27028EED44C2786B4E6780300608D04E201C3171A332F236315050340331B89954112EB7D4CF94267F2A35F1E00D05F3E05FFFFE555407FF8296437351D8002DBFFF328C40B0F51CE9034C804F09E052135D88C3E70729929B4BFF5CC79AFC379FF3F5915CF914C57610722A124FFE8D50E608BB97E7C3E5DEEFFEE88393587D545BBC67E650C401CFFF328C4080D6182C400788CF40DB79F38903300C05E27D7957411C1F936B84006FFFAFFFFFFFE84BEB66107D794CC0821922CFFFABBFFFFABE27547E897C95B7713A2EB52AC3600FFF328C40D0EBA2ED4006AC5A075858B73A3C8A3F5A5FAFFA1FDBF537EAFC9E412F16F9403409AD3F06861F92FF27F27EE5F903F57FF4F04B59CD661EAF15B6802801BEA0A9711C9FFF328C40D0C19970E5C38058299384800C6A9C6880401BFA88BAF1D0949FC7471BE712FFFCDFE6144FC63FABFF2A432D581F71059E3584C6007F802493CA70C7AC5C007D7EE8138FFF328C4170C78C70A7C13DA2696EEC647D2BF938797D66251E55D95FE9E8E15E47FFBB2CFFFFFD667F0907C74DA903C3FA7D90DE8DFF9363EEA2E85170810CA2050F8F20716459DFFF328C4200E2ABED400280ABD50843F9FA2BE82943115D505087880A098EC3ADD91FADC323D02DA06080D1A8F1523FFFFFD02E32DFFF757FF21350CC006E636283A113CD8EA9404FFF328C4220C4006F9FC00440272CC9C0683613489C2232160934F1080AAAAB9A0003802E0A8CBB884F4423EBC528076299BD1199FEE30EBAC59C65B3E11C3EEFFFFD7CC8262CC62FFF328C42C0AC05F37187830025B2DB6C48000E02AFF9311802213E6301DF51AACCAE21399D0084A9B10E640215420E64501504CDFE3859FACD7101CE50CAACD092DAE5806ADE71AFFF328C43C0C88AAFE583E8E322D108D5BFAC4AC89CAA6A60B56C7008F80C614D2FC6B138DFCEA7FCA426F34334D76D23304DDABFEBA08000484481BEA4589A1383CFBAEB1DA0071FFF328C4440C611B01B83E64A20E357E4D05A4869BFD05871FF953FA80A3879FF42649437A27D2715ECFFFF91335818A0396D96B8C03A999407911BE3019BF4701441FFA19FFD1FFFFF328C44D0C992EDDB869530CD4C6FE6501401103FE86090281FFC08776B4794FB7FFFFC00A247355880FD499384E8BD06DC2DB3F465017C3689D52FF5A2DFE93FFFFA18DF57121FFF328C4550C998F0E5C080A0286BC4E04079FFF17FFBC52A865D51581D26C0120E643A93CCA0035445BD7E8E40760950FC103DFFFFFFFFFAD4282A6804830DDB75EEF4F1841A689FFF328C45D0BD9B2DDC88005482C26D154AA683368790A0000966005F63D41580B25DDB96A0800FE9DDB7AC97FFFFFFFFE3C880870A0619D202ABFA3AA1D0B855D90039E8001B800FFF328C4680C4856DE640E10240CEFA0A2702AC518D5F59D62E865AD6AB153BFFFFFFFFFF482A34E950E82AE160296FEBE123C1A2C98341D416C5B5B97638FF85CC8E1E10C744C02FFF328C4710BB853231E135E2A0A442ABDA432E99652F6C6B0A66FFFFFFFFFFC88499114F2858F7FFF962D32259B162708FAB0129E4627E1D0173FF29C90B3BFC2F97FFFFFFD0FFFFFF328C47D0C8052D6664C5E0C773440C8C7FDDAB734281812E5D351CE267FF5B928B51B99BA8CCCCBE3F8F412B2584B025FFFD97BFF0E78C204ECE1A17CC6481AAC613FFFE9FFF9FFF328C4860B405284035B1000A9BA0EA370C7ED278BADD440832181B51E2CD2F2FB188FE7D3FFFFFFFFFFFFFFFFFF2273526C8942882B88311617E6142A4614006C6C3C241FA9A6FFF328C49417F3029C0B9868018C02FC2E05838C1F9CC6171102B85F8AE261EE6911AE61013F671E2918F0C452A444A3F27542063C805813D2B896F61BC0091FFCEAF43FCE00928CFFF328C46F17FAA2C801D45000FDD7FCDF47C815456B83B78F701BE526FCE167F9AFFE77F8F166FEBFFFFA18DEEA3A1420FE68D46A34FCE38E1E2DEEAC541E10A70E7580F0581A05FFF328C44A133A2EE5BA7B4EC6EDA83F518413DC7F49A0391E4CC5C9C17F732FCBF3C9E232265FF8E5CD6FDFE4E80040C969B14975A416C0407F93075FE6620697EA3A328F7EA407FFF328C43816222AE65A0E5A3A87F51207BF40AC3D1654D75ACC879A4FFA45DFEA51DD5F2A3A47B3D3E67A033EE50200009B6D4027EE3D44D4621B7D2998294AFCBF80460BD758FEFFF328C41A12018EEE5A6E14E63DF95BEEC1E77EAE68867FA0A83D26FA0F05415495BA346054B2DC7813CF3D3E8A3F2822495BFFFEA23FFFF799EB00A1127FFE40FF1302FECDAC2AFFF328C40D0D010B06582BD0929CC5FFFBA2012E0B559DFFA888B25A4296BFE922505475FE9458B337E8858B12755F8178600A1A02717B53FCD01001FCA00D0721EDF185E6682D99FFF328C4140C98B71E5E3BC4A6B13C2906315BD8E5F210005809E583EC3B60B7633D710098341C67FFFFFD2A0146902E4000282418085287EF3A767EEF4CD195E1C0ECB87864080DFFF328C41C0C986AF65C03D8223CA02C0AC1310F7BFFFCC24C9D77FFFFFD4AFFFFD891F54CC6C00E5008301FCA0080DE87CBCEC05A13F3FEA0C822CB100E9D2803069E16013DC261FFF328C4240D3862F25C3B12462A100E7FE916220C910D33FFFFFEA8B2545063935F8A000821EFE58D0F1627DF6A83F1C50779E3DDB8D19A367F618219DB7633E1402756FFF9B7F4FFF328C42A0D209ED25D4F10009D06946BFFFFFFFFFFF90A11060840051E0A3345156DAD6806A5B0AEDBBBF33E8983B01937E200B45E40EA29728F7B7DBD5FFF489BDBFC7B191C63FFF328C430116A9E88159A680023EADFFFBFFFDFFFFFAB6F57A97FFFBDA716A4946C8D0382548E6B6FC00881A59DA81A78956773A2577056A3DCB751E1175035F897ACE897FFFCF2FFF328C4250AD801F5BFC1180072CA0EFE8D33AA4C414D45332E313031202862657461203229AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";

/************************* 串口变量声明 ****************************/
#define BUF_SIZE (1024)
#define RD_BUF_SIZE (BUF_SIZE)
#define EX_UART_NUM 1 // set uart1
#define PATTERN_CHR_NUM (3)

#define UART_PIN_TX GPIO_NUM_9 // 串口发送引脚GPIO_9
#define UART_PIN_RX GPIO_NUM_10 // 串口接收引脚GPIO_10

void processHexData(const char* hexData, uint8_t* outputArray, size_t& outputSize);
void test_uart();

void setup()
{
    // write your initialization code here
    Serial1.begin(460800, SERIAL_8N1, UART_PIN_RX, UART_PIN_TX);
}

void loop()
{
   //TODO: 优化串口初始化时发送 00 问题
    vTaskDelay(3000);
    test_uart();
}

void test_uart()
{
    size_t dataLength = strlen(mp3_data);
    uint8_t data[dataLength];
    size_t outputSize;
    processHexData(mp3_data, data, outputSize);
    Serial1.write(data, outputSize);
}

// 函数:将字符串形式的16进制数据转换为16进制数组
void processHexData(const char* hexData, uint8_t* outputArray, size_t& outputSize) {
    size_t len = strlen(hexData);
    outputSize = 0;

    for (size_t i = 0; i < len; i += 2) {
        // 提取两个字符
        char byteStr[3];
        byteStr[0] = hexData[i];
        byteStr[1] = hexData[i + 1];
        byteStr[2] = '0'; // 字符串结束符

        // 将字符串转换为16进制字节
        outputArray[outputSize++] = strtol(byteStr, nullptr, 16);
    }
}
后发布评论