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.

[参考译文] PROCESSOR-SDK-AM335X:SPI 接收不工作

Guru**** 2616675 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/661107/processor-sdk-am335x-spi-receive-not-working

器件型号:PROCESSOR-SDK-AM335X

我开始实施 SPI für SPI1并以 SPI0闪存示例为基础、但无法使其正常工作。 我似乎甚至没有收到任何数据。 我启用了所有时钟并为所有需要的引脚配置了 Pinmux。 我只想接收数据。 SPI 接收寄存器"MCSPI_RX0"始终为零、从不触发中断。 在下面的代码中、您可以看到我的代码。 我缺少什么吗?

更新1:删除激活 RX FIFO 的行后、我现在在 MCSPI_RX0寄存器中具有正确的数据、但我的接收中断未被触发。 现在、我尝试使用 FIFO 寄存器。

Update2:中断现在在无 FIFO 模式下触发。 我错过了启用主中断(IntMasterIRQEnable)。

#define PINMODE3 3

McSPI1ModuleClkConfig ();

McSPIReset (MCSPISLV_MCSPI_regs);
MCSPIConfigSysSetup (MCSPISLV_MCSPI_Regs、MCSPI_Clocks_OCP_ON_FUNC_ON、
MCSPI_SIDLEMODE_NO、MCSPI_WAKEUP_DISABLE、
MCSPI_AUTOIDLE_OFF);
McSPICSEnable (MCSPISLV_MCSPI_regs);
McSPISlaveModeEnable (MCSPISLV_MCSPI_regs);
MCSPIPinDirSet (SOC_SPI_1_regs、MCSPI_RX_ONENT_MODE、 MCSPI_DATA_LINE_COMM_MODE_7、0);
MCSPIMultiChModeEnable (SOC_SPI_1_regs);
McSPIClkConfig (SOC_SPI_1_regs、MCSPI_IN_CLK、 MCSPI_OUT_FREQ、
MCSPI_CH_NUM、MCSPI_CLK_MODE_0);

McSPIWordLengthSet (MCSPISLV_MCSPI_regs、MCSPI_WORD_LENGTH (8)、MCSPI_CH_ZERO);

McSPICSPPolarityConfig (MCSPISLV_MCSPI_Regs、MCSPI_CS_POL_LOW、MCSPI_CH_ZERO);

McSPIIntEnable (MCSPISLV_MCSPI_Regs、MCSPI_INT_RX_FULL (MCSPI_CH_ZERO));

McSPIRxFIFOConfig (MCSPISLV_MCSPI_regs、MCSPI_RX_FIFO_ENABLE、MCSPI_CH_ZERO);

