一、模塊來源
模塊實物展示:
二、規(guī)格參數(shù)
輸入電壓:2.8V-5.5V
IO電壓:3.3V(模塊引腳輸出電壓)
額定電流:500uA~10mA
控制方式:串口
以上信息見廠家資料文件
三、移植過程
3.1查看資料
此芯片最大的優(yōu)勢在于能夠靈活的更換 SPI-flash 內的語音內容,省去了傳統(tǒng)語音芯片需要安裝上位機更換語音的麻煩,SPI FLASH 直接模擬成 U 盤,跟拷貝 U 盤一樣,非常方便。使得產品研發(fā)和生產變得便捷簡單。一線串口控制模式、RX232 串口控制可選,為研發(fā)提供更多的選擇性。
USB 數(shù)據線連接芯片,插上電腦,電腦會自動識別,如下圖所示:出廠內部自帶了10首語音。
注意語音內容不可太長,防止內存不夠。
電腦自動識別
U盤內部
該模塊分有單獨IO控制、一線串行控制、兩線串口控制。
單獨IO口控制
如果需要更新語音,把要放置的聲音拷貝過去按照相應格式命名即可。按 5 位數(shù)字進行命名,即 00001、00002......00007。
一線串行控制
兩線串口控制
波特率為 9600,數(shù)據位:8 ,停止位 1 位,檢驗位 N
3.2引腳選擇
模塊接線圖
3.3移植至工程
移植步驟中的導入.c和.h文件與【CW32模塊使用】DHT11溫濕度傳感器相同,只是將.c和.h文件更改為bsp_jq8900.c與bsp_jq8900.h。這里不再過多講述,移植完成后面修改相關代碼。
在文件bsp_jq8900.c中,編寫如下代碼。
/* * Change Logs: * Date Author Notes * 2024-06-25 LCKFB-LP first version */ #include "bsp_jq8900.h" #include "stdio.h" #include "string.h" unsigned char JQ8900_RX_BUFF[JQ8900_RX_LEN_MAX]; unsigned char JQ8900_RX_FLAG = 0; unsigned char JQ8900_RX_LEN = 0; /************************************************************ * 函數(shù)名稱:JQ8900_USART_Init * 函數(shù)說明:連接JQ8900的初始化 * 型 參:bund=串口波特率 * 返 回 值:無 * 備 注:無 *************************************************************/ void JQ8900_USART_Init(unsigned int bund) { GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結構體 BSP_JQ8900_GPIO_RCC_ENABLE(); // 使能GPIO時鐘 BSP_JQ8900_UART_RCC_ENABLE(); // 使能UART時鐘 GPIO_InitStruct.Pins = BSP_JQ8900_TX_PIN; // GPIO引腳 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽輸出 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; // 輸出速度高 GPIO_Init(BSP_JQ8900_GPIO_PORT, &GPIO_InitStruct); // 初始化 GPIO_InitStruct.Pins = BSP_JQ8900_RX_PIN; // GPIO引腳 GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP; // 上拉輸入 GPIO_Init(BSP_JQ8900_GPIO_PORT, &GPIO_InitStruct); // 初始化 BSP_JQ8900_AF_UART_TX(); // UART_TX復用 BSP_JQ8900_AF_UART_RX(); // UART_RX復用 // 配置UART USART_InitTypeDef USART_InitStructure; USART_InitStructure.USART_BaudRate = bund; // 波特率 USART_InitStructure.USART_Over = USART_Over_16; // 配置USART的過采樣率。 USART_InitStructure.USART_Source = USART_Source_PCLK; // 設置時鐘源 USART_InitStructure.USART_UclkFreq = 64000000; //設置USART時鐘頻率(和主頻一致即可) USART_InitStructure.USART_StartBit = USART_StartBit_FE; //RXD下降沿開始 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 停止位1 USART_InitStructure.USART_Parity = USART_Parity_No ; // 不使用校驗 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 不使用流控 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 收發(fā)模式 USART_Init(BSP_JQ8900_UART, &USART_InitStructure); // 初始化串口2 // 優(yōu)先級,無優(yōu)先級分組 NVIC_SetPriority(BSP_JQ8900_IRQ, 0); // UARTx中斷使能 NVIC_EnableIRQ(BSP_JQ8900_IRQ); // 使能UARTx RC中斷 USART_ITConfig(BSP_JQ8900_UART, USART_IT_RC, ENABLE); } /****************************************************************** * 函 數(shù) 名 稱:JQ8900_USART_Send_Bit * 函 數(shù) 說 明:向JQ8900模塊發(fā)送單個字符 * 函 數(shù) 形 參:ch=字符 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void JQ8900_USART_Send_Bit(unsigned char ch) { USART_SendData(BSP_JQ8900_UART, (uint8_t)ch); while( RESET == USART_GetFlagStatus(BSP_JQ8900_UART, USART_FLAG_TXE) ){} // 等待發(fā)送數(shù)據緩沖區(qū)標志置位 } /****************************************************************** * 函 數(shù) 名 稱:JQ8900_USART_send_String * 函 數(shù) 說 明:向JQ8900模塊發(fā)送字符串 * 函 數(shù) 形 參:str=發(fā)送的字符串 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void JQ8900_USART_send_String(unsigned char *str, unsigned int len) { while( len-- ) { JQ8900_USART_Send_Bit(*str++); } } //清除串口接收的數(shù)據 /****************************************************************** * 函 數(shù) 名 稱:Clear_JQ8900_RX_BUFF * 函 數(shù) 說 明:清除JQ8900發(fā)過來的數(shù)據 * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void Clear_JQ8900_RX_BUFF(void) { unsigned char i = JQ8900_RX_LEN_MAX-1; while(i) { JQ8900_RX_BUFF[i--] = 0; } JQ8900_RX_LEN = 0; JQ8900_RX_FLAG = 0; } /****************************************************************** * 函 數(shù) 名 稱:JQ8900_Init * 函 數(shù) 說 明:JQ8900模塊初始化 * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:JQ8900的默認波特率是9600 ******************************************************************/ void JQ8900_Init(void) { JQ8900_USART_Init(9600);//默認波特率為9600 GPIO_InitTypeDef GPIO_InitStruct; // GPIO初始化結構體 BSP_JQ8900_GPIO_RCC_ENABLE(); // 使能GPIO時鐘 GPIO_InitStruct.Pins = GPIO_JQ8900_APP; // GPIO引腳 GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // 推挽輸出 GPIO_InitStruct.Speed = GPIO_SPEED_HIGH; // 輸出速度高 GPIO_Init(BSP_JQ8900_GPIO_PORT, &GPIO_InitStruct); // 初始化 SET_JQ8900_APP(1); } /********************************************************** * 函 數(shù) 名 稱:SendData * 函 數(shù) 功 能:一線串行通信控制 * 傳 入 參 數(shù):addr=發(fā)送的指令 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 **********************************************************/ void SendData ( unsigned char addr ) { unsigned char i; SET_JQ8900_APP(1); /*開始拉高 */ delay_us ( 500 ); SET_JQ8900_APP(0);/*開始引導碼*/ delay_ms ( 4 );/*此處延時最少要大于2ms,官方建議4MS */ for ( i = 0; i < 8; i++ ) /*總共8位數(shù)據,從低位開始 */ { //數(shù)據總是從1開始 SET_JQ8900_APP(1); if ( addr & 0x01 ) { delay_us ( 1300 );/*3:1表示數(shù)據位1,每個位用兩個脈沖表示 */ SET_JQ8900_APP(0); delay_us ( 500 ); } else { delay_us ( 500 );/*1:3表示數(shù)據位0 ,每個位用兩個脈沖表示 */ SET_JQ8900_APP(0); delay_us ( 1300 ); } addr >>= 1; } SET_JQ8900_APP(1); delay_ms(10);//兩個字節(jié)之間延時建議在10ms以上 } /****************************************************************** * 函 數(shù) 名 稱:JQ8900_USART_IRQHandler * 函 數(shù) 說 明:連接JQ8900的串口中斷服務函數(shù) * 函 數(shù) 形 參:無 * 函 數(shù) 返 回:無 * 作 者:LC * 備 注:無 ******************************************************************/ void JQ8900_USART_IRQHandler(void) { if(USART_GetITStatus(BSP_JQ8900_UART,USART_IT_RC) != RESET) // 接收緩沖區(qū)不為空 { //接收數(shù)據 JQ8900_RX_BUFF[ JQ8900_RX_LEN ] = USART_ReceiveData(BSP_JQ8900_UART); #if DEBUG //測試,查看接收到了什么數(shù)據 printf("%c", JQ8900_RX_BUFF[ JQ8900_RX_LEN ]); #endif //接收長度限制 JQ8900_RX_LEN = ( JQ8900_RX_LEN + 1 ) % JQ8900_RX_LEN_MAX; JQ8900_RX_BUFF[JQ8900_RX_LEN] = '?'; //字符串結尾補 '?' JQ8900_RX_FLAG = SET; // 接收完成 USART_ClearITPendingBit(BSP_JQ8900_UART, USART_IT_RC); // 清除中斷標志位 } }
在文件bsp_jq8900.h中,編寫如下代碼。
/* * Change Logs: * Date Author Notes * 2024-06-25 LCKFB-LP first version */ #ifndef _BSP_JQ8900_H_ #define _BSP_JQ8900_H_ #include "string.h" #include "board.h" //是否開啟串口調試,查看WIFI回顯數(shù)據 #define DEBUG 1 #define JQ8900_RX_LEN_MAX 250 //串口接收最大長度 /**************************** 串口配置 ****************************/ #define BSP_JQ8900_GPIO_RCC_ENABLE() __RCC_GPIOA_CLK_ENABLE() // 串口TX的端口時鐘 #define BSP_JQ8900_UART_RCC_ENABLE() __RCC_UART2_CLK_ENABLE() // 串口2的時鐘 #define BSP_JQ8900_AF_UART_TX() PA02_AFx_UART2TXD() #define BSP_JQ8900_AF_UART_RX() PA03_AFx_UART2RXD() #define BSP_JQ8900_GPIO_PORT CW_GPIOA // GPIO的端口 #define BSP_JQ8900_TX_PIN GPIO_PIN_2 // 串口TX的引腳 #define BSP_JQ8900_RX_PIN GPIO_PIN_3 // 串口RX的引腳 #define BSP_JQ8900_UART CW_UART2 // 串口2 #define BSP_JQ8900_IRQ UART2_IRQn // 串口2中斷 #define BSP_JQ8900_IRQHandler UART2_IRQHandler // 串口2中斷服務函數(shù) #define GPIO_JQ8900_APP GPIO_PIN_1 #define SET_JQ8900_APP(x) GPIO_WritePin(BSP_JQ8900_GPIO_PORT, GPIO_JQ8900_APP, x?GPIO_Pin_SET:GPIO_Pin_RESET); void JQ8900_Init(void); void JQ8900_USART_send_String(unsigned char *str, unsigned int len); void SendData ( unsigned char addr ); void JQ8900_USART_Send_Bit(unsigned char ch); #endif
四、移植驗證
在自己工程中的main主函數(shù)中,編寫如下。
/* * Change Logs: * Date Author Notes * 2024-06-25 LCKFB-LP first version */ #include "board.h" #include "stdio.h" #include "bsp_uart.h" #include "bsp_jq8900.h" int32_t main(void) { //下一曲(沒有指定曲目則從1開始一直播報到最后) uint8_t send_buff[4] = {0xAA,0x06,0x00,0xB0}; board_init(); uart1_init(115200U); JQ8900_Init(); printf("Start...rn"); while(1) { //兩線串口測試 JQ8900_USART_send_String(send_buff,4); delay_ms(3000); } }
移植現(xiàn)象:
移植現(xiàn)象:持續(xù)播報模塊內部的全部語音。
模塊移植成功案例代碼:
鏈接:https://pan.baidu.com/s/1XcBxcE_BNWIzfEHu9G5c1g?pwd=LCKF
提取碼:LCKF
-
串口
+關注
關注
14文章
1582瀏覽量
78595 -
語音芯片
+關注
關注
12文章
1950瀏覽量
37576 -
語音播報
+關注
關注
1文章
34瀏覽量
14774 -
CW32
+關注
關注
1文章
242瀏覽量
1092
發(fā)布評論請先 登錄
【CW32模塊使用】語音合成播報模塊

語音模塊之JQ8400
arduino如何控制JQ***P語音模塊
JQ6500語音模塊的相關資料分享
使用STC89C52一線串口控制JQ8900播放指定曲目的資料和程序說明

評論