我现在想用stm32做一个类似MP3的作品,其中我使用的是MY1690-16S这一款语音芯片。
其中,我需要用到芯片中的查询功能,就是向芯片发送一个指令,然后芯片会返回特定的值
上图是该芯片具体的查询指令和返回参数。
我通过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.
而其它的,列如USART3_RX_BUF[1]、USART3_RX_BUF[3]等,这些返回的是乱码。
这究竟是哪里出现了错误,希望大家有能力的可以解答一下,谢谢了。
感觉没有你写的这么复杂的逻辑啊,,你这个中断服务函数直接改成下面这样子试试?
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;
}
}
要注意每次接收的数据是不是从数组起始地址开始存放的