Arduino 配置PKE8720DF-C13-F10开发板 —— SPI实验(Master与Slave互发数据并打印)

目录

1.PKE8720DF-C13-F10开发板SPI功能简介

2.Arduino添加 “SPI实验(Master与Slave互发数据并打印)”Sketch code 

3.代码解析 

4.电路连接

(1)材料准备

(2)电路连接

(3)端口设置与烧录

5.实验结果


关于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开始打印信息如下:

 实验结果符合预期。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值