STM32f4日记9之LD3320语音识别(您的私人语音助手MICRO)

STM32f4日记9之声控LD3320(您的私人语音助手MICRO)

STM32f4日记9之LD3320语音识别(您的私人语音助手MICRO)
STM32f4日记9之LD3320语音识别(您的私人语音助手MICRO)
/

注:网络上常见的关于此芯片的STM32F1系列代码不适用于STM32F4

板子:stm32f407zgt6正点原子迷你版
作者:shawn
2021.2.22
23:38
All rights reserved

//
鉴于目前网上的教学形态各异,很多带有迷惑、误导性质,所以写这篇文章交流自己的看法,也权当纪录自己的学习经历。
//
如果你觉得对你有帮助,请点赞同,这对我很重要,谢谢。
//
一、硬件介绍
LD3320 SPI版本

STM32f4日记9之LD3320语音识别(您的私人语音助手MICRO)

应用场景

STM32f4日记9之LD3320语音识别(您的私人语音助手MICRO)
LD3320是icroute公司针对非特定人声的语音识别芯片
而我们选择的 SPI版本是将这个芯片集成到一块PCB板子上作为一个单独模块,
可以实现与大多数MCU的交互比如STC,STMF1,STMF4系列等等,
而某宝上还有常见的一种将单片机STC11跟此模块做到一个板子上的模块,价格更加低廉,属于串口版本,这篇文章我们讨论SPI版本的用法。
二、SPI通信的讲解
建议没接触过的同学点这里
让我们根据按时完成的库函数讲义再谈一次。
[En]

Let’s talk about it again according to the library function handout done on time.

STM32f4日记9之LD3320语音识别(您的私人语音助手MICRO)
四个接口控制分别为
MISO 主设备输入
MOSI 主设备输出
SCLK 时钟信号
CS 片选
SPI接口的优点
1.支持全双工操作;
2.操作简单;
3.数据传输速率较高。
同时,它也具有如下缺点:
1.需要占用主机较多的口线(每个从机都需要一根片选线);
2.只支持单个主机;
3.没有指定的流控制,没有应答机制确认是否接收到数据。
三、硬件接线
每一次的硬件连接都是让人头疼的,很多刚玩这个模块的同学看到这个模块,第一次接线就把所有3V3跟5V全接好,其实并不用,3V3,5V二选一接线就行, 也就是说一共12个接口,只要接9个就足够划重点
STM32f4日记9之LD3320语音识别(您的私人语音助手MICRO)
RST复位,WR似乎是AD里面的写的意思,IRQ是中断
对于我的热迷你版,我分配的引脚如下
[En]

For my hot mini version, the pins I assigned are as follows

MI —- PC2
MO —- PC3
CLK —- PB13
CS —- PB1
RSR —- PB6
IRQ —- PE8

划重点
其他板子的用户记得看自己板子的原理图,找SPI总线这些MISO,MOSI,CLK对于 SPIX都是固定的,其他随意, 推荐使用STMCUBE看,简单直观。
分配IO是门哲学
四、软件编写
鉴于代码太长 500多行我主要节选几个函数说说
如果你需要,在评论区留下一封电子邮件。我会寄给你的。

[En]

Leave an email in the comment area if you need it. I’ll send it to you.

主要的复用配置函数:
开SPI2

static void LD3320_SPI_cfg(void)
{
    SPI_InitTypeDef  SPI_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB1PeriphClockCmd(LD3320SPI_CLK,ENABLE);
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);

    GPIO_InitStructure.GPIO_Pin = LD3320SPIMISO_PIN;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_Init(LD3320SPIMISO_GPIO_PORT,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = LD3320SPIMOSI_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_Init(LD3320SPIMOSI_GPIO_PORT,&GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = LD3320SPISCK_PIN;
    GPIO_Init(LD3320SPISCK_GPIO_PORT,&GPIO_InitStructure);

    GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource3, GPIO_AF_SPI2);
    GPIO_PinAFConfig(GPIOC, GPIO_PinSource2, GPIO_AF_SPI2);

    LD_CS_H();

    SPI_Cmd(LD3320SPI, DISABLE);

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;
    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;
    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;
    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;
    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;
    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_128;
    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
    SPI_InitStructure.SPI_CRCPolynomial = 7;
    SPI_Init(LD3320SPI, &SPI_InitStructure);

    SPI_Cmd(LD3320SPI, ENABLE);
    spi_send_byte(0xFF);
}

主要控制函数

void LD3320_main(void)
{
    uint8 nAsrRes=0;
    LD3320_init();
    printf("1流水灯\r\n");
    printf("2闪烁\r\n");
    printf("3按键触发\r\n");
    printf("4全灭\r\n");
    printf("5状态\r\n");
    nAsrStatus = LD_ASR_NONE;

    while(1)
    {
        switch(nAsrStatus)
        {
            case LD_ASR_RUNING:
            case LD_ASR_ERROR:
                    break;
            case LD_ASR_NONE:
                    nAsrStatus=LD_ASR_RUNING;
                    if (RunASR()==0)
                    {
                        nAsrStatus = LD_ASR_ERROR;
                    }
                    break;
            case LD_ASR_FOUNDOK:
                     nAsrRes = LD_GetResult( );
                     printf("\r\n识别码:%d", nAsrRes);

                     switch(nAsrRes)
                        {
                            case CODE_LSD:
                                printf("流水灯 指令识别成功\r\n");
                                                             break;
                            case CODE_SS:
                                printf("闪烁 指令识别成功\r\n");
                                                             break;
                            case CODE_AJCF:
                                printf("按键触发 指令识别成功\r\n");
                                                            break;
                            case CODE_QM:
                                printf("全灭 指令识别成功\r\n");
                                                            break;
                            case CODE_JT:
                                printf("状态 指令识别成功\r\n");

                            default:break;
                        }
                    nAsrStatus = LD_ASR_NONE;
                    break;
            case LD_ASR_FOUNDZERO:
            default:
                    nAsrStatus = LD_ASR_NONE;
                    break;
            }
        Board_text(nAsrRes );
    }
}

五、实验视频
点这里

六、其他
我给自己的这款语音助手取名micro
你的呢,欢迎在评论区留言
//
七、代码下载
点这里
我已经设置了关注我可以免费下载,关注我不会让你失望!

[En]

I have set up follow I can download for free, follow me will not let you down!

//
作者:shawn
2021.2.22
23:38
All rights reserved

Original: https://blog.csdn.net/qq_51564898/article/details/113960015
Author: @SHAWN_shawn
Title: STM32f4日记9之LD3320语音识别(您的私人语音助手MICRO)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/527175/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球