主题中讨论的其他器件: RM46L852、 HALCOGEN
尊敬的香榭丽舍
我的客户在启用 DMA 的情况下成功在 RM46L852上实施了 SPI、但在 RM44L520上失败。
这两个器件之间是否有任何差异?
通过参阅以下内容、它们实现了 SPI4 + DMA、但仍然失败。
https://git.ti.com/cgit/hercules_examples/hercules_examples/tree/Application/TMS570_SPI_DMA
他们稍微修改了示例代码以使用 SPI4、而不是 SPI3、如下所示。
您能否检查一下、让我知道他们应该进一步检查什么?
~~~~~~~~~μ A
#define SPI4_TX_ADDR ((uint32_t)(&(spiREG4->DAT1))+ 2)
。
。
。
。
。
/*-正在初始化 mibspi*/
spiInit();
spiREF4->PC0 = 0
|(1<<11) //SOMI[0]作为功能引脚
|(1<<10) //SIMO[0]作为功能引脚
|(1 << 9) //CLK 作为功能引脚
|(0); /CS 作为 GIO 引脚
spiREG4->PC1 = 0x01; //CS[0]作为输出
spiREG4->PC3 = 0x00; //CS[0]= 0
/*-启用 DMA 模块*/
dmaEnable();
/*接收数据后启用中断*/
//dmaEnableInterrupt (DMA_CH0、FTC); //帧传输完成
dmaEnableInterrupt (DMA_CH0、BTC); //块传输完成
dmaEnableInterrupt (DMA_CH0、HBC); //半块传输完成
/*-分配 DMA 请求:带有请求线路的通道0 - 0/15 */
/*请求行0:SPI1接收*/
/*请求行1:SPI1发送*/
/*请求行14:SPI3接收*/
/*请求行15:SPI3发送*/
dmaReqAssign (DMA_CH0、0); //SPI1 RX
dmaReqAssign (DMA_CH1、25); //SPI3 TX
/*-配置 DMA TX 控制数据包 */
dmaConfigCtrlTxPacket ((unsigned int)&TX_DATA、SPI4_TX_ADDR、1、blocksize);
dmaSetCtrlPacket (DMA_CH1、g_dmaCTRLPKT_TX);
/*-配置 DMA RX 控制数据包 */
/* dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize) */
dmaConfigCtrlRxPacket (SPI1_RX_ADDR、(unsigned int)&RX_DATA、1、blocksize);
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT_RX);
/*-将 DMA 通道设置为在硬件请求时触发*/
dmaSetChEnable (DMA_CH0、DMA_HW); //SPI1 RX、硬件触发
dmaSetChEnable (DMA_CH1、DMA_HW); //SPI3 TX、硬件触发
//为了在 DMA 操作期间实现高效行为,可以禁用发送器空中断和接收缓冲区满中断
//当下列任一项为真时、生成第一个 TX_DMA_REQ 脉冲:
// 1. DMAREQEN (SPIINT0[16])被设定为1、而 SPIEN (SPIGCR1[24])已经为1。
// 2. SPIEN (SPIGCR1[24])被设定为1、而 DMAREQEN (SPIINT0[16])已经为1。
spiREG1->GCR1 =(spiREG1->GCR1 & 0xFFFFFFFFU)|(0x1 << 24); //启用 SPI
spiREG1->INT0 =(0x1 << 16);//SPI_DMAREQ;仅在将 SPIEN 位设置为1后启用 DMA 请求。
spiREG4->GCR1 =(spiREG4->GCR1 & 0xFFFFFFFFU)|(0x1 << 24); //启用 SPI
spiREF4->INT0 =(0x1 << 16);//SPI_DMAREQ;仅在将 SPIEN 位设置为1后启用 DMA 请求。
while (SPI4_BTCTFlag =0){ //DMA 块完成中断
}
~~~~~~~~~~μ A
谢谢、此致、
SI