说明:芯片采用的是 BF592 ,这段代码我主要实现通过SPORT1口-DMA4口往FLASH写数据,写完成后进入中断关闭SPORT和DMA,通过 SPORT_Write()函数随便定义写时钟和写的数据长度,可是问题当我定义length小于16时,通过示波器发现SPORT口的TCLK只震荡6个脉冲就没有了,当length大于等于16时可以出来数据,但出来的数据只有6个字节,应该是16个字节的数据啊,哪出问题了?
//main主函数==============================================
void SPORT_Write(unsigned char clk,unsigned char length);
main()
{
set_PLL(16,4);//-----400M----100M
sport_init();
CoreTimer_init();
while(1)
{
if(system_da>50)//-------500MS延时
{
system_da=0;
SPORT_Write(10,3);
dprintf("*pDMA4_CONFIG=[%x],*pSPORT1_TCR1=[%x],*pDMA4_X_COUNT=[%d]--%d\r\n",*pDMA4_CONFIG,*pSPORT1_TCR1,*pDMA4_X_COUNT,uart_temp);
}
}
}
//SPORT1口发送函数========================================
void SPORT_Write(unsigned char clk,unsigned char length)
{
*pSIC_IMASK &= ~(1<<12);
*pSPORT1_TCLKDIV = clk;
*pSPORT1_TFSDIV = 7;// SPORT TFS EVERY 8 SPORT CLK CYCLES
*pSPORT1_TCR2 = SLEN(7); // TX WORD LENGTH 8 BIT
*pSPORT1_TCR1 = TCKFE|LATFS|LTFS|ITFS|ITCLK|TLSBIT|DITFS;//|TFSR;
*pSPORT1_STAT = 0x76; // clear errors
*pSPORT1_TCR1 |= TSPEN;
ssync();
//*pDMA4_CONFIG = DI_EN;
*pDMA4_START_ADDR = writeflash;
*pDMA4_X_COUNT = length;
*pDMA4_IRQ_STATUS |= DMA_DONE;
*pDMA4_CONFIG = DI_EN;
*pDMA4_CONFIG |= DMAEN;
//*pSIC_IMASK |= (1<<12); // DMA4 interrupt
ssync();
*pSIC_IMASK |= (1<<12); // DMA4 interrupt
}
//SPORT1口初始化=========================================
void sport_init(void)
{
*pPORTF_FER |= (PF1|PF2|PF3|PF5|PF6|PF7);
*pPORTF_MUX &= ~(PF1|PF2|PF3|PF5|PF6|PF7);
register_handler(ik_ivg9, SportTransceiver_ISR);
ssync();
}
//发送SPORT1-DMA4中断函数=================================
EX_INTERRUPT_HANDLER(SportTransceiver_ISR)
{
if(*pDMA4_IRQ_STATUS & DMA_DONE)
{
*pDMA4_IRQ_STATUS|= DMA_DONE;
*pDMA4_CONFIG &= ~DMAEN;
*pSPORT1_TCR1 &= ~TSPEN;
//*pUART0_THR = 0X77;
}
}