经过前一个阶段的编程和测试,天籁齐舞项目组的MP3播放器的VS1053B控制部分需要使用SPI分别对VS1053B上的控制从器件和数据从器件进行分别控制,这就要求SPI总线能够分时地被这两个从器件占用。
在SAKURA板上RXCPU的SPI是支持多个从器件控制的,并且SAKURA板能够在支持mini-SD卡基于SPI总线读写的同时,还支持外围SPI总线的控制就证明了这一点。
于是我就学习了瑞萨的web云编译器
http://tool-cloud.renesas.com/中的spi.h头文件,并在文件中找到如下说明语句:
//typedef enum {SPI_PORT_NONE, SPI_PORT_CS0_DUINO, SPI_PORT_CS1_MARY1, SPI_PORT_CS2_MARY2, SPI_PORT_CS3_ROM, SPI_PORT_SDMMC} SPI_PORT;
意思是说:SPI_PORT的配置是支持多器件的,通过给SPI_PORT赋不同的值来实现SPI对不同从器件的片选,进而通过SPI总线对片选的从器件进行控制。
同时还找到了:
**********************************************************************/
class CSPI {
private:
int bitOrder;
SPI_CLK_DIVIDER divider;
SPI_DATA_MODE dataMode;
public:
CSPI(SPI_PORT port);
~CSPI();
/*********************************************************************//*
这些是我在SPI.h头文件中所能找到的关于引用SPI_PORT的地方。
但至于如何在程序中来使用并调用来实现SPI控制不同从器件的能力,目前还未测试成功。
在如下的帖子中,我成功地调用了SPI_PORT参数,并且编译后不出现错误,可是当进行
VS1053B库函数测试时才发现,此种调用方法还无法做到使SPI分别控制多个从器件,
http://forum.eepw.com.cn/thread/222742/5#43
具体的代码如下:
void VS_WR_Data(unsigned long data)
{
while(digitalRead(VS_DQ)==0);
SPI.setClockDivider(SPI_CLOCK_DIV64);
SPI.port=SPI_PORT_CS2_MARY2;
SPItemp=SPI.transfer(data);
}
其中的“SPI.port=SPI_PORT_CS2_MARY2;”
就是我设想的实现SPI分控多个从器件的命令语句,可是结果并没有像我想象的那样乐观,
后经测试发现,该语句并未改变SPI对默认管脚CS0的片选,所以上述语句实际上是向命令
控制从器件发送数据,又如何能播放出声音呢。
说了这么多,希望瑞萨工程师能看明白我的问题所在,真心做了多次的测试,终没能找到
一种正确的方法(嘿嘿,这里没有什么理论指导,测试时用的是最基本的试错法),希望
瑞萨工程师看到这个帖子后能帮我解决这个难题,十分感谢!
同时,各位网友大虾目前正在使用SAKURA开发板上的SPI功能的,一起跟帖讨论,共同学习!
谢谢!