最近几天,一直在学习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:可选的值为:8到16,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。当设置SDMMC时2、3模式不可用。 SPI_MODE0: SPI_ MODE1: SPI_ MODE2: SPI_ MODE3: |
返回值 |
No |
transfer
概要 |
发送和接收SPI的数据。 |
语法 |
SPI.transfer(value) |
参数 |
Value: 数据位从8到32位,其位数的长短取决于setBitLength中的设置。 |
返回值 |
SPI接收总线上的数值。 |
再学习了SPI库函数之后,对基于Arduino的SPI通信有了一定的了解,同时再结合VS1053B的Datasheet中关于SPI通信协议的说明,为了有利于大家帮我解决我的疑惑,我特将刚刚学习到的VS1053B的SPI通信协议再次介绍一下:
VS1053B中SPI控制总线的使用
在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接口整合到了一起,即将:SCK与DCLK整合在一起为:新的SCK;
SI和SDATA整合在一起为:新的SI;
BSYNC改换为XDCS,作为数据传输SPI的片选信号;
如此,整合后的SPI管脚如下表:
这里控制SPI总线和数据传输SPI总线的SPI模式的设定是由SCI_MODE来决定的,详见VS1053B的datasheet的第8.7节。
待续。。。
SCI串行命令接口的串行协议(SCI)
由于SCI数据是在SCK的上升沿读取的,所以用户只能在SCK的下降沿上更新数据。每个字节的MSB总是被首先发送。在整个传送操作的期间,XCS必须要保持为低电平。
这些操作是通过8为指令码来指定的:
SCI读操作:
XCS信号应该在16位数据从SO口移动送出后驱动到高电平。
DREQ在读取操作期间会被芯片短暂的拉到低电平,这是非常短的时间,并不需要USER特别的留意。
SCI写操作:
在这个数据字移位发送的最后一个时钟结束之后,XCS应该上拉到高电平结束这个写入顺序。(关于具体的指令可参见VS1053B的datasheet的第8.7章)
待续。。。
程序中要调用库函数: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()函数中,经过数次测试,均不能有效返回预期结果,希望大侠们给予指点,谢谢!
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【笔记】生成报错synthdesignERROR被打赏50分 | |
【STM32H7S78-DK评测】LTDC+DMA2D驱动RGBLCD屏幕被打赏50分 | |
【STM32H7S78-DK评测】Coremark基准测试被打赏50分 | |
【STM32H7S78-DK评测】浮点数计算性能测试被打赏50分 | |
【STM32H7S78-DK评测】Execute in place(XIP)模式学习笔记被打赏50分 | |
每周了解几个硬件知识+buckboost电路(五)被打赏10分 | |
【换取逻辑分析仪】RA8 PMU 模块功能寄存器功能说明被打赏20分 | |
野火启明6M5适配SPI被打赏20分 | |
NUCLEO-U083RC学习历程2-串口输出测试被打赏20分 | |
【笔记】STM32CUBEIDE的Noruletomaketarget编译问题被打赏50分 |