e1 st_bus 接到Mcbsp 由dma 存到buffer ,现在是每字 16位 每帧16字。可搬到 buffer 时 好像没跟 帧同步(fsr,fsx)同步。每次dma操作 在buffer 位置对不上。
下面是我的代码,请帮我看看 哪里不对。
void Mcu_Reg_Init()
{
*CLKMD = 0;
while((*CLKMD)&(1<<CLKMD_PLLSTATUS));
*CLKMD = 0x40c7; //pllX5 bit15~bit12
*SWWSR = 0x4249; //wait stat i/o=4; data=1;program=1
*SWCR = 0x01;
*PMST = (1<<PMST_IPTR) | (1<<PMST_OVLY);
*BSCR = (1<<BSCR_BH) | (1<<BSCR_PSDS);
*IMR = 0;
*TCR = 0x10;
*PRD = 0xC34F;//0x186a;
*TCR = 0xc21;//0xC2f;
*IFR = 0xffff;
*IMR = 0xC000 | (1<<IMR_TINT0) | (1<<IMR_DMAC1);
// *IMR = 0xC000 | (1<<IMR_TINT0) | (1<<IMR_BRINT0) | (1<<IMR_BXINT0) | (1<<IMR_DMAC0) | (1<<IMR_DMAC1);
// *ST0 = 0;
// *ST1 = 0x800;
Disable();
}
void Mcbsp_Rst()
{
*SPSA0 = SPCR1;
*SPSD0 = 0; //接收复位
*SPSA0 = SPCR2;
*SPSD0 = 0xc0; //发送复位
*SPSA1 = SPCR1;
*SPSD1 = 0; //接收复位
*SPSA1 = SPCR2;
*SPSD1 = 0xc0; //发送复位
}
void Mcbsp_Sync()
{
*SPSA0 = SPCR1;
*SPSD0 = 0; //引脚设置成串口模式
*SPSA0 = SPCR2;
*SPSD0 = 0; //启动发送,发送失步产生中断
*SPSA0 = PCR;
*SPSD0 = 0x3000; // 启动接收,接收失步产生中断
*SPSA0 = PCR;
while(((*SPSD0) & (1<<PCR_FSXP))==0);
while((*SPSD0) & (1<<PCR_FSXP)); //检测下降沿
}
void Mcbsp_Init()
{
*SPSA0 = XCR1;
//*SPSD = 0x1F00; //发送帧结构:1帧32字,1字8位
*SPSD0 = 0xF40; //发送帧结构:1帧16字,1字16位
*SPSA0 = XCR2;
*SPSD0 = 1; //发送单相,延迟1Bit,每帧发送由帧同步启动
*SPSA0 = RCR1;
//*SPSD = 0x1F00; // 接收帧结构:1帧32字,1字8位
*SPSD0 = 0xF40; //发送帧结构:1帧16字,1字16位
*SPSA0 = RCR2;
*SPSD0 = 1; //接收单相,不压扩,延迟1Bit,每帧接收由帧同步启动
*SPSA1 = XCR1;
//McBSP1->SPSD = 0x1F00; //发送帧结构:1帧32字,1字8位
*SPSD1 = 0xF40; //发送帧结构:1帧16字,1字16位
*SPSA1 = XCR2;
*SPSD1 = 5; //发送单相,延迟1Bit,
*SPSA1 = RCR1;
//*SPSD = 0x1F00; // 接收帧结构:1帧32字,1字8位
*SPSD1 = 0xF40; //发送帧结构:1帧16字,1字16位
*SPSA1 = RCR2;
*SPSD1 = 5; //接收单相,不压扩,延迟1Bit,
}
void Mcbsp_Start()
{
*SPSA0 = PCR;
*SPSD0 = 0; //引脚设置成串口模式
*SPSA0 = SPCR2;
*SPSD0 = 0x31; //启动发送,发送失步产生中断
*SPSA0 = SPCR1;
*SPSD0 = 0x31; // 启动接收,接收失步产生中断
*SPSA1 = PCR;
*SPSD1 = 0; //引脚设置成串口模式
*SPSA1 = SPCR2;
*SPSD1 = 0x1; //启动发送,
*SPSA1 = SPCR1;
*SPSD1 = 0x1; // 启动接收,
}
void Dma_Init()
{
*DMPREC = 0x80; // 所有通道禁用
//-----通道1初始化,用于串口0的发送------------------
*DMSA = DMSRC1;
*DMSDN =(XB_U16)Tx_Mcbsp0_Buf0; //源地址为Tx_Mcbsp0_Buf0
*DMSA = DMDST1;
*DMSDN =(XB_U16)( DXR10); //目的地址为DXR10
*DMSA = DMCTR1;
*DMSDN = 16-1; //每帧元素个数为16个
*DMSA = DMSFC1;
*DMSDN = 0x2000+MCBSP0_DMA_TX_FRAME_NUM-1; //McBSP0 transmit event,单字传输方式,帧数为256
*DMSA = DMMCR1; //DMA自动初始关,块发送完产生中断,复帧方式,目的地址不变,位于数据存储器
*DMSDN = 0x4541; //源地址指针根据DMIDX0 and DMFRI0改变,处于数据存储器
*DMSA = DMIDX0;
*DMSDN = MCBSP0_DMA_TX_FRAME_NUM; //set element address index to +MCBSP0_DMA_TX_FRAME_NUM
*DMSA = DMFRI0;
*DMSDN = 0x10000-(MCBSP0_DMA_TX_FRAME_NUM*15-1); //set frame address index to -(MCBSP0_DMA_TX_FRAME_NUM*15-1)
//---------通道0初始化,用于串口0的接收--------------
*DMSA = DMSRC0;
*DMSDN =(XB_U16) (DRR10); //源地址为DRR10
*DMSA = DMDST0;
*DMSDN =(XB_U16) Rx_Mcbsp0_Buf0; //目的地址为Rx_Mcbsp0_Buf0
*DMSA = DMCTR0;
*DMSDN = 16-1; //每帧元素个数为16个
*DMSA = DMSFC0;
*DMSDN = 0x1000+MCBSP0_DMA_RX_FRAME_NUM-1; //McBSP0 transmit event,单字传输方式,帧数为256
*DMSA = DMMCR0; //不自动初始化,1模块传输完产生中断,工作于多帧模式
*DMSDN = 0x4059; //源地址不变,目的地址根据DMIDX1和DMFRI1变化
*DMSA = DMIDX1;
*DMSDN = MCBSP0_DMA_RX_FRAME_NUM; //set element address index to +MCBSP0_DMA_TX_FRAME_NUM
*DMSA = DMFRI1;
*DMSDN = 0x10000-(MCBSP0_DMA_RX_FRAME_NUM*15-1); //set frame address index to -(MCBSP0_DMA_TX_FRAME_NUM*15-1)
//-----通道3初始化,用于串口1的发送------------------
*DMSA = DMSRC3;
*DMSDN = (XB_U16)Tx_Mcbsp1_Buf0; //源地址为Tx_Mcbsp1_Buf0
*DMSA = DMDST3;
*DMSDN = (XB_U16)(DXR11); //目的地址为DXR10
*DMSA = DMCTR3;
*DMSDN = 16-1; //每帧元素个数为16个
*DMSA = DMSFC3;
*DMSDN = 0x6000+MCBSP1_DMA_TX_FRAME_NUM-1; //McBSP0 transmit event,单字传输方式,帧数为256
*DMSA = DMMCR3; //DMA自动初始关,块发送完产生中断,复帧方式,目的地址不变,位于数据存储器
*DMSDN = 0x541; //源地址指针根据DMIDX0 and DMFRI0改变,处于数据存储器
//DMA->DMSA = DMIDX0;
//DMA->DMSDN = MCBSP0_DMA_TX_FRAME_NUM; //set element address index to +MCBSP0_DMA_TX_FRAME_NUM
//DMA->DMSA = DMFRI0;
//DMA->DMSDN = 0x10000-(MCBSP0_DMA_TX_FRAME_NUM*15-1); //set frame address index to -(MCBSP0_DMA_TX_FRAME_NUM*15-1)
//---------通道2初始化,用于串口1的接收--------------
*DMSA = DMSRC2;
*DMSDN = (XB_U16)(DRR11); //源地址为DRR10
*DMSA = DMDST2;
// *DMSDN = (XB_U16)Rx_Mcbsp1_Buf0; //目的地址为Rx_Mcbsp0_Buf0
*DMSA = DMCTR2;
*DMSDN = 16-1; //每帧元素个数为16个
*DMSA = DMSFC2;
*DMSDN = 0x5000+MCBSP1_DMA_RX_FRAME_NUM-1; //McBSP0 transmit event,单字传输方式,帧数为256
*DMSA = DMMCR2; //不自动初始化,1模块传输完产生中断,工作于多帧模式
*DMSDN = 0x59; //源地址不变,目的地址根据DMIDX1和DMFRI1变化
//DMA->DMSA = DMIDX1;
//DMA->DMSDN = MCBSP0_DMA_RX_FRAME_NUM; //set element address index to +MCBSP0_DMA_TX_FRAME_NUM
//DMA->DMSA = DMFRI1;
//DMA->DMSDN = 0x10000-(MCBSP0_DMA_RX_FRAME_NUM*15-1); //set frame address index to -(MCBSP0_DMA_TX_FRAME_NUM*15-1)
//--------------------------------------------------
*DMPREC = 0xF8F; // 通道0,1,2,3使能,并高优先,中断复用
}
void Peripheral_Init(void)
{
Mcbsp_Rst();
Dma_Init();
Mcbsp_Sync();
Mcbsp_Init();
Mcbsp_Start();
Enable();
Firm_Parm_Init();
}
void Firm_Parm_Init(void)
{
Tx_Flag=0;
Rx_Flag=0;
TxInt_Flag=0;
RxInt_Flag=0;
}
void main()
{
XB_U16 i,nret;
/*准备数据*/
Mcu_Reg_Init();
Peripheral_Init();
memset(Tx_Mcbsp0_Buf0, 0, 4096);
memset(Tx_Mcbsp0_Buf1, 0, 4096);
while(1)
{
// NANDFLASH_Block_Erase(0);
// nret = NANDFLASH_Page_WriteData(0x10,0, szbuf,2000); /*写第0页*/
// nret = NANDFLASH_Page_WriteData(1,1, szbuf,2000);
// nret=NANDFLASH_ReadStatus(0x70);
// NANDFLASH_ReadIDOperation(ChipId);
nop();
// nret=FPGA_NAND_RB_;
// memset(szbuf, 0, 2112);
// nret = NANDFLASH_Page_ReadData(0,0x1, szbuf,2112);
// FPGA_NAND_CLE = 1;
// FPGA_NAND_CE_ = 1;
// FPGA_NAND_ALE = 1;
if(TxInt_Flag)
{
// Mute_tx(0);
TxInt_Flag=0;
}
if(MsFlag)
{
MsFlag=0;
ms++;
Led_Deal();
}
nop();
nop();
}
}
interrupt void timer0()
{
MsFlag=1;
}
interrupt void DMACH1_ISR()
{
TxInt_Flag=1;
if(Tx_Flag)
{
Tx_Flag=0;
*DMSA = DMSRC1;
*DMSDN =(XB_U16)Tx_Mcbsp0_Buf0;
*DMSA = DMSRC3;
*DMSDN = (XB_U16)Tx_Mcbsp1_Buf0; //源地址为Tx_Mcbsp1_Buf0
}
else
{
Tx_Flag=1;
*DMSA = DMSRC1;
*DMSDN =(XB_U16)Tx_Mcbsp0_Buf1;
*DMSA = DMSRC3;
*DMSDN = (XB_U16)Tx_Mcbsp1_Buf1; //源地址为Tx_Mcbsp1_Buf0
}
*DMSA = DMDST1;
*DMSDN =(XB_U16)( DXR10); //目的地址为DXR10
*DMSA = DMCTR1;
*DMSDN = 16-1; //每帧元素个数为16个
*DMSA = DMSFC1;
*DMSDN = 0x2000+MCBSP0_DMA_TX_FRAME_NUM-1;
*DMSA = DMDST3;
*DMSDN = (XB_U16)(DXR11); //目的地址为DXR10
*DMSA = DMCTR3;
*DMSDN = 16-1; //每帧元素个数为16个
*DMSA = DMSFC3;
*DMSDN = 0x6000+MCBSP1_DMA_TX_FRAME_NUM-1; //McBSP0 transmit event,单字传输方式,帧数为256
*DMPREC |= 0x0a;
}