跳到主要内容

34 SCI 配置 SPI

在这里插入图片描述

开发板官网https://www.edevkit.com/)

本系列教程目录:


SCI SPI 实验

本章目标:

  • 了解 RA6M5 处理器的 SCI SPI 模块
  • 学会使用 RASC 配置 SCI SPI,使用 API 读写数据。

硬件设计(略,参见配套硬件原理图)

软件设计

新建工程

复制一份 “07 SCI_UART_Recv_send” 修改文件夹名 “34 SCI_SPI”,双击打开 EBF_RA6M5.uvprojx 工程,通过 Keil 的新建文件新建 sci_spi.csci_spi.h 保存到目录下的 \src 文件夹下。

FSP 配置

Keil 界面选择 “Tools”→“RA Smart Configurator” 打开 RASC 界面。

在 “Pins” 添加 SCI 设备,配置成 Simple SPI 模式。

插图01

在 “Stack” 添加 SCI SPI Stack 模块。

插图02

配置 SCI SPI 模块参数。

插图03

配置完成之后可以按下快捷键“Ctrl + S”保存,最后点击 “Generate Project Content” 按钮,让软件自动生成配置代码即可。

程序设计

初始化 SCI SPI 模块,实现数据回环收发,需要把 SPI 的 MOSI 和 MISO 互接,SCI SPI 的 RXD0 对应 MISO,TXD0 对应 MOSI,测试接收的数据打印到串口。

  1. 打开 SCI SPI 设备
fsp_err_t R_SCI_SPI_Open(spi_ctrl_t * p_ctrl, spi_cfg_t const * const p_cfg);
  1. 直接写数据
fsp_err_t R_SCI_SPI_Write(spi_ctrl_t * const p_ctrl,
void const * p_src,
uint32_t const length,
spi_bit_width_t const bit_width);
  1. 直接读数据
fsp_err_t R_SCI_SPI_Read(spi_ctrl_t * const p_ctrl,
void * p_dest,
uint32_t const length,
spi_bit_width_t const bit_width);
  1. 读写数据
fsp_err_t R_SCI_SPI_WriteRead(spi_ctrl_t * const p_ctrl,
void const * p_src,
void * p_dest,
uint32_t const length,
spi_bit_width_t const bit_width);

程序编写

sci_spi.h 头文件定义初始化和读写函数。

#ifndef __BSP_SCI_SPI_H
#define __BSP_SCI_SPI_H
#include "hal_data.h"

void sci_spi_Init(void);

void SCI_SPI_WriteRead_data(uint8_t *wBuf, uint8_t *rBuf, uint16_t len);

#endif

sci_spi.c 中实现读写。

#include "sci_spi.h"

void sci_spi_Init(void)
{
R_SCI_SPI_Open(g_sci_spi2.p_ctrl, g_sci_spi2.p_cfg);
}

static volatile bool gSPITxCplt = false;
void sci_spi_callback(spi_callback_args_t *arg)
{
/* 判断是否是发送完成触发的中断 */
/* 如果是的话就将发送完成标志位置1 */
if(SPI_EVENT_TRANSFER_COMPLETE == arg->event)
gSPITxCplt = true;
}

static void SPIWaitTxCplt(void)
{
uint16_t wTimeout = 50;
while(!gSPITxCplt && wTimeout)
{
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MILLISECONDS);
wTimeout--;
}
gSPITxCplt = false;
}

void SCI_SPI_WriteRead_data(uint8_t *wBuf, uint8_t *rBuf, uint16_t len)
{
R_SCI_SPI_WriteRead(g_sci_spi2.p_ctrl, wBuf, rBuf, len, SPI_BIT_WIDTH_8_BITS);

SPIWaitTxCplt();
}

hal_entry.c 文件中添加 sci_spi.h,循环中每秒读写数据。

uint8_t wBuf[10] = {0};
uint8_t rBuf[10] = {0};

void hal_entry(void)
{
/* TODO: add your own code here */

led_Init(); // LED 初始化
uart0_Init();
sci_spi_Init();

printf("start sci spi test\r\n");

for(uint8_t i=0; i<10; i++)
{
wBuf[i] = i;
}

while(1)
{
LED1_TOGGLE();
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_SECONDS); //延时1秒

SCI_SPI_WriteRead_data(wBuf, rBuf, 10);
printf("sci spi rx:");
for(int i=0; i<10; i++)
{
printf("%x ", rBuf[i]);
}
printf("\r\n");
}


#if BSP_TZ_SECURE_BUILD
/* Enter non-secure code */
R_BSP_NonSecureEnter();
#endif
}

下载验证

连接下载器,将程序编译并下载到开发板之后,按下复位按键来复位开发板,程序启动初始化完。

可以看到每秒接收数据值。

插图04