这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 企业专区 » Renesas » 天籁齐舞★USBHost对USB从设备供应商ID和产品ID等信息的读取★

共58条 2/6 1 2 3 4 5 6 ›| 跳转至
院士
2012-11-23 11:05:43     打赏
11楼
小鱼复活了

高工
2012-11-23 12:39:28     打赏
12楼

走过路过请勿错过。


助工
2012-11-25 17:35:15     打赏
13楼
期待明天板子到达

助工
2012-11-27 23:52:25     打赏
14楼

最近几天,一直在学习camozeng、瑞萨小鱼等的学习教程,并对其中的部分示例进行了模仿,由此也初步了解了Arduino系统的开发方法。
不过,看了许多鲜有介绍SPI class通信的相关例程,由于本次方案中要用到SPI通信,所以有必要将Arduino的SPI库函数好好地学习一下。
首先,我的学习网址,瑞萨的樱花开发板的Web编译器内部自带的教程,链接如下:
http://tool-cloud.renesas.com/Renesas/ref/library_spi.html
原文是日文的,看不懂,在Bing翻译的帮助下,整理出以下文档:

SPI 通信协议库

 

SPI ( SPI class)

         SPI库用于两个微控制器之间的通信,如果要在程序中使用,需要在文件头中加入:

#include<spi.h>

begin

概要

初始化,当与SDMMC库一起使用时,SDMMC先开始

语法

SPI.begin()

参数

No

返回值

No

 

end

概要

停止SPI,释放所占用的I/O口管脚。

语法

SPI.end()

参数

No

返回值

No

 

setBitLength

概要

设定发送和接收的比特的长度。

语法

SPI.setBitLength(int bitLength)

参数

bitLength:可选的值为:816,20,24,32.默认值是8

返回值

No

 

SetBitOrder

概要

设定一个方向,高位先发送还是低位先发送。

语法

SPI.setBitOrder(bitOrder)

参数

bitOrder:bit order(MSBFIRST, LSBFIRST).默认为MSBFIRST

返回值

No

 

SetClockDivider

概要

设置SPI时钟的速度。

语法

SPI.setClockDivider(divider)

参数

下列值任选其一:divider

SPI_CLOCK_DIV2: 24MHz

SPI_CLOCK_DIV4: 12MHz

SPI_CLOCK_DIV8: 6MHz

SPI_CLOCK_DIV16: 3MHz

SPI_CLOCK_DIV32: 1.5MHz

SPI_CLOCK_DIV64: 750KHz

SPI_CLOCK_DIV128: 375KHz

返回值

No

 

SetDataMode

概要

设置SPI数据传输的模式。

语法

SPI.setDataMode(mode)

参数

设定如下其中一个模式:mode。默认的模式为:0。当设置SDMMC23模式不可用。

SPI_MODE0

SPI_ MODE1

SPI_ MODE2

SPI_ MODE3

返回值

No

 

transfer

概要

发送和接收SPI的数据。

语法

SPI.transfer(value)

参数

Value: 数据位从832位,其位数的长短取决于setBitLength中的设置。

返回值

SPI接收总线上的数值。

 


助工
2012-11-27 23:57:55     打赏
15楼

再学习了SPI库函数之后,对基于Arduino的SPI通信有了一定的了解,同时再结合VS1053B的Datasheet中关于SPI通信协议的说明,为了有利于大家帮我解决我的疑惑,我特将刚刚学习到的VS1053B的SPI通信协议再次介绍一下:

VS1053BSPI控制总线的使用

 

VS1053B中被用于串行数据接口SDI和串行控制接口SCI

由于VS1053B内部有多种工作模式,主要是考虑到向下兼容而设定,其中包括VS1002新模式和VS1001兼容模式,模式的设定由VS1053B中的SM_SDINEW的值来决定,SM_SDINEW=1时为VS1002新模式,SM_SDINEW=0时为VS1001兼容模式,并且官方建议使用VS1002新模式,所以这里决定采用VS1002新模式,这也是VS1053B启动时的缺省值。

         VS1001兼容模式下,控制SPI总线和数据传输的SPI总线是独立的:

即,控制SPI总线由:

