关于Interfacing the MSP430 With MMC/SD Flash Memory Cards (Rev. B)的问题
在G2231的应用笔记中有Interfacing the MSP430 With MMC/SD Flash Memory Cards (Rev. B),可点击查看。实际上应该是一个可重用的代码库了
程序中有定义选择:
例如#define SPI_SER_INTF SER_INTF_USART1 ,用来选择定义对于实际使用的方式,可选择包括含SPI的不同模块
定义选择有:
#define SER_INTF_NULL 0
#define SER_INTF_USART0 1
#define SER_INTF_USART1 2
#define SER_INTF_USCIA0 3
#define SER_INTF_USCIA1 4
#define SER_INTF_USCIB0 5
#define SER_INTF_USCIB1 6
#define SER_INTF_USI 7
#define SER_INTF_BITBANG 8
G2231只有USI吧?(不考虑BITBANG,只考虑SPI的话),那么那么应该选哪一个呢?是否应该定义为:#define SPI_SER_INTF SER_INTF_USI ?
我是这样定义了,可是一个问题折腾了我半天,不过终于解决了。首先请问是不是应该这样选择的呢?
Charles Wu:
没实际测试过这段代码,但是从代码的上下文看,楼主的理解没有错。
另外注意到这个lib以及应用笔记是2005年写得,2008年做过修订。那时候G2231还没有推出,可能程序兼容性上出了问题。楼主能否分享一下最后是怎么解决的?
Fuchong Wang:
回复 Charles Wu:
#elif SPI_SER_INTF == SER_INTF_USI
#define halSPIRXBUF USISRL
#define halSPI_SEND(x) USISRL = x; USICNT = 8
#define halSPITXREADY (USICTL1&USIIFG)
#define halSPITXDONE (1)
#define halSPIRXREADY 1
#define halSPIRXFG_CLR
#define halSPI_PxIN SPI_BITBANG_PxIN
#define halSPI_SOMI SPI_BITBANG_SOMI
对于: #define halSPIRXREADY 1
这个要在发送一个字节并且读取一个字节的子程序(实际用来读的时候,发送的是无效数据0xFF为了读)
//Send one byte via SPI
unsigned char spiSendByte(const unsigned char data)
{
while (halSPITXREADY ==0); // wait while not ready for TX
halSPI_SEND(data); // write
while (halSPIRXREADY ==0); // wait for RX buffer (full)
return (halSPIRXBUF);
}
红色的需要注意,while实际不循环了,oxFF还没有发完,可能第一位还没有发完就开始读出数据了,这样读出的不就是发送的数据或者发送数据的一部分了么?导致我SD卡的初始化都不能完成,因为相信是现成的代码库改的,所以没有一开始就没有检查这部分代码,导致我走了弯路废了时间。
我改成: #define halSPIRXREADY (USICTL1&USIIFG); 就可以通过初始化了。当然SD卡的时序有点多,所以也可能我的理解有误,因为总是有点急,沉不下心来按部就班的仔细想和做。
我用来播放语音,使用G2452,就靠一片单片机连接SD卡,PWM输出语音,现在基本可以听清楚了,但是夹杂着明显地不正常的杂音,还要查,不知道是定时器输出PWM改变脉宽的方法方式不妥的原因还是读取数据不正常(例如漏读),也可能我上述改的也有可能不正确虽然貌似正常,请也给个确定。
谢谢
Charles Wu:
回复 Fuchong Wang:
我记得F5438的EVM上附带了用Timer的PWM来实现WAV的播放的参考代码,你可以参考看看
Fuchong Wang:
回复 Charles Wu:
谢谢回答,我再看看
不过昨天我已经通过在cpu内部FLASH上放置了一段wav数据,可以通过PWM播放出来,十分清晰,所以应该使用MSP430的PWM播放WAV应该没什么问题,至少效果上没问题。
我现在的问题应该还是在读SD卡上
Charles Wu:
回复 Fuchong Wang:
确实,我听过5438EVM板输出的效果,虽然音质一般,但是吐字还算清晰。而且,音质很大程度上取决于PWM接到音频运放和喇叭。
Fuchong Wang:
回复 Charles Wu:
这个怎么说呢,WAV音频的最低格式标准是电话音质的(实际比我们实际中的电话声音要好的,因为电话机及线路质量,而且本身编码就是有损的,而标准PCM是无损的)
Charles Wu:
回复 Fuchong Wang:
你说的没错,可是这是指从数字到模拟的转换是无损的。但是如果后端音频运放设计带宽不够,无法做到一个线性的放大,还是会影响音质吧。
Charles Wu:
回复 Charles Wu:
说到这里,先声明我不是一个信号链工程师,这个问题已经脱离了MSP430的范畴,估计模拟的论坛里的大拿才能回答你的问题了。
Peter_Zheng:
回复 Fuchong Wang:
5438EVM中的音频应该是用timerD来做的,效果比较好。G系列没有类似的timer,所以播放声音文件是有缺陷的。另外SD卡的读写本来是可以考虑使用fat文件系统的,但是G系列的flash大小限制,只有自己通过spi来设计了,不过还是可以参考文件系统里的底层函数是怎么做的
Fuchong Wang:
回复 Peter_Zheng:
谢谢Peter_Zheng,那么能解释一下为什么“G系列没有类似的timer,所以播放声音文件是有缺陷的。”?
是不是类似楼主讨论的问题?能给个电路逻辑级别的解释么?
之前的不清楚是我低级的类似不小心的程序错误,因为我对SD卡还不是很熟悉,因此大部分时间还是放在了解SD和处理的方式方法行不行包括这个定时器是否引起大的问题这方面,后来还是逐条检查相关的程序部分,低级错误。
现在我播放的效果很好,我用的是歌曲试验的,8KHz采样率的,一点噪声没有(PWM周期频率设的比较高,32K),如果不和高采样率的比对着听,还真可以听呢,我用电脑音箱播放,就用简单的无源RC低通,照样听的有滋有味。
不过有一首歌曲音量比较高,可能采样的幅度值达到0或者255了,所以声音最高的地方好像爆裂声,不过这种情形很少,不知道是否定时器PWM引起的。关于定时器PWM,我以后还想试验一下,现在因为不是主要矛盾,所以没检验,尽管也是几句代码的事情。