打印

USB音频播放以及USB发送接收相关问题

[复制链接]
3482|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flyroshan|  楼主 | 2011-9-15 08:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好,初次接触USB,现在项目需要通过USB实现音频播放,有很多疑问,向大家请教下。
1. PC向USB开发板发送音频数据的流程
    我们讨论认为发送数据的流程可能是下面两种中的一个,但不确定,希望熟悉的人解答一下。  
    假设使用的端点最大能接收256字节/包,音频采样率1Khz,采样位数16位,格式PCM。
  • 认为发送的就是一个流,主机每包都向USB开发板发送256个字节,USB开发板将这256个字节进行处理(或者不需要进行处理,对音频格式不了解)后放到FIFO,然后再通过I2S以一定的频率送给DA转换。
  • 主机每1ms发送一个包,每个包发送16位数据,USB开发板通过I2S将这16位数据发送到DA转换。
    如果是上面第二种情况,那PC,USB开发板必须要知道音频采样率和音频的采样位数,这些参数是由哪边决定的,以及是怎样告知另一方的,通过请求吗?

2. USB设备发送接收数据的流程
    我们使用的单片机每个端点都有对应的buffer,每个端点都有一个DRQ中断。如果端点设置的是IN,当产生DRQ中断表示buffer中数据已经发送到了主机方,可以往buffer中写数据了。如果端点设置的是OUT,当产生DRQ中断表示主机发送的数据已经在buffer中了,可以将数据移到RAM了。
  • USB设备发送
      软件实现过程是不是USB设备这边主动向buffer中写数据,然后等主机发送IN令牌包后将数据接走?我看了下STM32单片机,它好像有单独的IN和OUT中断,我想是不是STM32产生IN中断时,在中断处理函数中将数据发送给主机。但是我们使用的单片机没有这两个中断。
  • USB设备接收
      软件实现过程是不是当产生DRQ中断时,在中断函数中将数据从buffer中读出。
      

相关帖子

沙发
dqyubsh| | 2011-9-15 09:31 | 只看该作者
关于1,主机每1ms发送一个包——这个定时根本做不到。Windows不是实时系统,它会因为各种原因卡在那不动了,这种情况下,根本没法发下去数据。
   
主机直接发给设备播放数据,需要保证数据流不间断。如果主机可以顺畅地发下去数据,如果带宽足够的话,这样做没问题。否则,下边要有缓冲,或者使用FIFO的缓冲,你可能要处理数据的同步,还是比较麻烦的。这个没做过,瞎说。

2,USB设备发送:主机主动去取数。设备可以判断主机取走之后再发上来新数据,一般都是这样的。如果主机没取走,可以不发新数据,扔掉这个新数据。当然,也可以强行更新数据,不管主机取没取走,这样,主机就可能取不到之前的数据了。

USB接收:一般都会产生USB中断,根据不同的中断,执行响应的操作。至于在那里取走,我觉得没所谓,可以在中断中取走,也可以在中断里设置标记,在主循环中取走。

使用特权

评论回复
板凳
flyroshan|  楼主 | 2011-9-15 14:01 | 只看该作者
关于第一个问题,http://www.icembed.com/info-13896.htm里有这样一段
USB音频类规定的USB同步传输周期为1ms,即对于8kHz/16位/单通道PCM编码的音频流,每隔1ms,USB设备就会收到一次主机传来的数据,数据包大小为16字节,为了尽量保持I2S和USB传输同步,可以取16字节作为一个缓存区段的大小。

是不是主机每1ms发送给USB设备的数据是根据采样率来决定的,不是一直以包的最大值发送的,例如44Khz,16位的话主机每1ms发送88字节给usb设备,然后usb设备将这88字节数据通过I2S发送给DA转换?

第二个问题明白了,还有一个问题,关于usb麦克风的。如果使用的AD转换是12位的,是不是音频的采样位数就不会超过这个值?如果我AD转换的频率为44Khz,8位。那按照上面所说的USB同步传输周期为1ms的话,那我1ms就要给主机发送44字节的数据。那软件实现起来是每次AD转换完成后就通过usb发送8位数据吗?还是将前面转换的数据存起来一直到44字节在通过usb发送出去?

PS:发帖的时候有分,那分怎么给。

使用特权

评论回复
地板
dqyubsh| | 2011-9-15 16:18 | 只看该作者
你这个音频处理要用同步传输方式,即,每1ms的传输过程允许出错不成功。顿挫或者丢包都是可以容忍的。

ADC采样率是44ksps,等同于1ms采了44字节。既然是1ms发送一次,你就要把这44个字节采样完成并一次发出去。我觉得44k这个速率还是蛮高的,要专用的采样芯片,要有FIFO或者DMA,否则,你可能采不完,采完了移到单片机或者USB里也很难,普通的没有I2S接口的单片机很难胜任。

使用特权

评论回复
5
flyroshan|  楼主 | 2011-9-16 08:52 | 只看该作者
我们用的芯片自带的AD转换,每个channel有FIFO,但是不知道FIFO的大小以及当前FIFO中有多少转换的数据,准备没产生一次AD中断,就将8位的数据存到内存的一个buffer中,等存够44字节,将这44字节送到usb端点的发送buffer中等待主机接收。

后来又想了下,主机1ms进行一次同步传输,是不是在1ms的某个时间点,USB主机会发送IN令牌包,如果对应的USB设备的端点发送buffer中没数据,主机这1ms就接不到数据?对同步传输这个机制还是没什么概念,看到个SOF包,好像是1ms主机发送一次,会不会是在每次USB设备产生SOF中断时就将44字节数据移到USB设备端点的发送buffer中?如果不够44的话就在后面加上静音的数据。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

3

帖子

1

粉丝