XCS:控制总线片选信号,低电平有效的片选信号。

         SCK:控制总线的串行时钟输入,此时钟也作为内部寄存器接口的工作时钟来源。SCK电平在平时可以是时钟信号也可以是平静信号(持续高电平或持续低电平),只要在XCS信号变低之后的首个时钟上升沿将被定义为首个被写入VS1053B的比特位。

         SI:控制总线的串行输入,如果片选XCS有效,则SI是在时钟SCK的上升沿上取样的。

         SO:控制总线的串行输出,在Master端向VS1053B读数据时,数据是逐位移动输出在时钟SCK的下降沿上。而在写入是,它是处于高阻态的。

而,数据传输SPI总线是由:

         BSYNC:数据传输同步信号,低电平有效,当BSYNC为低时指示数据开始传输。

         DCLK:数据总线的串行时钟输入,在BSYNC信号变低后,首个DCLK的上升沿将被定义为首个数据比特位。

         SDATA:数据传输的串行输入至VS1053B,如果同步信号BSYNC有效,SDATA是在数据时钟DCLK的上升沿上取样的。

         VS1002新模式中考虑到对外接口的简洁性,就将控制SPI接口和数据SPI接口整合到了一起,即将:SCKDCLK整合在一起为:新的SCK

                              SISDATA整合在一起为:新的SI

                              BSYNC改换为XDCS,作为数据传输SPI的片选信号;

         如此,整合后的SPI管脚如下表:

 

         这里控制SPI总线和数据传输SPI总线的SPI模式的设定是由SCI_MODE来决定的,详见VS1053Bdatasheet的第8.7节。

待续。。。


助工
2012-11-28 00:01:16     打赏
16楼

SCI串行命令接口的串行协议(SCI

 

         由于SCI数据是在SCK的上升沿读取的,所以用户只能在SCK的下降沿上更新数据。每个字节的MSB总是被首先发送。在整个传送操作的期间,XCS必须要保持为低电平。

         这些操作是通过8为指令码来指定的:

 

SCI读操作:

 

XCS信号应该在16位数据从SO口移动送出后驱动到高电平。

DREQ在读取操作期间会被芯片短暂的拉到低电平,这是非常短的时间,并不需要USER特别的留意。

 

SCI写操作:

 

在这个数据字移位发送的最后一个时钟结束之后,XCS应该上拉到高电平结束这个写入顺序。(关于具体的指令可参见VS1053Bdatasheet的第8.7章)

         
待续。。。


助工
2012-11-28 00:38:26     打赏
17楼

SCI寄存器:

 

默认的情况下:

DCLK在上升沿有效,SDIMSBFIRSTVS1002本地SPI模式,LINE1作为声音的输入端,输入时钟的范围为:1213MHz
由此,可知,在VS1053B复位后,默认的SPI模式为:SPI_Mode0模式。

程序待续中。。。


助工
2012-11-28 01:00:24     打赏
18楼
SPI测试程序:
程序中要调用库函数:gr_sakura_spi,如图所示:

gr_sketch.cpp中的程序如下:
#include <rxduino.h>
#include <spi.h>

void setup(){
pinMode(PIN_LED0,OUTPUT);
Serial.begin(9600); //set baudrate 9600bps
//SPI.port=SPI_PORT_CS0_DUINO;
SPI.port=SPI_PORT_RAXINO_EXT;
SPI.setBitOrder(MSBFIRST);
SPI.setBitLength(16);
SPI.setClockDivider(SPI_CLOCK_DIV64);
SPI.setDataMode(SPI_MODE1);
SPI.begin();
Serial.println("Please send SPI command!");
}

void loop()
{
digitalWrite(PIN_LED0,1); //set led0 on
while(!Serial.available()); //wait command from upper computer
char c=Serial.read();
if(c=='r') //if receive command 'r'
{
//unsigned long res = SPI.transfer(34275379);
unsigned long res = SPI.transfer(51052544); //0000 0011 0000 1011 0000 0000 0000 0000
//unsigned long res1 = SPI.transfer(0);

//unsigned long res1 = SPI.transfer(2197881089);
Serial.println(res, BIN); //output the result in BIN
//Serial.println(res1, BIN); //output the result in BIN
}
else
{
Serial.println("Please send the right SPI command!");
}
digitalWrite(PIN_LED0,0); //turn off the led0
}


目前,还纠结在transfer()函数中,经过数次测试,均不能有效返回预期结果,希望大侠们给予指点,谢谢!

助工
2012-11-28 01:03:50     打赏
19楼

如下为上述程序测试返回结果图:


菜鸟
2012-11-28 17:01:02     打赏
20楼
SPI.setDataMode(SPI_MODE1) Mode1?

共58条 2/6 1 2 3 4 5 6 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]