STM32f4日記9之聲控LD3320(您的私人語音助手MICRO)


/
注:網路上常見的關于此芯片的STM32F1系列代碼不適用于STM32F4
板子:stm32f407zgt6正點原子迷你版
作者:shawn
可咨詢QQ:965798711(想要完整代碼請在評論區留下郵箱)
2021.2.22
23:38
All rights reserved
//
鑒于目前網上的教學形態各異,很多帶有迷惑、誤導性質,所以寫這篇文章交流自己的看法,也權當紀錄自己的學習經歷,
//
如果你覺得對你有幫助,請點贊同,這對我很重要,謝謝,
//
一、硬體介紹
LD3320 SPI版本

應用場景

LD3320是icroute公司針對非特定人聲的語音識別芯片,
而我們選擇的SPI版本是將這個芯片集成到一塊PCB板子上作為一個單獨模塊,
可以實作與大多數MCU的互動比如STC,STMF1,STMF4系列等等,
而某寶上還有常見的一種將單片機STC11跟此模塊做到一個板子上的模塊,價格更加低廉,屬于串口版本,這篇文章我們討論SPI版本的用法,
二、SPI通信的講解
建議沒接觸過的同學點這里
我們根據正點做的庫函式講義再講講

四個介面控制分別為
MISO 主設備輸入
MOSI 主設備輸出
SCLK 時鐘信號
CS 片選
SPI介面的優點
1.支持全雙工操作;
2.操作簡單;
3.資料傳輸速率較高,
同時,它也具有如下缺點:
1.需要占用主機較多的口線(每個從機都需要一根片選線);
2.只支持單個主機;
3.沒有指定的流控制,沒有應答機制確認是否接收到資料,
三、硬體接線
每一次的硬體連接都是讓人頭疼的,很多剛玩這個模塊的同學看到這個模塊,第一次接線就把所有3V3跟5V全接好,其實并不用,3V3,5V二選一接線就行,也就是說一共12個介面,只要接9個就足夠劃重點

RST復位,WR似乎是AD里面的寫的意思,IRQ是中斷
對于我的那塊正點的迷你版,我分配的引腳如下
MI ---- PC2
MO ---- PC3
CLK ---- PB13
CS ---- PB1
RSR ---- PB6
IRQ ---- PE8
劃重點
其他板子的用戶記得看自己板子的原理圖,找SPI總線這些MISO,MOSI,CLK對于SPIX都是固定的,其他隨意,推薦使用STMCUBE看,簡單直觀,
分配IO是門哲學
四、軟體撰寫
鑒于代碼太長500多行我主要節選幾個函式說說
需要的評論區留個郵箱我發你
主要的復用配置函式:
開SPI2
static void LD3320_SPI_cfg(void) // PC2 PC3 PB13
{
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 );
}
}
五、實驗視頻
放在百度網盤里,自行提取哦
鏈接:https://pan.baidu.com/s/1rb_sxL97hh6vWk7Sb_peFg
提取碼:twy5
復制這段內容后打開百度網盤手機App,操作更方便哦
六、其他
我給自己的這款語音助手取名micro
你的呢,歡迎在評論區留言
//
//
作者:shawn
可咨詢QQ:965798711(想要完整代碼請在評論區留下郵箱)
2021.2.22
23:38
All rights reserved
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/262466.html
標籤:其他
下一篇:智能電表的對比分析
