请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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 模式设置更改某些引脚的默认引脚多路复用器。 [已映射的存储器]