您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]BF53x SPORT 範例代碼 執行後結果不正... 
本帖共有578个阅读者
发表帖子 发表投票 回复主题
[求助]BF53x SPORT 範例代碼 執行後結果不正確
chris_syu(论坛新手)
chris_syu
头衔:社区公民
帮派:无帮无派
帖数:35
金钱:411
积分:49
注册时间:2012/12/17
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]BF53x SPORT 範例代碼 執行後結果不正確
請問各位大大:

我試著執行 SPORT 範例代碼,並將 DT1PRI 和DR1PRI 两个接口短接,iRxBuffer 收到的資料卻不正確,請問是哪出錯

#include <cdefBF533.h>
#include <sys\exception.h>

#define FLOW_1 0x1000

unsigned char iTxBuffer[4000]; // unsigned char
unsigned char iRxBuffer[4000]; // unsigned char

EX_INTERRUPT_HANDLER(Sport1_RX_ISR);
EX_INTERRUPT_HANDLER(Sport1_TX_ISR);

void Init_SDRAM(void)
{
*pEBIU_SDRRC = 0x00000817;
*pEBIU_SDBCTL = 0x00000013;
*pEBIU_SDGCTL = 0x0091998d;
ssync();
}

void Init_EBIU(void)
{
*pEBIU_AMBCTL0 = 0x7bb07bb0;
*pEBIU_AMBCTL1 = 0xffc07bb0;
*pEBIU_AMGCTL = 0x000f;
}

void Set_PLL(int pmsel,int pssel)
{
int new_PLL_CTL;
*pPLL_DIV = pssel;
asm("ssync;");
new_PLL_CTL = (pmsel & 0x3f) << 9;
*pSIC_IWR |= 0xffffffff;
if (new_PLL_CTL != *pPLL_CTL)
{
*pPLL_CTL = new_PLL_CTL;
asm("ssync;");
asm("idle;");
}
}


void Init_Sport1_RX(int RCLKDIV,int RFSDIV)
{
*pSPORT1_RCLKDIV = RCLKDIV; //配置SPORT接收接口的時鐘頻率
*pSPORT1_RFSDIV = RFSDIV; //配置SPORT接收接口的同步頻率
*pSPORT1_RCR1 = IRCLK|RFSR; //配置SPORT接收工作模式
*pSPORT1_RCR2 = 31; //配置SPORT以32Bit數據接收
}

void Init_Sport1_TX(int TCLKDIV,int TFSDIV)
{
*pSPORT1_TCLKDIV = TCLKDIV; //配置SPORT傳輸接口的時鐘頻率
*pSPORT1_TFSDIV = TFSDIV; //配置SPORT傳輸接口的同步頻率
*pSPORT1_TCR1 = ITFS|TFSR|ITCLK; //配置SPORT傳輸工作模式
*pSPORT1_TCR2 = 31; //配置SPORT以32Bit數據傳輸
}

void Init_DMA(void)
{
*pDMA3_PERIPHERAL_MAP = 0x3000; //設置SPORT接收接口DMA
*pDMA3_CONFIG = WNR | WDSIZE_32 | DI_EN | FLOW_1; //設置DMA工作模式
*pDMA3_START_ADDR = (void *)iRxBuffer; //設置DMA 接收數據起始地址
*pDMA3_X_COUNT = 1000; //設置DMA接收次數
*pDMA3_X_MODIFY = 4; //設置DMA每次地址增量變化
*pDMA4_PERIPHERAL_MAP = 0x4000; //設置SPORT傳輸接口DMA
*pDMA4_CONFIG = WDSIZE_32 | DI_EN |FLOW_1; //設置DMA工作模式
*pDMA4_START_ADDR = (void *)iTxBuffer; //設置DMA 傳輸數據起始地址
*pDMA4_X_COUNT = 1000; //設置DMA傳輸次數
*pDMA4_X_MODIFY = 4; //設置DMA每次地址增量變化
}

void Enable_DMA_Sport1_RX(void)
{
*pDMA3_CONFIG = (*pDMA3_CONFIG | DMAEN); //使能接收DMA
*pSPORT1_RCR1 = (*pSPORT1_RCR1 | RSPEN); //使能接收SPORT
}

