如题,我现在遇到一个问题,就是用BF518的sport口模拟spi时序的时候和有SPI接口的器件通信不上,不能正常的收发,用的是DMA中断来实现的,有人弄过的话,麻烦告诉我如何操作~!~~~~先谢谢了~!~~~~
下面是我自己程序的配置,功能就是有个脉冲触发信号来,启动通信,我把RFS0和TFS0连起来当CS,TSCLK0和RSCLK0连一起当SCK:
void Init_SPORT0_TX(short TCLKDIV,short TFSDIV)
{
*pSPORT0_TCR1 |= TFSR;
*pSPORT0_TCR2 |= 0x0207;
*pSPORT0_TCLKDIV |= TCLKDIV;
*pSPORT0_TFSDIV |= TFSDIV;
}
void Init_SPORT0_RX(short RCLKDIV,short RFSDIV)
{
*pSPORT0_RCR1 |= RFSR|IRCLK|IRFS;
*pSPORT0_RCR2 |= 0x0207;
*pSPORT0_RCLKDIV |= RCLKDIV;
*pSPORT0_RFSDIV |= RFSDIV;
}
void Init_DMA(void)
{
*pDMA3_PERIPHERAL_MAP = 0x3000;
*pDMA3_CONFIG = 0x1082;
*pDMA3_START_ADDR = (void *)SportRxBuf;
*pDMA3_X_COUNT = 1;
*pDMA3_X_MODIFY = 0;
*pDMA4_PERIPHERAL_MAP = 0x4000;
*pDMA4_CONFIG = 0x1080;
*pDMA4_START_ADDR = (void *)SportTxBuf;
*pDMA4_X_COUNT = 1;
*pDMA4_X_MODIFY = 0;
}
void main(void)
{
unsigned short int i;
Set_PLL(16,24);
Init_SDRAM();
Init_EBIU();
Init_SPORT0_IO();
Init_IO();
Init_SPORT0_TX(9,31);
Init_SPORT0_RX(9,31);
Init_DMA();
Init_Interrupts();
while(1)
{
if(flag==1)
{
flag = 0;
Enable_DMA_Sport0_RX();
Enable_DMA_Sport0_TX();
}
}
}
EX_INTERRUPT_HANDLER(INIT_ISR)
{
if(*pPORTFIO&PF1)
{
flag = 1;
*pPORTFIO &= ~PF1;
}
}
EX_INTERRUPT_HANDLER(SPORT0_RX_ISR)
{
if (*pDMA3_IRQ_STATUS & DMA_DONE)
*pDMA3_IRQ_STATUS |= DMA_DONE;
Disable_DMA_Sport0_RX();
}
EX_INTERRUPT_HANDLER(SPORT0_TX_ISR)
{
if (*pDMA4_IRQ_STATUS & DMA_DONE)
*pDMA4_IRQ_STATUS &= ~DMA_DONE;
Disable_DMA_Sport0_TX();
}
「该帖子被 snooby521 在 2013-04-10 17:48:28 编辑过」