DSP与异步串口间的通信 DSP与PC机交换声音数据可以通过异步串口实现(近端RS-232或者远端RS-485再到RS-232)。下面简单介绍如何利用DSP的McbSP实现RS-232协议从而跟PC机的串口通信。 首先,因为McbSP和RS-232电平不同,之间需要加一个MAX232这样的电压转换芯片。同时,DSP的McbSP是一个三线同步串口,而RS-232只需一根数据线(单向)即可通信,所以在实现异步串口时,首先硬件连接应该如下:
从上图可以看出, McbSP串口的接收帧信号和接收数据线连在一起,这样做的目的是为了利用异步帧的开始位(低有效)来给McbSP一个帧信号。显然,这时DSP的帧信号应设置为低有效且接收延时应设置为'1'。 同步-异步转换的基本原理就是对异步信号过采样得到同步信号,例如一般是对异步信号的每个bit用同步信号的一个字来表示(即16个'1'-0xffff或16个'0'-0x0000)。可参看下图(上边为异步信号,下边为同步信号):
串口的发送和接收都采用DMA方式,buffer的大小为:1+8+1(无校验位,结束位长度为1)=10word。同步-异步具体转换在软件上实现: 对于发送来说,较为简单,就是对每一个byte的每个bit用一个word(16bit)进行代替,加上开始位、结束位。然后判断是否可以发送(通过发送完毕标志),如果可以则把这10个word放入buffer,启动DMA即可。在发送中断服务程序中需要作的是停止发送DMA,并置发送完毕标志有效。 接收相对发送麻烦一些,需要对接收到的每一个字进行判断从而恢复每一个bit,例如可以认为收到0000 1111 1111 0000b为'1',其余为'0'。过滤掉开始位('0')和结束位('1'),恢复的8个bit就合成一个byte。这些应该在接收中断服务程序里面做。 还有就是同步串口时钟的选择,一定要稍大于设计速度,比如,在跟57.6K的RS-232通信时,时钟应该为57.6×16=921.6K,实际配置串口分频寄存器时应该稍大于这个速度,否则就可能由于没有正确检测到停止位而出现错误。 更详细的同步-异步转换设计流程跟我们的主题无关,有很多文章有具体的描述,这里就不主要讨论了。 至此,一个较为完整的系统就建立了。此系统可以完成对语音或者音频信号的采集和播放,同时通过DSP内部的压缩算法,如g.729或者MP3传给PC机进行储存和传输。 附录: AIC23的内部寄存器中的一些主要设置bit: 1. LINE IN左声道音量控制寄存器: LIM:静音 LIV【4:0】:音量控制 2. LINE IN右声道音量控制寄存器: RIM:静音 RIV【4:0】:音量控制 3. 耳机左声道音量控制寄存器: LHV【6:0】:音量控制 4. 耳机右声道音量控制寄存器: RHV【6:0】:音量控制 5. 模拟通道控制寄存器 bYP:bypass模式 INSEL:ADC输入选择,0-LINE IN、1-麦克风 MICM:麦克风静音 6. 数字通道控制寄存器 DACM:DAC静音 ADCHP:ADC高通滤波器开关选择 7. 省电控制寄存器 OFF:Device Power off CLK:Clock Power off OSC:Oscillator Power off OUT:Outputs Power off DAC:DAC Power off ADC:ADC Power off MIC:MIC Power off LINE:LINE IN Power off 8. 数字接口格式寄存器: MS:工作模式Master or Slave LRSWAP:DAC左右声道交换 LRP:I2S模式下,LRCIN低左声道或右声道 DSP模式下,MSb在LRCIN有效后1st或者2nd bCLK沿出现 IWL【1:0】:采样bit长度 FOR【1:0】:DSP格式,即帧信号后跟左右声道两个字 I2S格式,帧信号占空比50%,高低各是左右声道 9. 采样率寄存器: CLKIN:时钟输入选择,0-MCLK,1-MCLK/2 CLKOUT:时钟输出选择,0-MCLK,1-MCLK/2 10. 数字接口激活寄存器: ACT:激活开关 11. Reset寄存器 RES:写入0重启