主题中讨论的其他器件:HALCOGEN
您好!
我已经创建了新项目并按照 halcogen "mibspidma.c"中提到的步骤操作、但它不起作用、
我观察到在 TXDATA 上加载数据成功、但在 while (1)运行1秒以上后、RXDATA 缓冲区中没有数据、
如果我错过了 halcogen 的任何设置、请告诉我!
谢谢、
Vikas N.
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.
大家好、Vikas、
MibSPI 示例使用了中断模式:传输完成。
1. 在 MIBSPIx VIM 通道选项卡中启用 MIBSPIx 中断。 每个 MibSPI 有两个 VIM 通道:MibSPIx 高电平或 MibSPIx 低电平
2.您需要启用中断:
mibspiEnableGroupNotification (mibSPIx、TGX、Level);
其中电平可以是0 (低电平优先级)或1 (高电平优先级)
MibSPIx 高通道被启用、请为电平使用1
3.在代码中启用 IRQ 中断
您好 、QJ Wang、
我已经添加了您提到的步骤、请在此处找到代码、
/*用户代码开始(0)*/
*用户代码结束*/
*包含文件*/
#include "hL_sys_common.h"
/*用户代码开始(1)*/
#include "hL_mibspi.h"
#include "hL_sys_dma.h"
#include "hL_sys_core.h"
//*示例数据模式配置
#d_size 128
void loadDataPattern (uint32 psize、uint16* pptr);
void mibspiEnableInternalLoopback (mibspi_t * mibspi);
void dmaConfigCtrlPacket (uint32 sadd、uint32 dadd、uint32 dsize);
txmibdmaConfig (* mibspi32
);tidrintranuint32 uintmuintmuint32 uintmuintmuat_size (uint32);
/* sys ram 中的传输缓冲区*/
uint16 RXDATA[D_SIZE]={0};/* sys ram 中的接收缓冲区*/
#pragma SET_DATA_SECTION ()
布尔值 bIsMibspiDataReceived_g=0;
g_dmaCTRL g_dmaCTRLPKT1、g_dmaCTRLPPKT2; /* DMA 控制数据包配置堆栈*/*
用户代码结束*/**
@fn void main (void)
*@简短应用程序主函数
*@注意此函数默认为空。
*
*此函数在启动后调用。
*用户可以使用此函数来实现应用程序。
*/
/*用户代码开始(2)*/
/*用户代码结束*/
int main (void)
{//
*用户代码开始(3)*/
_enable_IRQ_interrupt_();
/*-在系统 RAM 中创建数据块,以...开始 //
loadDataPattern (D_size、&TXDATA[0]);
//-正在初始化 mibspi -启用 TG 0、长度127 (halcogen 文件)*/
mibspiInit();
mibspiEnableGroupNotification (mibspiREG1,0u、
FTC);//启用 mibspi1接口的组通知*/ dspiEnableDMA、enableInterrupt 1、dta_tma (dchta_tma) DMA_INTA);
/*-启用环回(这是在没有外部导线的情况下模拟数据传输*/
mibspiEnableInternalLoopback (mibspiREG1);
/*-配置 DMA 控制数据包*/
g_dmaCTRLPPKT1.Sadd =(uint32) TXDATA;//源地址 */
g_dmaCTRLPKT1.DADD =(uint32)&(mibspiRAM1->TX[0].data);//目标地址 */
g_dmaCTRLPKT1.CHCTTRL = 0; /*通道控制 */
g_dmaCTRLPKT1.FRCNT = 1; /*帧计数 */
g_dmaCTRLPKT1.ELCNT = D_SIZE; /*元素计数 */
g_dmaCTRLPKT1.ELDOFFSET = 4; /*元素目标偏移*/
g_dmaCTRLPKT1.ELSOFFSET = 0; /*元素目标偏移*/
g_dmaCTRLPKT1.FRDOFFSET = 0; /*帧目的偏移*/
g_dmaCTRLPKT1.FRSOFFSET = 0; /*帧目标偏移*/
g_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTB_WRITE;
g_dmaCTRLPKT1.RDSIZE = ACCESS_16_BIT; /*读取大小 */
g_dmaCTRLPKT1.WRSIZE = ACCESS_16_BIT; /*写入大小 */
g_dmaCTRLPKT1.tType = frame_transfer;/*传输类型 */
g_dmaCTRLPKT1.ADDMODERD = ADDR_INC1; 读取/*地址模式 */
g_dmaCTRPKT1.ADDMODEWR = ADDR_OFFSET; /*地址模式写入 //
g_dmaCTRLPKT1.AUTOINIT = AUTOINIT_ON; /*自动初始化 */
g_dmaCTRLPPKT2.Sadd =(uint32)&(mibspiRAM1->rx[0].data);//源地址 */
g_dmaCTRLPPKT2.DADD =(uint32) RXDATA;/*目的地址 */
g_dmaCTRLPPKT2.CHCTRL = 0; /*通道控制 */
g_dmaCTRLPPKT2.FRCNT = 1; /*帧计数 */
g_dmaCTRLPPKT2.ELCNT = D_SIZE; /*元素计数 */
g_dmaCTRLPPKT2.ELDOFFSET = 0; /*元素目标偏移*/
g_dmaCTRLPPKT2.ELSOFFSET = 4; /*元素目标偏移*/
g_dmaCTRLPPKT2.FRDOFFSET = 0; /*帧目的偏移*/
g_dmaCTRLPPKT2.FRSOFFSET = 0; /*帧目标偏移*/
g_dmaCTRLPPKT2.PORTASGN = PORTB_READ_PORTA_WRITE;
g_dmaCTRLPPKT2.RDSIZE = ACCESS_16_BIT; /*读取大小 */
g_dmaCTRLPPKT2.WRSIZE = ACCESS_16_BIT; /*写入大小 */
g_dmaCTRLPPKT2.tType = frame_transfer;/*传输类型 */
g_dmaCTRLPKT2.ADDMODERD = ADDR_OFFSET; 读取/*地址模式 */
g_dmaCTRLPPKT2.ADDMODEWR = ADDR_INC1; /*地址模式写入 //
g_dmaCTRLPPKT2.AUTOINIT = AUTOINIT_ON; /*自动初始化 支持多达
32个控制数据包。 //
//-设置 DMA 控制包*/
dmaSetCtrlPacket (Dma_CH0,g_dmaCTRLPPKT2);
dmaSetCtrlPacket (Dma_CH1,g_dmaCTRLPPKT1);
//设置 DMA 通道以在 H/w 请求时触发*/
dmaChChPacket (HW_CH0,g_dmaCTRLPPKT1);//配置 dmaSet0
,dmaTmaTma_dmaTdma_tma 通道以启用,dma1,dmaTmaTma_dmaTma_tma1,dma-tma 通道 //
*-请参阅器件数据表 mibspi TX/Rx 的 DMA 请求源*/
mibspidDmaConfig (mibspiREG1、0、1);
dmaEnable();
unsigned int loop;
for (loop=0;loop<5000;loop++);
//启动 mibspi 传输 TG 0*/ mibspiREG0
;mib+;mibspiRoop0;mib+;mibspiRoop0;mib+(mibspiDspiRoop+)
while (1);/* loop forever */
/*用户代码 end */
返回0;
}
//用户代码开始(4)*/
void mibspiEnableInternalLoopback (mibspibase_t * mibspi)
{
/*启用内部回送*/
mibspi->GCR1 |= 1U << 16U;
}
// MIBSPI 中断通知*/
void mibspiGroupNotification (mibspibase_t * mibspi、uint32 group)
{
if (mibspi == mibspiREG1)
{
bIsMibspiDataReceived = true;
}
}
void mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel)
{
uint32 bufid = D_size - 1;
uint32 icount = 0;
/*设置发送和接收通道*/
mibspi->DMACTRL[通道]|=(((rxchannel<<4)|txchannel)<< 16);
/*启用发送和接收 DMA */
mibspi->DMACTRL[通道]|= 0x8000C000;
/*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/
mibspi->DMACTRL[通道]|=(icount << 8)|(bufid<24);
}
void loadDataPattern (uint32 psize、uint16* pptr)
{
int i;
for (i=0;i
Halcogen Seeting:
Mibspi1设置符合"example_mibspiDma.c"中的 Haclogen 帮助示例
请告诉我或建议/提供回送模式中的任何代码示例- SPIDMA
谢谢、
Vikas N
QJ Wang、您好!
我添加 了 mibspiEnableGroupNotification (mibspiREG1,0u、1U);并在 Halcogen 中启用 MIBSPIx 中断:高电平和低电平、
找到代码和 Halcogen 设置、请告诉我是否错过了任何内容、或者是否有任何示例可供尝试、
/*用户代码开始(0)*/ *用户代码结束*/ *包含文件*/ #include "hL_sys_common.h" /*用户代码开始(1)*/ #include "hL_mibspi.h" #include "hL_sys_dma.h" #include "hL_sys_core.h" //*示例数据模式配置 #d_size 128 void loadDataPattern (uint32 psize、uint16* pptr); void mibspiEnableInternalLoopback (mibspi_t * mibspi); void dmaConfigCtrlPacket (uint32 sadd、uint32 dadd、uint32 dsize); txmibdmaConfig (* mibspi32 );tidrintranuint32 uintmuintmuint32 uintmuintmuat_size (uint32); /* sys ram 中的传输缓冲区*/ uint16 RXDATA[D_SIZE]={0};/* sys ram 中的接收缓冲区*/ #pragma SET_DATA_SECTION () 布尔值 bIsMibspiDataReceived_g=0; g_dmaCTRL g_dmaCTRLPKT1、g_dmaCTRLPPKT2; /* DMA 控制数据包配置堆栈*/* 用户代码结束*/** @fn void main (void) *@简短应用程序主函数 *@注意此函数默认为空。 * *此函数在启动后调用。 *用户可以使用此函数来实现应用程序。 */ /*用户代码开始(2)*/ /*用户代码结束*/ int main (void) {// *用户代码开始(3)*/ _enable_IRQ_interrupt_(); /*-在系统 RAM 中创建数据块,以...开始 // loadDataPattern (D_size、&TXDATA[0]); //-正在初始化 mibspi -启用 TG 0、长度127 (halcogen 文件)*/ mibspiInit(); mibspiEnableGroupNotification (mibspiREG1,0u、 FTC);//启用 mibspi1接口的组通知*/ dspiEnableDMA、enableInterrupt 1、dta_tma (dchta_tma) DMA_INTA); /*-启用环回(这是在没有外部导线的情况下模拟数据传输*/ mibspiEnableInternalLoopback (mibspiREG1); /*-配置 DMA 控制数据包*/ g_dmaCTRLPPKT1.Sadd =(uint32) TXDATA;//源地址 */ g_dmaCTRLPKT1.DADD =(uint32)&(mibspiRAM1->TX[0].data);//目标地址 */ g_dmaCTRLPKT1.CHCTTRL = 0; /*通道控制 */ g_dmaCTRLPKT1.FRCNT = 1; /*帧计数 */ g_dmaCTRLPKT1.ELCNT = D_SIZE; /*元素计数 */ g_dmaCTRLPKT1.ELDOFFSET = 4; /*元素目标偏移*/ g_dmaCTRLPKT1.ELSOFFSET = 0; /*元素目标偏移*/ g_dmaCTRLPKT1.FRDOFFSET = 0; /*帧目的偏移*/ g_dmaCTRLPKT1.FRSOFFSET = 0; /*帧目标偏移*/ g_dmaCTRLPKT1.PORTASGN = PORTA_READ_PORTB_WRITE; g_dmaCTRLPKT1.RDSIZE = ACCESS_16_BIT; /*读取大小 */ g_dmaCTRLPKT1.WRSIZE = ACCESS_16_BIT; /*写入大小 */ g_dmaCTRLPKT1.tType = frame_transfer;/*传输类型 */ g_dmaCTRLPKT1.ADDMODERD = ADDR_INC1; 读取/*地址模式 */ g_dmaCTRPKT1.ADDMODEWR = ADDR_OFFSET; /*地址模式写入 // g_dmaCTRLPKT1.AUTOINIT = AUTOINIT_ON; /*自动初始化 */ g_dmaCTRLPPKT2.Sadd =(uint32)&(mibspiRAM1->rx[0].data);//源地址 */ g_dmaCTRLPPKT2.DADD =(uint32) RXDATA;/*目的地址 */ g_dmaCTRLPPKT2.CHCTRL = 0; /*通道控制 */ g_dmaCTRLPPKT2.FRCNT = 1; /*帧计数 */ g_dmaCTRLPPKT2.ELCNT = D_SIZE; /*元素计数 */ g_dmaCTRLPPKT2.ELDOFFSET = 0; /*元素目标偏移*/ g_dmaCTRLPPKT2.ELSOFFSET = 4; /*元素目标偏移*/ g_dmaCTRLPPKT2.FRDOFFSET = 0; /*帧目的偏移*/ g_dmaCTRLPPKT2.FRSOFFSET = 0; /*帧目标偏移*/ g_dmaCTRLPPKT2.PORTASGN = PORTB_READ_PORTA_WRITE; g_dmaCTRLPPKT2.RDSIZE = ACCESS_16_BIT; /*读取大小 */ g_dmaCTRLPPKT2.WRSIZE = ACCESS_16_BIT; /*写入大小 */ g_dmaCTRLPPKT2.tType = frame_transfer;/*传输类型 */ g_dmaCTRLPKT2.ADDMODERD = ADDR_OFFSET; 读取/*地址模式 */ g_dmaCTRLPPKT2.ADDMODEWR = ADDR_INC1; /*地址模式写入 // g_dmaCTRLPPKT2.AUTOINIT = AUTOINIT_ON; /*自动初始化 支持多达 32个控制数据包。 // //-设置 DMA 控制包*/ dmaSetCtrlPacket (Dma_CH0,g_dmaCTRLPPKT2); dmaSetCtrlPacket (Dma_CH1,g_dmaCTRLPPKT1); //设置 DMA 通道以在 H/w 请求时触发*/ dmaChChPacket (HW_CH0,g_dmaCTRLPPKT1);//配置 dmaSet0 ,dmaTmaTma_dmaTdma_tma 通道以启用,dma1,dmaTmaTma_dmaTma_tma1,dma-tma 通道 // *-请参阅器件数据表 mibspi TX/Rx 的 DMA 请求源*/ mibspidDmaConfig (mibspiREG1、0、1); dmaEnable(); unsigned int loop; for (loop=0;loop<5000;loop++); //启动 mibspi 传输 TG 0*/ mibspiREG0 ;mib+;mibspiRoop0;mib+;mibspiRoop0;mib+(mibspiDspiRoop+) while (1);/* loop forever */ /*用户代码 end */ 返回0; } //用户代码开始(4)*/ void mibspiEnableInternalLoopback (mibspibase_t * mibspi) { /*启用内部回送*/ mibspi->GCR1 |= 1U << 16U; } // MIBSPI 中断通知*/ void mibspiGroupNotification (mibspibase_t * mibspi、uint32 group) { if (mibspi == mibspiREG1) { bIsMibspiDataReceived = true; } } void mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel) { uint32 bufid = D_size - 1; uint32 icount = 0; /*设置发送和接收通道*/ mibspi->DMACTRL[通道]|=(((rxchannel<<4)|txchannel)<< 16); /*启用发送和接收 DMA */ mibspi->DMACTRL[通道]|= 0x8000C000; /*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/ mibspi->DMACTRL[通道]|=(icount << 8)|(bufid<24); } void loadDataPattern (uint32 psize、uint16* pptr) { int i; for (i=0;i
QJ Wang、您好!
我在 mibspiTransfer (mibspiREG1、0)之后的同一代码中添加了循环、如下所示:
mibspiTransfer (mibspiREG1,0);
while (!(mibspiIsTransferComplete (mibspiREG1、0)))
{
};
mibspiIsTransferComplete API 始终返回 false、
谢谢、
Vikas N.