1、我用STM32F103VC处理器,工作在72M HZ下,SPI1用作操作FLASH(工作在主模式下),SPI2用作采集PCM语音数据(工作在从模式下)。SPI1采用PCLK 4分频,SPI2的时钟为来自通信模块的2.048M HZ的时钟。当SPI2采集到来自PCM的256个数据后,将这些数据通过SPI1写入到FLASH中(在SPI1写入FLASH中时,SPI2仍在对PCM的数据进行接收),SPI1写入数据到FLASH是采用查询写入的方式,直到256个字节写入完成才退出,而SPI2接收PCM数据采用中断方式(中断优先级最高),故两者在程序的时序上应该不会有影响。但是,从程序执行的结果来看,在每组256字节的数据中,头几个字节的数据总是乱的(并不是真正在SPI2 MOSI线上的数据),但是过了头几个数据,后面的数据又完全正常了。所以,我怀疑SPI1 和 SPI2同时工作的时候是否互相存在影响,而且SPI2相对应该是在一个比较高的频率上。不知各位高手对这方面是否有所了解,还望不吝赐教。 2、我尝试将该处理器SPI2设置为I2S模式,并且将I2S标准设置为PCM标准,由于模块只有短帧同步,I2S中我也设置了短帧同步。当模块有语音数据送出时,PCM的时钟是一直在往外送的,频率为2.048M,语音的采样频率为8K HZ,16bit数据,即在两个短帧之间有256个时钟信号,在256个时钟信号的前16个时钟信号时,模块在MOSI线上有语音数据输出,而其后的15个16bit位宽的时间里,没有语音数据,即语音数据占了总带宽的1/16。我将I2S控制器设置为数据寄存器空中断,但是这样,1帧会触发16个中断,而且自我感觉中间还会错过若干个时钟,导致数据位偏移。我看了手册,I2S控制器里面似乎没有对帧进行同步的机制,那如何才能做到1帧里面触发一个中断,而不是触发16次中断呢?那在I2S中设置为短帧同步还是长帧同步不也是没什么区别了么?不知道是我哪里理解有错还是哪里没搞明白。。。 谢谢各位大牛赐教! |