void Enable_DMA_Sport1_TX(void)
{
*pDMA4_CONFIG = (*pDMA4_CONFIG | DMAEN); //使能傳輸DMA
*pSPORT1_TCR1 = (*pSPORT1_TCR1 | TSPEN); //使能傳輸SPORT
}

void Init_Interrupts(void)
{
*pSIC_IAR0 = 0xffffffff;
*pSIC_IAR1 = 0xfff32fff; //配置SPORT DMA中斷等級
*pSIC_IAR2 = 0xffffffff;

register_handler(ik_ivg9, Sport1_RX_ISR); //註冊接收中斷
register_handler(ik_ivg10, Sport1_TX_ISR); //註冊傳輸中斷
*pSIC_IMASK = 0x00001800; //打開SPORT傳輸和接收中斷屏蔽
}


EX_INTERRUPT_HANDLER(Sport1_RX_ISR) //接收DMA中斷函數
{
*pDMA3_IRQ_STATUS = 0x0001; //清除中斷標誌位
printf("SPORT RX DMA Done!\n"); //打印信息
*pSIC_IMASK &= ~0x00000800; //屏蔽接收中斷

}

EX_INTERRUPT_HANDLER(Sport1_TX_ISR) //傳輸DMA中斷函數
{
*pDMA4_IRQ_STATUS = 0x0001; //清除中斷標誌位

printf("SPORT TX DMA Done!\n"); //打印信息
*pSIC_IMASK &= ~0x00001000; //屏蔽接收中斷
}

main()
{
int i;
Set_PLL(16,4);
Init_EBIU();
Init_SDRAM();
for(i=0;i<4000;i++) //產生測試數據
iTxBuffer[i]=i;
Init_Sport1_TX(7,9); //初始化Sport1傳輸接口
Init_Sport1_RX(7,9); //初始化Sport1接收接口
Init_Interrupts(); //初始化中斷
Init_DMA(); //初始化DMA
Enable_DMA_Sport1_TX(); //使能Sport1傳輸接口及DMA
Enable_DMA_Sport1_RX(); //使能Sport1接收接口及DMA
while(1);
}

上传的图片
  201362018273644.png [ 167.83 KB 1280×984 ] (缩略时请点击查看原图)

 


正在學習使用ADSP-53x
等级:论坛新手 参考IP地址:*.*.*.*
2013/6/20 18:29:25
chris_syu(论坛新手)
chris_syu
头衔:社区公民
帮派:无帮无派
帖数:35
金钱:411
积分:49
注册时间:2012/12/17
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
不好意思,看到範例資料夾內的 read me 後,將 TFS1 與 RFS1 兩支 pin 連接之後,iRxBuffer 收到的就資料正確了

正在學習使用ADSP-53x
等级:论坛新手 参考IP地址:*.*.*.*
2013/6/20 19:37:00
chris_syu(论坛新手)
chris_syu
头衔:社区公民
帮派:无帮无派
帖数:35
金钱:411
积分:49
注册时间:2012/12/17
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
再請問,我將

unsigned char iTxBuffer[4000];
unsigned char iRxBuffer[4000];

修改為

int iTxBuffer[4000];
int iRxBuffer[4000];

為何 iRxBuffer 資料收到 第 iRxBuffer[999] 後就都為 0 ,似乎沒完成接收??

正在學習使用ADSP-53x
等级:论坛新手 参考IP地址:*.*.*.*
2013/6/20 19:55:27
chris_syu(论坛新手)
chris_syu
头衔:社区公民
帮派:无帮无派
帖数:35
金钱:411
积分:49
注册时间:2012/12/17
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
另外再請問:

1. 為何 pin DT1PRI 沒有和 DR1PRI 短接,卻還會產生 SPORT_RX 中斷呢?

2. TSCLKx 和 RSCLKx 兩隻 pin 的功用是?



「该帖子被 chris_syu 在 2013-06-21 15:33:49 编辑过」

正在學習使用ADSP-53x
等级:论坛新手 参考IP地址:*.*.*.*
2013/6/21 9:06:21
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你的DMA采集次数只有1000次,所以只能采到999
你的SPORT 接收接口有同步和时钟信号,所以处理器会根据时钟采集数据,至于采的对不对,数据有没有连接,处理器不知道。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/6/22 1:22:04
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159167 Call, 1 Queries, Processed in 0.015625 second(s),