STM32制作MP3,利用MY1690-16S这款语音芯片中查询功能遇到的问题

 我现在想用stm32做一个类似MP3的作品,其中我使用的是MY1690-16S这一款语音芯片。

 其中,我需要用到芯片中的查询功能,就是向芯片发送一个指令,然后芯片会返回特定的值

img

img

上图是该芯片具体的查询指令和返回参数。
我通过usart串口来接收返回的参数。以下是我usart中断函数接收MY1690-16S芯片返回参数的具体函数。

断服务程序(固定的函数名不能修改)
void USART3_IRQHandler(void){     
    u8 Res;
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET){  //接收中断
        Res =USART_ReceiveData(USART3);//读取接收到的数据
            if((USART3_RX_STA&0x8000)==0){//接收未完成            
            if(USART3_RX_STA&0x4000){//接收到了0x0d                
                if(Res!=0x0a)USART3_RX_STA=0;//接收错误,重新开始
                else USART3_RX_STA|=0x8000;    //接收完成了 
            }else{ //还没收到0X0D                    
                if(Res==0x0d)USART3_RX_STA|=0x4000;
                else{
                    USART3_RX_BUF[USART3_RX_STA&0X3FFF]=Res ; //将收到的数据放入数组
                    USART3_RX_STA++;    //数据长度计数加1
                    if(USART3_RX_STA>(USART3_REC_LEN-1))USART3_RX_STA=0;//接收数据错误,重新开始接收      
                }         
            }

通过以上代码我把返回的参数放在了USART3_RX_BUF[]这个数组当中,接着想把这个数组中的数值通过以下这条代码显示在显示在OLED屏上

    OLED_DISPLAY_8x16( 0,12*8,USART3_RX_BUF[0]);   //显示英文与数字8*16的ASCII码

经过我反复实验,发现USART3_RX_BUF[0]的值位字母o,USART3_RX_BUF[2]的值为字母K.

img

而其它的,列如USART3_RX_BUF[1]、USART3_RX_BUF[3]等,这些返回的是乱码。

img


所以,我只能接收到ok,其它的参数我并没有成功接收到。

这究竟是哪里出现了错误,希望大家有能力的可以解答一下,谢谢了。

感觉没有你写的这么复杂的逻辑啊,,你这个中断服务函数直接改成下面这样子试试?

void USART3_IRQHandler(void) {
    u8 Res;
    if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) 
    {  
        Res = USART_ReceiveData(USART3);
        USART3_RX_BUF[USART3_RX_STA++] = Res;
        if (USART3_RX_STA > (USART3_REC_LEN - 1))
            USART3_RX_STA = 0;
    }
}

要注意每次接收的数据是不是从数组起始地址开始存放的