主题中讨论的其他器件:EK-TM4C1294XL
工具/软件:Code Composer Studio
大家好!
我目前正在处理一个项目、涉及在 DMA 模式下使用四路 SPI (QSPI)通信。 我要查找专门涉及此主题的任何文章、教程或文档。
- QSPI 中 DMA 模式的配置和设置。
- 演示 QSPI 与 DMA 的代码示例或示例项目。
- DMA 模式下 QSPI 的常见缺陷和故障排除提示。
如果有人能向我介绍相关资源或分享自己的经验、我会非常感激。
提前感谢您的帮助!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
大家好!
我目前正在处理一个项目、涉及在 DMA 模式下使用四路 SPI (QSPI)通信。 我要查找专门涉及此主题的任何文章、教程或文档。
如果有人能向我介绍相关资源或分享自己的经验、我会非常感激。
提前感谢您的帮助!
您好!
我们有一个针对 QSPI 的非 DMA 示例。 您可以在 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\SSI_quad_mode 中找到示例。
我们有一个 uDMA 示例、演示了两个存储器之间以及存储器与 UART 之间的传输。 我们没有针对 QSPI 的 uDMA 示例。 但是、您可以改编 UDMA 中 UART 到 SPI 的示例。 此示例可在 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\udma_demo 中找到。
您好 Charles、非常感谢您的响应 C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\ssi_quad_mode 此处的 示例基于 RTOS、我将寻找不带 RTOS 的示例。 我曾尝试在没有 RTOS 的情况下修改上述示例、但它对我不起作用。 如果您有任何建议、请告诉我。
器件型号:ektm4c129exl 评估板
主题: TivaWare_C_Series-2.2.0.295
#包含
#包含
#包含
#包含
#include "driverlib/ssi.h"
#include "driverlib/sysctl.h"
#include "driverlib/pin_map.h"
#include "driverlib/interrupt.h"
#include "driverlib/gpio.h"
#include "inc/hw_ints.h"
#include "inc/hw_ssi.h"
#include "inc/hw_memmap.h"
#define configCPU_CLOCK_Hz (( unsigned long ) 120000000 )
//用于接收数据的全局变量
uint32_t g_pui32DataRx1[4];
uint32_t g_ui32Index = 0;
//函数原型
静态空 prvConfigureSSIMaster (void);
静态空 prvConfigureSSISlave (void);
静态空 prvSSITransmitTask (void);
静态空 prvSSIReceiveTask (void);
void delayMs (int ms);
int main (空)
{
//将 SSI0配置并初始化为主机
prvConfigureSSIMaster();
//将 SSI1配置并初始化为从设备
prvConfigureSSISlave();
prvSSITransmitTask();
prvSSIReceiveTask();
while (1)
{
}
返回0;
}
静态空 prvConfigureSSIMaster (void)
{
uint32_t ui32DummyRead;
/*必须使能 SSI0外设才能使用。 */
SysCtlPeripheralEnable (SYSCTL_Periph_SSI0);
/*该示例使用端口 A[7:2]作为 SSI0引脚。 GPIO 端口需要
*启用以使用这些引脚。 */
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
/*配置 SSI 管脚的 GPIO 设置。 该函数还为
*控制这些引脚到 SSI 硬件。 请查阅数据表以
*查看每个引脚分配了哪些函数。 */
/*为 SSI0功能配置管脚复用。 SSI0对
* SSICLK、SSIFss 和4个数据管脚。 需要启用 GPIO 端口、
*可以使用这些引脚。
* GPIO 引脚分配如下:
* PA7 - SSI0XDAT3
* PA6 - SSI0XDAT2
* PA5 - SSI0XDAT1
* PA4 - SSI0XDAT0
* PA3 - SSI0Fss
* PA2 - SSI0CLK */
GPIOPinConfigure (GPIO_PA2_SSI0CLK);
GPIOPinConfigure (GPIO_PA3_SSI0FSS);
GPIOPinConfigure (GPIO_PA4_SSI0XDAT0);
GPIOPinConfigure (GPIO_PA5_SSI0XDAT1);
GPIOPinConfigure (GPIO_PA6_SSI0XDAT2);
GPIOPinConfigure (GPIO_PA7_SSI0XDAT3);
GPIOPinTypeSSI (GPIO_Porta_base、GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_5 |
GPIO_PIN_4 | GPIO_PIN_3 | GPIO_PIN_2);
//*配置并启用 SPI 主模式的 SSI0端口。 使用 SSI0、
*系统时钟电源,空闲时钟低电平和低电平有效时钟
*飞思卡尔 SPI 模式、主机模式、2MHz SSI 频率、8位数据。 实现
* SPI 模式、您可以在 SSI 单元为
*空闲。 您还可以配置您希望捕获数据的时钟边沿、
*开启。 请参考器件数据表以了解有关
*不同的 SPI 模式。 */
SSIConfigSetExpClk (SSI0_BASE、configCPU_CLOCK_Hz、SSI_FRF_MOTO_MODE_0、
SSI_MODE_MASTER、
2000000,8);
/*为 SSI0启用 Quad-SSI 模式。 */
SSIAdvModeSet (SSI0_BASE、SSI_ADV_MODE_QUAD_WRITE);
/*在传输期间将 FSS 引脚保持为低电平。 将控制 FSS
*直接由 SSIAdvDataPutFrameEnd()执行。 如果调用
* SSIAdvDataPutFrameEnd 要将数据写入 FIFO、FSS 将被取消置位
*对应的数据。 */
SSIAdvFrameHoldEnable (SSI0_BASE);
/*启用 SSI0模块。 */
SSIEnable (SSI0_BASE);
/*从 SSI 端口读取任何剩余数据。 这可确保接收
* FIFO 为空,所以我们不会读取任何不需要的垃圾邮件。 在这里完成
*因为 SPI SSI 模式是全双工的,允许您发送和
*同时接收。 SSIDataGetNonBlocking 函数返回
*返回数据时为"true"、未返回数据时为"false"。
*"非阻塞"功能检查接收数据中是否存在任何数据
* FIFO 和不会"挂起"如果没有. */
while (SSIDataGetNonBlocking (SSI0_BASE、&ui32DummyRead))
{
}
}
静态空 prvConfigureSSISlave (void)
{
uint32_t ui32DummyRead;
//必须启用 SSI1外设。 */
SysCtlPeripheralEnable (SYSCTL_Periph_SSI1);
/*该示例将端口 B、D 和 E 用作 SSI1引脚。 GPIO 端口
*需要启用才能使用这些引脚。 */
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOD);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
/*配置 SSI 管脚的 GPIO 设置。 该函数还为
*控制这些引脚到 SSI 硬件。 请查阅数据表以
*查看每个引脚分配了哪些函数。 */
/*为 SSI1功能配置管脚复用。 SSI1使用
*用于 SSICLK、SSIFss 和4个数据引脚的 PortB、PortD 和 Porte。
*需要启用 GPIO 端口才能使用这些引脚。
* GPIO 引脚分配如下:
* PD5 - SSI1XDAT3
* PD4 - SSI1XDAT2
* PE5 - SSI1XDAT1
* PE4 - SSI1XDAT0
* PB4 - SSI1Fss
* PB5 - SSI1CLK */
GPIOPinConfigure (GPIO_PB5_SSI1CLK);
GPIOPinConfigure (GPIO_PB4_SSI1FSS);
GPIOPinConfigure (GPIO_PE4_SSI1XDAT0);
GPIOPinConfigure (GPIO_PE5_SSI1XDAT1);
GPIOPinConfigure (GPIO_PD4_SSI1XDAT2);
GPIOPinConfigure (GPIO_PD5_SSI1XDAT3);
GPIOPinTypeSSI (GPIO_PORTB_BASE、GPIO_PIN_5 | GPIO_PIN_4);
GPIOPinTypeSSI (GPIO_PORTD_BASE、GPIO_PIN_5 | GPIO_PIN_4);
GPIOPinTypeSSI (GPIO_Port_BASE、GPIO_PIN_5 | GPIO_PIN_4);
/*根据匹配情况为 SPI 从机模式配置并启用 SSI1端口
* SPI 模式、时钟速度和数据大小参数作为主机。 */
SSIConfigSetExpClk (SSI1_BASE、configCPU_CLOCK_Hz、SSI_FRF_MOTO_MODE_0、
SSI_MODE_SLAVE、
2000000,8);
/*为 SSI1启用 Quad-SSI 模式。 */
SSIAdvModeSet (SSI1_BASE、SSI_ADV_MODE_QUAD_READ);
/*在接收 FIFO 为半空或多于半空时启用 SSI1中断。 */
SSIIntEnable (SSI1_BASE、SSI_RXFF);
/*在 NVIC 中使能 SSI1中断。 */
IntEnable (INT_SSI1);
/*启用 SSI1模块。 */
SSIEnable (SSI1_BASE);
/*从 SSI 端口读取任何剩余数据。 这可确保接收
* FIFO 为空,所以我们不会读取任何不需要的垃圾邮件。 在这里完成
*因为 SPI SSI 模式是全双工的,允许您发送和
*同时接收。 SSIDataGetNonBlocking 函数返回
*返回数据时为"true"、未返回数据时为"false"。
*"非阻塞"功能检查接收数据中是否存在任何数据
* FIFO 和不会"挂起"如果没有. */
while (SSIDataGetNonBlocking (SSI1_base、&ui32DummyRead))
{
}
}
静态空 prvSSITransmitTask (void)
{
uint32_t pui32DataTx0[4]={'T'、'I'、'V'、'A'};
INT I=0;
/*虚拟写入以启动四路 SSI 模式操作所需的从器件。 */
SSIDataPut (SSI0_BASE、0);
对于(I=0;I<4;I++){
/*检查最后一个数据字节是否排队等待发送。 */
如果(i =(4 - 1)){
/*在最后一个数据上调用 SSIAdvDataPutFrameEnd 将输出
*数据并使 FSS 引脚无效。 */
SSIAdvDataPutFrameEnd (SSI0_BASE、pui32DataTx0[i]);
}其他{
/*使用"阻塞" Put 函数发送数据。 */
SSIDataPut (SSI0_BASE、pui32DataTx0[i]);
}
}
}
静态空 prvSSIReceiveTask (空)
{
uint32_t pui32DataRx1[4];
uint32_t ui32Index;
/*检查接收 FIFO 中是否有可用数据*/
while (! SSIIntStatus (SSI1_BASE、SSI_RXFF)
{
(一)公司名称;
}
/*接收数据*/
对于(ui32Index = 0;ui32Index < 4;ui32Index++)
{
/*使用"阻塞"get 函数接收数据。 */
SSIDataGet (SSI1_base、&pui32DataRx1[ui32Index]);
/*由于我们使用的是8位数据,因此需要对 MSB 进行屏蔽。 */
Pui32DataRx1[ui32Index]&= 0x00FF;
}
}
// SSI1中断处理程序
void SSI1IntHandler (void)
{
uint32_t ui32Status;
//读取中断状态
ui32Status = SSIIntStatus (SSI1_base、true);
//清除产生的中断
SSIIntClear (SSI1_BASE、ui32Status);
//检查中断是否是由于 RX FIFO 半满所致
IF (ui32Status 和 SSI_RXFF)
{
//接收数据
while (SSIDataGetNonBlocking (SSI1_base、&g_pui32DataRx1[g_ui32Index])&&(g_ui32Index < 4))
{
//由于我们使用的是8位数据,因此需要对 MSB 进行屏蔽
G_pu32DataRx1[g_ui32Index]&= 0x00FF;
//递增索引
G_ui32Index++;
}
//如果接收到所有数据
如果(g_ui32Index >= 4)
{
//调用接收任务函数
prvSSIReceiveTask();
//重置下一次接收的索引
G_ui32Index = 0;
}
}
}
//延迟功能
void delayMs (int ms){
SysCtlDelay ((configCPU_CLOCK_Hz /(3 * 1000))* ms);
}
尊敬的 Priya:
C:\ti\TivaWare_C_Series-2.2.0.295\examples\boards\ek-tm4c1294xl\SSI_quad_mode\目录中无此类文件。 请参见下方的。 您可能使用了 https://www.ti.com/lit/pdf/spma086的应用手册中的 FreeRTOS 示例覆盖了该目录。
何不再次下载 TivaWare SDK 呢?