这几天在搞USB的声卡,用的是STM32F103ZET6,用的是Hal库生成的代码,I2S2 DMA方式输出,有以下问题,声音有,但是噪声很大,而且USB数据暂停后,I2S2上还是有数据在不停的发,感觉是USB库哪里有问题,接收看过了应该是没有问题的,就是这个同步传输的问题,红色部分,为什么每次都是从haudio->buffer[0]开始,而且长度还是固定,haudio->rd_ptr这个指针没什么作用嘛。。搞来搞去的,理论上应该是USB循环队列的读指针,但是没有起到作用,下面的函数是DMA传输完回调调用的,感觉只要这样调下去,数据永远都停止不了,I2S上肯定永远都有数据,而且只能取到前半个Buffer的长度,后半部分,永远都取不到。。不知道有没有兄弟对下面函数有什么想法?还是我应用错了? void USBD_AUDIO_Sync (USBD_HandleTypeDef *pdev, AUDIO_OffsetTypeDef offset) { int8_t shift = 0; USBD_AUDIO_HandleTypeDef *haudio; haudio = (USBD_AUDIO_HandleTypeDef*) pdev->pClassData; haudio->offset = offset; if(haudio->rd_enable == 1) { haudio->rd_ptr += AUDIO_TOTAL_BUF_SIZE/2; if (haudio->rd_ptr == AUDIO_TOTAL_BUF_SIZE) { /* roll back */ haudio->rd_ptr = 0; } } if(haudio->rd_ptr > haudio->wr_ptr) { if((haudio->rd_ptr - haudio->wr_ptr) < AUDIO_OUT_PACKET) { shift = -4; } else if((haudio->rd_ptr - haudio->wr_ptr) > (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET)) { shift = 4; } } else { if((haudio->wr_ptr - haudio->rd_ptr) < AUDIO_OUT_PACKET) { shift = 4; } else if((haudio->wr_ptr - haudio->rd_ptr) > (AUDIO_TOTAL_BUF_SIZE - AUDIO_OUT_PACKET)) { shift = -4; } } if(haudio->offset == AUDIO_OFFSET_FULL) { ((USBD_AUDIO_ItfTypeDef *)pdev->pUserData)->AudioCmd(&haudio->buffer[0], AUDIO_TOTAL_BUF_SIZE/2 - shift, AUDIO_CMD_PLAY); haudio->offset = AUDIO_OFFSET_NONE; } } |
没有。。没搞了。。。