目录
2.Arduino添加 “SPI实验(Master与Slave互发数据并打印)”Sketch code
关于PKE8720DF-C13-F10开发板 的具体介绍请参考:Arduino 配置PKE8720DF-C13-F10开发板——“Blink” 周期性点亮LED灯_zoey_O_o__的博客-CSDN博客
1.PKE8720DF-C13-F10开发板SPI功能简介
PKE8720DF-C13-F10 支持主机或从机的操作模式。提供了两个 SPI 端口:
- SPI0(高速):配置为主机或从机,最大波特率 50MHz
- SPI1(正常速度):配置为主机,最大波特率 25MHz
本实验PKE8720DF-C13-F10开发板使用SPI1作为Master,使用SPI0作为Slave。
SPI1包括SPI1_MOSI(PA12)、SPI1_MISO(PA13)、SPI1_SCLK(PA14)、SPI1_SS(PA15);
SPI0包括SPI0_MOSI(PB18)、SPI0_MISO(PB19)、SPI0_SCLK(PB20)、SPI0_SS(PB21)。
2.Arduino添加 “SPI实验(Master与Slave互发数据并打印)”Sketch code
由于Arduino 基于board“ AMB25/AMB26 (RTL8720DF) ”没有直接可用的SPI Examples,这里我们需要自己新建一个sketch:
具体code 如下:
#include "device.h"
#include "diag.h"
#include "main.h"
#include "spi_api.h"
#define FakeMbedAPI 1
//SPI0
PinName SPIS_MOSI = PB_18;
PinName SPIS_MISO = PB_19;
PinName SPIS_SCLK = PB_20;
PinName SPIS_CS = PB_21;
//SPI1
PinName SPIM_MOSI = PA_12;
PinName SPIM_MISO = PA_13;
PinName SPIM_SCLK = PA_14;
PinName SPIM_CS = PA_15;
spi_t spi_master;
spi_t spi_slave;
void setup() {
// put your setup code here, to run once:
/* SPI1 is as Master */
spi_master.spi_idx=MBED_SPI1;
spi_init(&spi_master, SPIM_MOSI, SPIM_MISO, SPIM_SCLK, SPIM_CS);
spi_format(&spi_master, 8, 0, 0);
spi_frequency(&spi_master, 200000);
/* SPI0 is as Slave */
spi_slave.spi_idx=MBED_SPI0;
spi_init(&spi_slave, SPIS_MOSI, SPIS_MISO, SPIS_SCLK, SPIS_CS);
spi_format(&spi_slave, 8, 0, 1);
int TestingTimes = 10;
int Counter = 0;
int TestData = 0;
int ReadData = 0;
int result = 1;
/**
*
*/
printf("---------------Master read/write, Slave read/write---------------\n");
for(Counter = 0, TestData=0x01; Counter < TestingTimes; Counter++)
{
ReadData = spi_master_write(&spi_master, TestData);
printf("Master write: %02X, read: %02X\n", TestData, ReadData);
if (TestData - 1 != ReadData) {
result = 0;
}
TestData++;
spi_slave_write(&spi_slave, TestData);
ReadData = spi_slave_read(&spi_slave);
printf("Slave write: %02X, read: %02X\n", TestData, ReadData);
if (TestData - 1 != ReadData) {
result = 0;
}
TestData++;
}
/**
*
*/
printf("--------------Master write, Slave read----------------\n");
for(Counter = 0, TestData=0xFF; Counter < TestingTimes; Counter++)
{
spi_master_write(&spi_master, TestData);
ReadData = spi_slave_read(&spi_slave);
printf("Master write: %02X\n", TestData);
printf("Slave read : %02X\n", ReadData);
if (TestData != ReadData) {
result = 0;
}
TestData--;
}
spi_free(&spi_master);
spi_free(&spi_slave);
printf("SPI Demo finished.\n");
printf("\r\nResult is %s\r\n", (result) ? "success" : "fail");
for(;;);
}
void loop() {
// put your main code here, to run repeatedly:
}
3.代码解析
包含的3个头文件"device.h","diag.h",和 "spi_api.h" 为了调用实现SPI 功能的函数,可以在源码中查询GitHub - ambiot/ambd_arduino: AmebaD Arduino third-party package SDK 。
定义slave 和master的pin脚:
//SPI0
PinName SPIS_MOSI = PB_18;
PinName SPIS_MISO = PB_19;
PinName SPIS_SCLK = PB_20;
PinName SPIS_CS = PB_21;
//SPI1
PinName SPIM_MOSI = PA_12;
PinName SPIM_MISO = PA_13;
PinName SPIM_SCLK = PA_14;
PinName SPIM_CS = PA_15;
声明 master/slave 变量:
spi_t spi_master;
spi_t spi_slave;
setup 函数:
初始化spi_master/spi_slave 变量:
/* SPI1 is as Master */
spi_master.spi_idx=MBED_SPI1;
spi_init(&spi_master, SPIM_MOSI, SPIM_MISO, SPIM_SCLK, SPIM_CS);
spi_format(&spi_master, 8, 0, 0);
spi_frequency(&spi_master, 200000);
/* SPI0 is as Slave */
spi_slave.spi_idx=MBED_SPI0;
spi_init(&spi_slave, SPIS_MOSI, SPIS_MISO, SPIS_SCLK, SPIS_CS);
spi_format(&spi_slave, 8, 0, 1);
初始化测试次数和data:
int TestingTimes = 10;
int Counter = 0;
int TestData = 0;
int ReadData = 0;
调用spi_master_write 和spi_slave_read接口实现 Master write, Slave read功能:
printf("--------------Master write, Slave read----------------\n");
for(Counter = 0, TestData=0xFF; Counter < TestingTimes; Counter++)
{
spi_master_write(&spi_master, TestData);
ReadData = spi_slave_read(&spi_slave);
printf("Master write: %02X\n", TestData);
printf("Slave read : %02X\n", ReadData);
if (TestData != ReadData) {
result = 0;
}
TestData--;
}
调用spi_master_write接口实现master write,并将master readdata通过返回值输出;调用spi_slave_write接口实现slave write,调用spi_slave_read接口实现slave read;并行实现“Master write/read, Slave read/write”:
printf("---------------Master read/write, Slave read/write---------------\n");
for(Counter = 0, TestData=0x01; Counter < TestingTimes; Counter++)
{
ReadData = spi_master_write(&spi_master, TestData);
printf("Master write: %02X, read: %02X\n", TestData, ReadData);
if (TestData - 1 != ReadData) {
result = 0;
}
TestData++;
spi_slave_write(&spi_slave, TestData);
ReadData = spi_slave_read(&spi_slave);
printf("Slave write: %02X, read: %02X\n", TestData, ReadData);
if (TestData - 1 != ReadData) {
result = 0;
}
TestData++;
}
4.电路连接
(1)材料准备
- 1 块 PKE8720DF-C13-F10开发板
- 1 根 USB转type-C数据线
- 4 根杜邦线
(2)电路连接
将typc-c连接开发板,USB连接电脑。用四根杜邦线按如下方式连接SPI0和SPI1:
Connect SPI0_MOSI (PB_18) to SPI1_MOSI (PA_12)
Connect SPI0_MISO (PB_19) to SPI1_MISO (PA_13)
Connect SPI0_SCLK (PB_20) to SPI1_SCLK (PA_14)
Connect SPI0_CS (PB_21) to SPI1_CS (PA_15)
接线图如下:
(3)端口设置与烧录
请参考上一篇文章:Arduino 配置PKE8720DF-C13-F10开发板 —— UART回送用户输入的单个字符_zoey_O_o__的博客-CSDN博客
5.实验结果
打开串口调试工具,进行如下setting:
按板子上的RESET按键,这时候可以看到tool开始打印信息如下:
实验结果符合预期。