TC397 SPI(CPU)

Hardware Setup

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置QSPI

initQSPI() 函数初始化了Master和Slave端。

QSPI Slave initialization

相关操作在IfxQspi_SpiSlave.h

QSPI 从模块的初始化是通过定义 IfxQspi_SpiSlave_Config 结构的实例来完成的。
该结构由函数填充默认值 IfxQspi_SpiSlave_initModuleConfig()
然后,设置引脚、ISR 终端服务与优先级
IfxQspi_SpiSlave_initModule() 函数用于初始化 QSPI 从模块。
此外,初始化 QSPI 从机使用的缓冲区。

QSPI Master initialization

相关操作在 IfxQspi_SpiMaster.h

QSPI 主模块的初始化是通过定义 IfxQspi_SpiMaster_Config 结构的实例来完成的。
该结构由函数填充默认值 IfxQspi_SpiMaster_initModuleConfig()
之后,设置接口操作模式、引脚、ISR 中断服务和优先级。
IfxQspi_SpiMaster_initModule()函数用于初始化QSPI主模块
一个 QSPI 模块控制 16 个可单独编程的通信通道。 在此示例中,函数 initQSPI2MasterChannel() 使用结构 IfxQspi_SpiMaster_ChannelConfig 的实例初始化通道零。 然后通过参数 sls.output 设置从机选择通道号,通过参数 base.baudrate 修改波特率。
IfxQspi_SpiMaster_initChannel() 函数用于初始化 QSPI 主通道。
此外,QSPI 主机使用的缓冲区也被初始化。

QSPI Master - Slave communication

函数 transferData() 触发 SPI-Master 和 SPI-Slave 之间的数据传输。

IfxQspi_SpiSlave_getStatus()IfxQspi_SpiMaster_getStatus() 函数用于检查主机和从机的状态,以便延迟传输直到两者都空闲。

函数 IfxQspi_SpiSlave_exchange() 指示从机接收预定义长度的数据流。
调用函数 IfxQspi_SpiMaster_exchange() 以指示主机发送数据。
最后,函数 verifyData() 检查 Slave 接收到的数据是否与 Master 发送的数据匹配。
如果在通信过程中没有发生错误,则连接到端口引脚 13.3 的 LED D110 会亮起,表示传输成功

Run and Test

代码编译和设备编程后,执行以下步骤:
1.在 Cpu0_main.c 中为 transferData() 设置断点,并检查 spiBuffers 结构中的 spiMasterTxBuffer 和 spiSlaveRxBuffer。
2.运行代码示例并检查 LED D110 (1) 是否亮起(数据传输无误)。
3.spiMasterTxBuffer 和 spiSlaveRxBuffer 现在应该显示相同的发送和接收数据。
4.移除电缆(例如 SCLKx),执行复位并重新运行应用程序以查看数据传输中断且 LED D110 (1) 熄灭(数据传输受阻)。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GD32是一款基于ARM Cortex-M3架构的微控制器。在GD32系列微控制器中,SPI接口和DMA控制器的结合使用可以提高系统性能并节省CPU资源。 以下是使用GD32 SPI DMA的基本步骤: 1. 配置SPI接口的时钟、数据位数、极性、相位等参数。 2. 配置DMA控制器的通道、数据长度、传输方向、存储器地址和外设地址等参数。 3. 编写DMA传输完成的中断处理函数,用于处理传输完成后的操作。 4. 启动DMA传输,并等待DMA传输完成。 下面是一个简单的示例代码,用于在GD32微控制器中使用SPI和DMA: ```c #include "gd32f10x.h" #define SPIx SPI1 #define SPIx_CLK RCC_APB2Periph_SPI1 #define SPIx_IRQn SPI1_IRQn #define SPIx_IRQHandler SPI1_IRQHandler #define SPIx_DMA_CLK RCC_AHBPeriph_DMA1 #define SPIx_TX_DMA_CHANNEL DMA1_Channel3 #define SPIx_TX_DMA_FLAG_TC DMA1_FLAG_TC3 #define SPIx_TX_DMA_FLAG_GL DMA1_FLAG_GL3 void SPIx_DMA_Config(uint8_t *pBuffer, uint16_t BufferSize) { DMA_InitTypeDef DMA_InitStructure; RCC_AHBPeriphClockCmd(SPIx_DMA_CLK, ENABLE); DMA_DeInit(SPIx_TX_DMA_CHANNEL); DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&SPIx->DR; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)pBuffer; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST; DMA_InitStructure.DMA_BufferSize = BufferSize; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStructure.DMA_Mode = DMA_Mode_Normal; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_Init(SPIx_TX_DMA_CHANNEL, &DMA_InitStructure); DMA_Cmd(SPIx_TX_DMA_CHANNEL, ENABLE); } int main(void) { uint8_t data[] = {0x01, 0x02, 0x03, 0x04}; uint8_t rx_data[4]; RCC_APB2PeriphClockCmd(SPIx_CLK, ENABLE); SPI_I2S_DeInit(SPIx); SPI_Init(SPIx, SPI_FirstBit_MSB, SPI_Mode_Master, SPI_DataSize_8b, SPI_CPOL_Low, SPI_CPHA_1Edge, SPI_NSS_Soft, SPI_BaudRatePrescaler_256); SPI_SSOutputCmd(SPIx, ENABLE); SPI_Cmd(SPIx, ENABLE); SPIx_DMA_Config(data, sizeof(data)); while (DMA_GetFlagStatus(SPIx_TX_DMA_FLAG_TC) == RESET); DMA_ClearFlag(SPIx_TX_DMA_FLAG_GL); SPIx_DMA_Config(rx_data, sizeof(rx_data)); while (DMA_GetFlagStatus(SPIx_TX_DMA_FLAG_TC) == RESET); DMA_ClearFlag(SPIx_TX_DMA_FLAG_GL); return 0; } ``` 在这个例子中,我们使用SPI1作为SPI接口,并使用DMA1的通道3用于传输数据。我们首先配置了SPI接口和DMA控制器,然后使用SPIx_DMA_Config函数配置DMA传输。在主循环中,我们等待DMA传输完成,并清除DMA传输标志。最后,我们可以从rx_data数组中读取接收到的数据。 需要注意的是,在使用SPI和DMA时,需要确保SPI接口和DMA控制器的时钟都已经打开。此外,我们还需要在DMA传输完成后清除DMA传输标志,以便下一次传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值