TI中文支持网
TI专业的中文技术问题搜集分享网站

关于Interfacing the MSP430 With MMC/SD Flash Memory Cards (Rev. B)的问题

关于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,我以后还想试验一下,现在因为不是主要矛盾,所以没检验,尽管也是几句代码的事情。

赞(0)
未经允许不得转载:TI中文支持网 » 关于Interfacing the MSP430 With MMC/SD Flash Memory Cards (Rev. B)的问题
分享到: 更多 (0)