主题中讨论的其他器件: HALCOGEN、 TMS570LC4357
您好!
我正在处理 RM48L952 HDK。 我使用 MibSPI1作为主器件来发送数据、使用 MibSPI5作为从器件来接收数据。 我已经使用 Halcogen 中给出的 DMA 示例尝试了 mibspi、并根据我的要求对其进行了修改。 我将提供以下代码:
*示例数据模式配置*/
#define D_SIZE 127
void loadDataPattern (uint32 psize、uint16* pptr);
//void mibspiEnableInternalLoopback (mibspi_t * mibspi);
void dmaConfigCtrlTxPacket (uint32 Sadd、uint32 dadd、uint32 dsize);
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize);
void mibspiddmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel);
uint16 TX_DATA[D_SIZE];//系统 RAM 中的发送缓冲器*/
uint16 RX_DATA[D_SIZE]={0};//系统 RAM 中的接收缓冲区
G_dmaCTRL g_dmaCTRLPKT_Tx;/* DMA 控制数据包配置堆栈*/
G_dmaCTRL g_dmaCTRLPKPT_Rx;
/*用户代码结束*/
/*用户代码开始(2)*/
/*用户代码结束*/
void main (void)
{
/*用户代码开始(3)*/
/*-在系统 RAM 中创建数据块,以...开始 *
loadDataPattern (D_size、&TX_DATA[0]);
/*-初始化 mibspi -启用 TG 0,长度127 (halcogen 文件)*/
mibspiInit();
/*-分配 DMA 请求:带有请求线的通道0 - 1 */
dmaReqAssign (0,1);
dmaReqAssign (1.6);
/*-配置 DMA 控制数据包*/
dmaConfigCtrlTxPacket ((uint32)(&TX_DATA)、(uint32)(&(mibspiRAM1->TX[0].data))、D_size);
dmaConfigCtrlRxPacket ((uint32)(&(mibspiRAM3->Rx[0].data))、(uint32)(&RX_DATA)、D_size);
支持多达32个控制数据包。 *
/*-设置 DMA 控制数据包*/
dmaSetCtrlPacket (DMA_CH0、g_dmaCTRLPKT_Tx);
dmaSetCtrlPacket (dma_ch1、g_dmaCTRLPKT_Rx);
/*-将 DMA 通道设置为在硬件请求时触发*/
dmaSetChEnable (DMA_CH0、DMA_HW);
dmaSetChEnable (DMA_CH1、DMA_HW);
/*-配置 mibspi DMA、通道0、TX 线路-0、rxline -1 */
/*-请参阅器件数据表 mibspi TX/Rx 的 DMA 请求源*/
mibspiDmaConfig (mibspiREG1、0、0、1);
/*-启用 DMA 模块*/
dmaEnable();
/*-启动 mibspi 传输 TG 0 */
mibspiTransfer (mibspiREG1,0);
/*... 等待传输完成*/
while (!(mibspiIsTransferComplete (mibspiREG1、0)))
{
};
/*从 mibspi ram 复制到 sys ram */
mibspiGetData (mibspiREG5、0、RX_DATA);
while (1);/*循环永远*/
/*用户代码结束*/
}
/*用户代码开始(4)*/
void mibspiDmaConfig (mibspi_t * mibspi、uint32通道、uint32 txchannel、uint32 rxchannel)
{
uint32 bufid = 0;
uint32 icount = 0;
/*设置发送和接收通道*/
mibspi->DMACTRL[通道]|=(((rxchannel<<4)|txchannel)<< 16);
/*启用发送和接收 DMA */
mibspi->DMACTRL[通道]|= 0x8000C000;
/*设置 DMA 传输的初始计数和用于 DMA 传输的缓冲区*/
mibspi->DMACTRL[通道]|=(计数<<8)|(计数<<24);
}
void dmaConfigCtrlTxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)
{
G_dmaCTRLPKT_Tx.Sadd =添加;/*源地址*
G_dmaCTRLPKT_Tx.DADD = dadd;/*目标地址*
G_dmaCTRLPKT_Tx.CHCTTRL = 0;/*通道控制*
G_dmaCTRLPKT_Tx.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT_Tx.ELCNT = dsize;/*元素计数*
G_dmaCTRLPKPT_Tx.ELDOFFSET = 4;/*元素目标偏移量*
G_dmaCTRLPKPT_Tx.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKPT_Tx.FRDOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKPT_Tx.FRSOFFSET = 0;/*帧目标偏移量*
G_dmaCTRLPKT_Tx.PORTASGN = 4;/*端口 b *
G_dmaCTRPKT_Tx.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_Tx.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_Tx.tType = FRAME_TRANSFSION;/*传输类型*/
G_dmaCTRPKT_Tx.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKPT_Tx.ADDMODEWR = ADDR_OFFSET;/*地址模式写入*
G_dmaCTRPKT_Tx.AUTOINIT = AUTOINIT_ON;/*自动初始化*
}
void dmaConfigCtrlRxPacket (uint32 Sadd、uint32 dadd、uint32 dsize)
{
G_dmaCTRLPKT_Rx.Sadd =添加;/*源地址*
G_dmaCTRLPKT_Rx.DADD = dadd;/*目标地址*
G_dmaCTRLPKT_Rx.CHCTRL = 0;/*通道控制*
G_dmaCTRLPKT_Rx.FRCNT = 1;/*帧计数*/
G_dmaCTRLPKT_Rx.ELCNT = dsize;/*元素计数*
G_dmaCTRLPKPT_Rx.ELDOFFSET = 4;/*元素目标偏移量*
G_dmaCTRLPKPT_Rx.ELSOFFSET = 0;/*元素目标偏移量*
G_dmaCTRLPKPT_Rx.FRDOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKPT_Rx.FRSOFFSET = 0;/*帧目标偏移*
G_dmaCTRLPKT_Rx.PORTASGN = 4;/*端口 b *
G_dmaCTRPKT_Rx.RDSIZE = ACCESS_16_BIT;/*读取大小*
G_dmaCTRLPKT_Rx.WRSIZE = ACCESS_16_BIT;/*写入大小*
G_dmaCTRLPKT_Rx.tType = FRAME_TRANSFSION;/*传输类型*/
G_dmaCTRPKT_Rx.ADDMODERD = ADDR_INC1;/*地址模式读取*
G_dmaCTRLPKPT_Rx.ADDMODEWR = ADDR_OFFSET;/*地址模式写入*
G_dmaCTRPKT_Rx.AUTOINIT = AUTOINIT_ON;/*自动初始化*
}
void loadDataPattern (uint32 psize、uint16* pptr)
{
int i;
for (i=0;<psize;i++))
{
pptr[i]= i;
}
}
/*用户代码结束*/
我无法在 mibspi5末尾接收数据 代码有什么问题? 我不确定用于 mibspi5的通道和请求线路是否正确。 我已连接了 mibspi1和 mibsi5 (SOMI 至 SOMI、SIMO 至 SIMO、CLK 至 CLK 以及 CS_1至 CS_1)。 在 Halcogen 中、我已将 CS_1用于 tg0。
谢谢