/*初始化 ARM 中断控制器。 *
IntAINTCInit();

/*注册中断。 *
IntRegister (SYS_INT_SPI1INT、SPIReceiveIsr);

/*在 AINTC 中设置中断的优先级。 *
IntPrioritySet (SYS_INT_SPI1INT、0、AINTC_HOSTINT_route_IRQ);

/*在 AINTC 中启用中断。 *
IntSystemEnable (SYS_INT_SPI1INT);

McSPIChannelEnable (MCSPISLV_MCSPI_regs、MCSPI_CH_ZERO);

McSPIReceiveData (MCSPISLV_MCSPI_Regs、MCSPI_CH_ZERO);
}

int McSPI1PinMuxSetup()
{
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_SPI1_SCLK)= CONTRAL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL | CONTRAL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE | PINMODE3;
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_SPI1_D0)= CONTRAL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL | CONTRAL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_RXACTIVE | PINMODE3;
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_SPI1_D1)= CONTRAL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL | CONTRAL_CONF_SPI0_SCLK_RXACTIVE | PINMODE3;
HWREG (SOC_CONTRAL_REGS + CONTRAL_CONF_SPI1_CS0)= CONTRAL_CONF_SPI0_SCLK_CONF_SPI0_SCLK_PUTYPESEL | CONTRAL_CONF_SPI0_SCLK_CONF_SCLK_RXACTIVE | PINMODE3;


空 McClkConfig}

HWREG (SOC_CM_PER_REGS + CM_PER_L3S_CLKSTCTRL)=
CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L3S_CLKSTCTRL)&
CM_PER_L3S_CLKSTCTRL_CLKTRCTRL)!= CM_PER_L3S_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)=
CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)&
CM_PER_L3_CLKSTCTRL_CLKTRCTRL)!= CM_PER_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

HWREG (SOC_CM_PER_REGS + CM_PER_L3_INSTR_CLKCTRL)=
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE;

while ((HWREG (SOC_CM_PER_Regs + CM_PER_L3_INSTR_CLKCTRL)&
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE)!=
CM_PER_L3_INSTR_CLKCTRL_MODULEMODE_ENABLE);

HWREG (SOC_CM_PER_Regs + CM_PER_L3_CLKCTRL)=
CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKCTRL)&
CM_PER_L3_CLKCTRL_MODULEMODE)!= CM_PER_L3_CLKCTRL_MODULEMODE_ENABLE);

HWREG (SOC_CM_PER_REGS + CM_PER_OCPWP_L3_CLKSTCTRL)=
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

while ((HWREG (SOC_CM_PER_regs + CM_PER_OCPWP_L3_CLKSTCTRL)和
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL)!=
CM_PER_OCPWP_L3_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKSTCTRL)=
CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)&
CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL)!=
CM_PER_L4LS_CLKSTCTRL_CLKTRCTRL_SW_WKUP);

HWREG (SOC_CM_PER_REGS + CM_PER_L4LS_CLKCTRL)=
CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE;

while ((HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKCTRL)&
CM_PER_L4LS_CLKCTRL_MODULEMODE)!= CM_PER_L4LS_CLKCTRL_MODULEMODE_ENABLE);

HWREG (SOC_CM_PER_REGS + CM_PER_SPI1_CLKCTRL)&&=~CM_PER_SPI1_CLKCTRL_MODULEMODE;

HWREG (SOC_CM_PER_REGS + CM_PER_SPI1_CLKCTRL)|=
CM_PER_SPI1_CLKCTRL_MODULEMODE_ENABLE;

while ((HWREG (SOC_CM_PER_regs + CM_PER_SPI1_CLKCTRL)&
CM_PER_SPI1_CLKCTRL_MODULEMODE)!= CM_PER_SPI1_CLKCTRL_MODULEMODE_ENABLE);


while (!(HWREG (SOC_CM_PER_regs + CM_PER_L3S_CLKSTCTRL)&
CM_PER_L3S_CLKSTCTRL_CLKACTIVITY_L3S_GCLK);

while (!(HWREG (SOC_CM_PER_regs + CM_PER_L3_CLKSTCTRL)&
CM_PER_L3_CLKSTCTRL_CLKACTIVITY_L3_GCLK);

while (!(HWREG (SOC_CM_PER_Regs + CM_PER_OCPWP_L3_CLKSTCTRL)&
(CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L3_GCLK |
CM_PER_OCPWP_L3_CLKSTCTRL_CLKACTIVITY_OCPWP_L4_GCLK)));

while (!(HWREG (SOC_CM_PER_regs + CM_PER_L4LS_CLKSTCTRL)&
(cm_per_L4LS_CLKSTCTRL_CLKACTIVITY_L4LS_GCLK |
CM_PER_L4LS_CLKSTCTRL_CLKACTIVITY_SPI_GCLK));

}

生成的寄存


器:McSPI1 McSPI1寄存器 MCSPI_REVISION 0x40300A0B McSPI 系统配置寄存器(MCSPI_REVISION)可控制模块接口的各种参数。 它对软件复位不敏感。 [存储器映射]
MCSPI_SysConfig0x00000308McSPI 系统配置寄存器(MCSPI_SysConfig)允许控制模块接口的各种参数。 它对软件复位不敏感。 [存储器映射]
MCSPI_SYSSTATUS0x00000001McSPI 系统状态寄存器(MCSPI_SYSSTATUS)提供有关模块的状态信息、但不包括中断状态信息。 [存储器映射]
MCSPI_IRQSTATUS0x00010001McSPI 中断状态寄存器(MCSPI_IRQSTATUS)重新组合可生成中断的模块内部事件的所有状态。 [存储器映射]
MCSPI_IRQENABLE0x00000004此 McSPI 中断使能寄存器(MCSPI_IRQENABLE)根据事件启用/禁用模块内部中断源。 [存储器映射]
MCSPI_SYST0x00000000当模块配置为系统测试(SYSTEST)模式时、该 McSPI 系统寄存器(MCSPI_SYST)用于在内部配置系统互连到外设总线或在外部配置到器件 I/O 引脚。 [存储器映射]
MCSPI_MODULCTRL0x00000004此 McSPI 模块控制寄存器(MCSPI_MODULCTRL)用于配置串行端口接口。 [存储器映射]
MCSPI_CH0CONF0x100713C4McSPI 通道0配置寄存器(MCSPI_CH0CONF)用于配置通道0。 [存储器映射]
MCSPI_CH0STAT0x00000022McSPI 通道0状态寄存器(MCSPI_CH0STAT)提供有关 McSPI 通道0 FIFO 发送缓冲寄存器(MCSPI_TX0)和通道0的 McSPI 通道0 FIFO 接收缓冲寄存器(MCSPI_RX0)的状态信息。 [存储器映射]
MCSPI_CH0CTRL0x00000001存储器映射
MCSPI_TX00x00000000存储器映射
MCSPI_RX00x00000000McSPI 通道0 FIFO 接收缓冲寄存器(MCSPI_RX0)包含通过串行链路接收的单个 McSPI 字。 小端字节序主机访问0上的 SPI 8位字;大端字节序主机访问3h。 [存储器映射]
MCSPI_CH1CONF0x00060000McSPI 通道1配置寄存器(MCSPI_CH1CONF)用于配置通道1。 [存储器映射]
MCSPI_CH1STAT0x00000000McSPI 通道1状态寄存器(MCSPI_CH1STAT)提供有关 McSPI 通道1 FIFO 发送缓冲寄存器(MCSPI_TX1)和通道1的 McSPI 通道1 FIFO 接收缓冲寄存器(MCSPI_RX1)的状态信息。 [存储器映射]
MCSPI_CH1CTRL0x00000000存储器映射
MCSPI_TX10x00000000存储器映射
MCSPI_RX10x00000000McSPI 通道1 FIFO 接收缓冲寄存器(MCSPI_RX1)包含通过串行链路接收的单个 McSPI 字。 小端字节序主机访问0上的 SPI 8位字;大端字节序主机访问3h。 [存储器映射]
MCSPI_CH2CONF0x00060000McSPI 通道2配置寄存器(MCSPI_CH2CONF)用于配置通道2。 [存储器映射]
MCSPI_CH2STAT0x00000000McSPI 通道2状态寄存器(MCSPI_CH2STAT)提供有关 McSPI 通道2 FIFO 发送缓冲寄存器(MCSPI_TX2)和通道2的 McSPI 通道2 FIFO 接收缓冲寄存器(MCSPI_RX2)的状态信息。 [存储器映射]
MCSPI_CH2CTRL0x00000000存储器映射
MCSPI_TX20x00000000存储器映射
MCSPI_RX20x00000000McSPI 通道2 FIFO 接收缓冲寄存器(MCSPI_RX2)包含通过串行链路接收的单个 McSPI 字。 小端字节序主机访问0上的 SPI 8位字;大端字节序主机访问3h。 [存储器映射]
MCSPI_CH3CONF0x00060000McSPI 通道3配置寄存器(MCSPI_CH3CONF)用于配置通道3。 [存储器映射]
MCSPI_CH3STAT0x00000000McSPI 通道3状态寄存器(MCSPI_CH3STAT)提供有关 McSPI 通道3 FIFO 发送缓冲寄存器(MCSPI_TX3)和通道3的 McSPI 通道3 FIFO 接收缓冲寄存器(MCSPI_RX3)的状态信息。 [存储器映射]
MCSPI_CH3CTRL0x00000000存储器映射
MCSPI_TX30x00000000存储器映射
MCSPI_RX30x00000000McSPI 通道3 FIFO 接收缓冲寄存器(MCSPI_RX3)包含通过串行链路接收的单个 McSPI 字。 小端字节序主机访问0上的 SPI 8位字;大端字节序主机访问3h。 [存储器映射]
MCSPI_XFERLEVEL0x00000000McSPI 传输电平寄存器(MCSPI_XFERLEVEL)提供传输期间使用 FIFO 缓冲区所需的传输电平。 [存储器映射]
MCSPI_DAFTX0x00000000McSPI DMA 地址对齐 FIFO 发送器寄存器(MCSPI_DAFTX)包含使用 FIFO 时在串行链路上传输的 SPI 字、DMA 地址在256位上对齐。 该寄存器是对应于启用 FIFO 的通道的 MCSPI_TX (I)寄存器之一的图像。 SPI 字以 MSB 优先的方式传输。 有关支持的访问列表、请参阅访问数据寄存器一章。 [存储器映射]
MCSPI_DAFRX0x00000000McSPI DMA 地址对齐 FIFO 接收器寄存器(MCSPI_DAFRX)包含使用 FIFO 且 DMA 地址在256位对齐时要在串行链路上接收的 SPI 字。 该寄存器是 MCSPI_RX (I)寄存器中与启用 FIFO 的通道相对应的一个图像。 [存储器映射]

CPSR0x6000019F存储中断使能状态和关键处理器状态信号[内核]
N0存储指令结果的位31。 换句话说、如果
运算结果为零、则存储数字 Z 1的符号被设置为1、否则保持为0
C1存储进位位的值、如果它发生在加法或减法中的借位位。 在移位中存储移出的最后一位。
如果发生溢出
、V 0设为1 Q0表示在增强型 DSP 指令
IT_1_000IT 状态位中发生了溢出还是饱和。
J0Java 状态位。
保留0000保留。
GE0000大于或等于 IT_7_2
000000IT 状态位
E0如果置位、数据存储器会被解释为大端字节序。 如果被清零、则数据存储器被解释为小端字节序。
1如果该位置位、则任何异步中止都将保持挂起状态、直到该位清零。
I1如果置位、则 IRQ 被禁用。 如果 IRQ 被清零、
则 F0如果被置位、FIQ 被禁用。 如果允许清除 FIQ
T0如果置位的 ARM 处于 Thumb 模式
M11111ARM

CM_PER_SPI1_CLKCTRL0x00000002的模式、则该寄存器管理 SPI1时钟。 [存储器映射]
保留1000000000000000000保留
IDLEST00 -功能模块空闲状态。
保留0000000000保留
MODULEMODE10 -启用控制强制时钟的管理方式。

CM_PER_L4LS_CLKSTCTRL0x1A006102该寄存器启用域电源状态转换。 它控制开关监控时钟域状态在 ON-PER 和 ON-INPER 状态之间的转换。 它还在域的每个时钟输入中保持一个状态位。 [存储器映射]
保留5000保留
CLKACTIVITY_TIMER6_GCLK1 -执行此字段指示域中 TIMER6 CLKTIMER 时钟的状态。
CLKACTIVITY_TIMER5_GCLK1 -执行此字段指示域中 TIMER5 CLKTIMER 时钟的状态。
被保留60被保留。
CLKACTIVITY_SPI_GCLK1 -执行此字段指示域中 SPI_GCLK 时钟的状态。
CLKACTIVITY_I2C_FCLK0 - Inact该字段指示域中 I2C _FCLK 时钟的状态。
被保留40被保留
70被保留。
CLKACTIVITY_GPIO_3_GDBCLK0 - Inact该字段指示域中 GPIO3_GDBCLK 时钟的状态。
CLKACTIVITY_GPIO_2_GDBCLK0 - Inact此字段指示域中 GPIO2_GDBCLK 时钟的状态。
CLKACTIVITY_GPIO_1_GDBCLK0 - Inact此字段指示域中 GPIO1_GDBCLK 时钟的状态。
被保留80被保留。
CLKACTIVITY_LCDC_GCLK0 - Inact该字段指示域中 LCD 时钟的状态。
CLKACTIVITY_TIMER4_GCLK0 - Inact该字段指示域中 TIMER4 CLKTIMER 时钟的状态。
CLKACTIVITY_TIMER3_GCLK0 - Inact该域指示域中 TIMER3 CLKTIMER 时钟的状态。
CLKACTIVITY_TIMER2_GCLK1 -执行此字段指示域中 TIMER2 CLKTIMER 时钟的状态。
CLKACTIVITY_TIMER7_GCLK1 -执行此字段指示域中 TIMER7 CLKTIMER 时钟的状态。
保留30保留
CLKACTIVITY_CAN_CLK0 - Inact此字段指示域中 CAN_CLK 时钟的状态。
CLKACTIVITY_UART_GFCLK0 - Inact该字段指示域中 UART_GFCLK 时钟的状态。
被保留20被保留
CLKACTIVITY_L4LS_GCLK1 -执行此字段指示域中 L4LS_GCLK 时钟的状态。
保留000000保留
CLKTRCTRL10 - SW_WKUP控制每个电源域中 L4慢速时钟域的时钟状态转换。

CM_PER_L3S_CLKSTCTRL0x0000000A该寄存器启用域电源状态转换。 它控制开关监控时钟域状态在开启-激活状态和开启-非激活状态之间的转换。 它还在域的每个时钟输入中保持一个状态位。 [存储器映射]
保留1000000保留





保留2 000000000000保留保留4 0保留保留5 0保留3 0保留000保留6保留
CLKACTIVITY_L3S_GCLK1 -有效此字段指示域中 L3S_GCLK 时钟的状态。
被保留70被保留
CLKTRCTRL10 - SW_WKUP控制 L3慢时钟域的时钟状态转换。

CONF_McASP0_aclkx0x00000033有关默认引脚多路复用器配置的信息、请参阅器件数据表。 请注意、器件 ROM 可能会根据 SYSBOOT 模式设置更改某些引脚的默认引脚多路复用器。 [存储器映射]
conf_McASP0_FSX0x00000033有关默认引脚复用配置的信息、请参阅器件数据表。 请注意、器件 ROM 可能会根据 SYSBOOT 模式设置更改某些引脚的默认引脚多路复用器。 [存储器映射]
conf_McASP0_axr00x00000033有关默认引脚复用配置的信息、请参阅器件数据表。 请注意、器件 ROM 可能会根据 SYSBOOT 模式设置更改某些引脚的默认引脚多路复用器。 [存储器映射]
conf_McASP0_ahclkr0x00000033有关默认引脚复用配置的信息、请参阅器件数据表。 请注意、器件 ROM 可能会根据 SYSBOOT 模式设置更改某些引脚的默认引脚多路复用器。 [存储器映射]
conf_McASP0_aclkr0x00000027有关默认引脚复用配置的信息、请参阅器件数据表。 请注意、器件 ROM 可能会根据 SYSBOOT 模式设置更改某些引脚的默认引脚多路复用器。 [存储器映射]
conf_McASP0_fsr0x00000027有关默认引脚复用配置的信息、请参阅器件数据表。 请注意、器件 ROM 可能会根据 SYSBOOT 模式设置更改某些引脚的默认引脚多路复用器。 [存储器映射]
conf_McASP0_axr10x00000027有关默认引脚复用配置的信息、请参阅器件数据表。 请注意、器件 ROM 可能会根据 SYSBOOT 模式设置更改某些引脚的默认引脚多路复用器。 [存储器映射]
conf_McASP0_ahclkx0x00000027有关默认引脚复用配置的信息、请参阅器件数据表。 请注意、器件 ROM 可能会根据 SYSBOOT 模式设置更改某些引脚的默认引脚多路复用器。 [已映射的存储器]

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是什么软件?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    软件版本:pdk_am335x_1_0_9

    我正在使用 CSL SPI 接收、但没有 FIFO 工作、但当我尝试使用带有 FIFO 的 DMA 时、接收缓冲区会填充0xFFFF。 有什么想法吗?

    源代码提取:

    /*包含所有必要的头文件*/
    #include "stdint.h"
    #include "mcspi.h"
    #include "hw_mcspi.h"
    #include "edma_event.h"
    #include "soc_am335x.h"
    #include "interrupt.h"
    
    #include "hw_event.h"
    
    #include "#include "include"
    
    
    //*
    内部宏定义 */
    ********* //#define
    MCSPI_TX_EVENT (EDMA3_CHA_MCSPI0_CH0_TX)
    //#define MCSPI_RX_EVENT (EDMA3_CHA_MCSPI0_CH0_RX)
    #define MCSPI_TX_EVENT (EDMA3_CHA_MCSPI1_CH0_TX)
    #define MCSPI_RX_EVENT (EDMA3_CHA_MCSPI1_CH0_RX)
    //#define MCSPI_TX0_REG (0x48130138u)
    #define MCSPI_TX0_REG (0x481A0138u)
    //#define MCSPI_RX0_REG (0x4803013Cu)
    #define MCSPI_RX0_REG (0x481A013Cu)
    #define MCSPI_IN_CLK (48000000u)
    #define MCSPI_OUT_FREQ (24000000u)
    #define MCSPI_CH_NUM (0U)
    #define EVT_QUEQUE_NUM (0U)
    #define dummy_ch_NUM (5U)
    #define MCSPISLV_MCSPI_regs SoC_SPI_1_regs
    #define MCSPI_CH_ZERO (0U)
    
    #define FIFORX 16
    #define DATALENGTH 32
    
    
    
    
    #define MCSPI_SIDLEMODE_NO (((uint32_t) MCSPI_SysConfig_sIDLEMODE_NO \
    <<MCSPI_SysConfig_sIDLEMODE_SHIFT)
    /********* //*
    本地函数原型 */
    ********* /
    静态空 McSpiTxEdmaParamSet (unsigned int tccNum、unsigned int chNum、
    volatile unsigned char * buffer、
    unsigned short buffLength);
    static void McSpiRxEdmaParamSet (unsigned int tccNum、unsigned int chNum、
    volatile unsigned char * buffer、
    无符号短 buffLength、
    unsigned int destBidxFlag);
    静态空回调(unsigned int tccNum、unsigned int status);
    静态空 McSPITransfer (unsigned short length);
    静态空 TxDummyPaRAMRequestEnable (void);
    静态空 Edma3HandlerIsError (void);
    静态空 Edma3ComplHandlerIsr (Confid);
    静态空
    静态空 EDMA3AINTCConfigure (void);
    静态空 EDMA3Initialize (void);
    静态空 McSPISetUp (void);
    
    静态空 testSPIEdma (void);
    
    / //*
    全局变量 */
    ********* /
    静态空(* CB_Fxn[EDMA3_NUM_TCC])(无符号 int TCC、无符号 int 状态);
    
    uint16_t rxBuffer[100]__attribute__(对齐(256)));
    
    易失性无符号 char vrfyData[256];
    易失性 signed char **Tx=0;
    易失性
    无符号 char x = 0;无符号 myeUSCr = 0;* uint8 = 0
    
    ;无符号静态 //*
    本地函数定义 */
    ********* //*
    
    
    **主函数。
    */
    int main (void)
    {
    testSPIEdma();
    while (1)
    {
    
    }
    }
    
    静态 void testSPIEdma()
    {
    /*启用 McSPI1模块的时钟。*/
    McSPI1ModuleClkConfig();
    /*对 SPI1实例执行引脚复用。*/
    McSPI1PinMuxSetup();
    /*初始化 EDMA3实例。*/
    EDMA3初始化();
    对于 SPI1、//请求针对 Tx 和 Rx 通道的 EDMA3CC。 *
    RequestEDMA3通道();
    /*设置 McSPI 实例。*/
    McSPISetUp();
    CB_Fxn[MCSPI_RX_EVENT]=回调(&B);
    /*为 EDMA 接收配置写入启用参数。*/
    McSpiRxEdmaParamSet (MCSPI_RX_EVENT、MCSPI_RX_EVENT、rxBuffer、DATALENGTH、TRUE);
    McSPITransfer (DATALENGTH);
    }/*
    
    
    **此函数用于配置 EDMA3通道控制器0
    的电源**和传输控制器0,在 AINTC 中记录 EDMA 中断。
    */
    静态空 EDMA3初始化(空)
    {
    /*为 EDMA 启用模块时钟*/
    EDMAModuleClkConfig();
    
    /* EDMA3初始化*/
    EDMA3Init (SOC_EDMA30CC_0_regs、EVT_QUEQUE_NUM);
    
    /*配置 AINTC 以接收 EDMA3中断*/
    EDMA3AINTCConfigure();
    }/*
    
    
    **此函数将在传输前使芯片选择线路有效,将
    **为 McSPI 外设的 Tx/Rx 启用 EDMA 事件,并
    在通信完成后使**芯片选择无效。
    */
    静态空 McSPITransfer (无符号短长度)
    {
    /*使用要传输的数据长度设置字节数字段。*/
    McSPIWordCountSet (SOC_SPI_1_regs、长度);
    
    /*为 McSPI 启用 Tx/Rx DMA 事件。 *
    McSPIDMAEnable (SOC_SPI_1_regs、(MCSPI_DMA_RX_EVENT)、
    MCSPI_CH_NUM);
    
    /*启用 McSPI 通道进行通信。*/
    McSPIChannelEnable (SOC_SPI_1_regs、MCSPI_CH_NUM);
    
    /*等待从 ISR 返回控制权。*/
    while ((0 = flagTx)||(flagRx = 0))
    ;
    
    flagTx = 0;
    flagRx = 0;
    
    /*禁用 McSPI 通道进行通信。*/
    McSPIChannelDisable (SOC_SPI_1_regs、MCSPI_CH_NUM);
    }/*
    
    
    ** EDMA3完成中断服务例程(ISR)。
    */
    static void Edma3ComplHandlerIsr (void)
    {
    unsigned int pendingIrqs;
    unsigned int isIPR = 0;
    unsigned int indexl;
    unsigned int cnt = 0;
    
    分度值= 1;
    
    isIPR = EDMA3GetIntrStatus (SOC_EDMA30CC_0_regs);
    
    IF (isIPR)
    {
    while (((cnt < EDMA3CC_compl_handler_retry_count)&&(indexl!= 0))
    {
    分度值= 0;
    
    pendingIrqs = EDMA3GetIntrStatus (SOC_EDMA30CC_0_regs);
    
    while (pendingIrq)
    {
    如果((pendingIrqs & 1)=true)
    {
    /**
    *如果用户没有提供任何回调函数
    请求 TCC 时、其 TCC 特定位
    不会清除 IPR 寄存器中的*。
    *
    //此处写入 ICR 以清除相应的 IPR 位。 *
    EDMA3ClrIntr (SOC_EDMA30CC_0_regs、索引);
    
    (* CB_Fxn[indexl])(索引、EDMA3_Xfer_COMPLETE);
    }
    
    ++indexl;
    
    pendingIrqs >=1;
    }
    CNT++;
    }
    }
    
    {
    
    /* EDMA3错误处理程序*/
    静态空 Edma3ErrorHandlerIsr (空)
    {
    /*清除挂起的错误中断*/
    EDMA3ClrMissEvt (SOC_EDMA30CC_0_reg、MCSPI_TX_EVENT);
    
    /*禁用 McSPI 发送事件*/
    McSPIDMADisable (SOC_SPI_1_regs、MCSPI_DMA_TX_EVENT、MCSPI_CH_NUM);
    
    /*禁用 EDMA 传输*/
    EDMA3 DisableTransfer (SOC_EDMA30CC_0_regs、MCSPI_TX_EVENT、
    EDMA3_TRIG_MODE_EVENT);
    
    flagTx = 1;
    
    /*清除挂起的错误中断*/
    EDMA3ClrMissEvt (SOC_EDMA30CC_0_reg、MCSPI_RX_EVENT);
    
    /*禁用 McSPI 接收事件*/
    McSPIDMADisable (SOC_SPI_1_regs、MCSPI_DMA_RX_EVENT、MCSPI_CH_NUM);
    
    /*禁用 EDMA 传输*/
    EDMA3 DisableTransfer (SOC_EDMA30CC_0_regs、MCSPI_RX_EVENT、
    EDMA3_TRIG_MODE_EVENT);
    
    flagRx = 1;
    
    }/*
    
    
    **回叫功能。 这里我们禁用 McSPI
    **外设的 Tx/Rx DMA 事件。
    */
    静态空回调(unsigned int tccNum、unsigned int status)
    {
    
    if (tccNum == MCSPI_RX_EVENT)
    {
    flagRx = 1;
    
    /*禁用 McSPI 接收事件*/
    McSPIDMADisable (SOC_SPI_1_regs、MCSPI_DMA_RX_EVENT、MCSPI_CH_NUM);
    }
    }
    
    /*
    **此函数用于设置 EDMA3的 PARAM 条目,以用于
    McSPI0实例的通道0的接收**事件。 相应的 EDMA3通道
    **也可用于接收。
    静态
    空 McSpiRxEdmaParamSet (unsigned int tccNum、unsigned int chNum、
    volatile unsigned char * buffer、
    无符号短 buffLength、
    unsigned int destBidxFlag)
    {
    EDMA3CCPaRAMEntry 参数集;
    
    unsigned char *p =(unsigned char *)&ParamSet;
    unsigned int index = 0;
    
    /*清理结构变量的内容。 *
    对于(index = 0;index < sizeof (ParamSet);index++)
    {
    P[索引]= 0;
    }
    
    /*用接收特定信息填写参数集。*/
    
    /* srcAddr 保存 SPI Rx FIFO 的地址。*/
    ParamSet.srcAddr =(unsigned int)(MCSPI_RX0_REG);
    
    /* destAddr 是名为 buffer 的内存位置的地址。*/
    paramSet.destAddr =(unsigned int)缓冲区;
    
    /* aCnt 保存数组中的字节数。*/
    ParamSet.aCnt = 2;
    
    /* bcnt 保存要传输的此类数组的数量。*/
    ParamSet.bCnt = FIFORX >> 1;
    
    /* ccnt 保存要传输的 aCnt*bcnt 字节的帧数。*/
    ParamSet.ccnt = DATALENGTH / ParamSet.bcnt;
    
    /*不应递增 srcBidx、因为它是一个 h/w 寄存器。*/
    ParamSet.srcBIdx = 0;
    
    if (true == destBidxFlag)
    {
    /*每个字节的 destBidx 应该递增。*/
    paramSet.destBIdx = ParamSet.aCnt;
    }
    其他
    {
    /*不应递增 destBidx。*/
    paramSet.destBIdx = 0;
    }
    
    /*同步传输模式。 *
    /*使用异步模式后,srCIdx 和 destCIdx 均设为零。*/
    ParamSet.srcCIdx = 0;
    /*TODO:rxtrig 或0*/
    paramSet.destCIdx = FIFORX;
    
    /*不使用 EDMA3中的链接传输。*/
    ParamSet.linkAddr = 0xFFFF;
    
    ParamSet.bCntReload = ParamSet.bCnt;
    
    ParamSet.opt &= 0xFFFFFFFCU;
    ParamSet.opt &= 0xFFFFFFU;
    ParamSet.op= 0x4U;
    ParamSet.opt &=(~EDMA3CC_opt_TCC);
    /*使用 tccNum.*/在选项中设置 TCC 字段
    ParamSet.opt |=((tccNum << EDMA3CC_OPT_TCC_SHIFT)和 EDMA3CC_OPT_TCC);
    
    
    /* EDMA3中断被启用并且中间中断被禁用。*/
    ParamSet.opt |=(1 << EDMA3CC_opt_TCINTEN 位移);
    
    /*现在将参数集写入 EDMA3。*/
    EDMA3SetPaRAM (SOC_EDMA30CC_0_regs、chNum、&ParamSet);
    
    /*启用 EDMA3传输。*/
    EDMA3 EnableTransfer (SOC_EDMA30CC_0_regs、chNum、EDMA3_TRIG_MODE_EVENT);
    }/*
    
    
    **此函
    数为 McSPI0分配 EDMA3通道以进行传输和**接收。
    */
    静态 void RequestEDMA3通道(void)
    {
    //
    EDMA3RequestChannel (SOC_EDMA30CC_0_regs、EDMA3_CHANNEL_TYPE_DMA)\
    //请求 SPI 发送的 DMA 通道和 TCC MCSPI_TX_EVENT、MCSPI_TX_EVT_QUECE_NUM);
    /*请求 DMA 通道和 TCC 以进行 SPI 接收*/
    EDMA3RequestChannel (SOC_EDMA30CC_0_regs、EDMA3_CHANNEL_TYPE_DMA、
    MCSPI_RX_EVENT、
    MCSPI_RX_EVENT_EVT_QUEQUE_NUM);
    }
    
    /*
    **此函数将调用必要的 McSPI API,这些 API 将配置
    ** McSPI 控制器。
    */
    static void McSPISetUp (void)
    {
    /*重置 McSPI 实例。*/
    McSPIReset (SOC_SPI_1_regs);
    
    MCSPISysConfigSetup (SOC_SPI_1_regs、MCSPI_Clocks_OCP_ON_FUNC_ON、
    MCSPI_SIDLEMODE_NO、
    MCSPI_WAKEUP_DISABLE、
    MCSPI_AUTOIDLE_OFF);
    /*启用芯片选择引脚。*/
    McSPICSEnable (SOC_SPI_1_regs);
    
    /*启用主操作模式。*/
    /*从机模式启用*/
    //McSPIMasterModeEnable (SOC_SPI_1_regs);
    McSPISlaveModeEnable (SOC_SPI_1_regs);
    /*对主控模式执行必要的配置。*/
    
    MCSPIPinDirSet (SOC_SPI_1_regs、MCSPI_RX_ONLY _MODE、
    MCSPI_DATA_LINE_COMM_MODE_7、0);
    
    MCSPIMultiChModeEnable (SOC_SPI_1_regs);
    /*配置 McSPI 输出频率。 *
    McSPIClkConfig (SOC_SPI_1_regs、MCSPI_IN_CLK、MCSPI_OUT_FREQ、
    MCSPI_CH_NUM、
    MCSPI_CLK_MODE_0);
    
    /*配置字长。*/
    McSPIWordLengthSet (SOC_SPI_1_regs、MCSPI_WORD_LENGTH (16)、MCSPI_CH_NUM);
    
    /*将 SPIEN 的极性设置为低。*/
    McSPICSPPolarityConfig (SOC_SPI_1_regs、MCSPI_CS_POL_LOW、MCSPI_CH_NUM);
    
    /*启用 McSPI 的 Tx FIFO。*/
    McSPITxFIFOConfig (SOC_SPI_1_regs、MCSPI_TX_FIFO_DISABLE、MCSPI_CH_NUM);
    
    /*启用 McSPI 的 Rx FIFO。*/
    McSPIRxFIFOConfig (SOC_SPI_1_regs、MCSPI_RX_FIFO_ENABLE、MCSPI_CH_NUM);
    
    McSPIFIFOTrigLvlSet (SOC_SPI_1_regs、FIFORX、0、MCSPI_RX_ONLY _MODE);
    }/*
    
    
    **此函数将 AINTC 配置为接收 EDMA3中断。
    */
    static void EDMA3AINTCConfigure (void)
    {
    /*在 CPSR 中启用 IRQ。*/
    IntMasterIRQEnable();
    /*初始化 ARM 中断控制器。 *
    IntAINTCInit();
    
    /*注册 EDMA3通道控制器0传输完成中断。 *
    IntRegister (SYS_INT_EDMACOMPINT、Edma3ComplHandlerIsr);
    
    /*在 AINTC 中设置 EDMA3CC0完成中断的优先级。 *
    IntPrioritySet (SYS_INT_EDMACOMPINT、0、AINTC_HOSTINT_route _IRQ);
    
    /*在 AINTC 中启用 EDMA3CC0完成中断。 *
    IntSystemEnable (SYS_INT_EDMACOMPINT);
    
    /*注册 EDMA3通道控制器0错误中断。 *
    IntRegister (SYS_INT_EDMAERRINT、Edma3ErrorHandlerIsr);
    
    /*在 AINTC 中设置 EDMA3CC0错误中断的优先级。 *
    IntPrioritySet (SYS_INT_EDMAERRINT、0、AINTC_HOSTINT_route _IRQ);
    
    /*在 AINTC 中启用 EDMA3CC0错误中断。 *
    IntSystemEnable (SYS_INT_EDMAERRINT);
    }/*
    
    
    **这将配置虚拟传输的参数集。
    */
    static void TxDummyPaRAMConfEnable (void)
    {
    EDMA3CCPaRAMEntry DummyPaRAMSet;
    
    EDMA3GetPaRAM (SOC_EDMA30CC_0_regs、dummy_ch_NUM、&dummyPaRAMSet);
    
    dummyPaRAMSet.aCnt = 1;
    dummyPaRAMSet.bCnt = 0;
    dummyPaRAMSet.ccnt = 0;
    dummyPaRAMSet.srcAddr = 0;
    dummyPaRAMSet.destAddr = 0;
    dummyPaRAMSet.srcBIdx = 0;
    dummyPaRAMSet.destBIdx = 0;
    dummyPaRAMSet.srcCIdx = 0;
    dummyPaRAMSet.destCIdx = 0;
    dummyPaRAMSet.linkAddr = 0xFFFFu;
    dummyPaRAMSet.bCntReload = 0;
    dummyPaRAMSet.opt = 0;
    
    EDMA3SetPaRAM (SOC_EDMA30CC_0_regs、dummy_ch_NUM、&dummyPaRAMSet);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    DMA 问题已修复。 已拔下 MOSI 电缆... 。 一切都按预期工作。