您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> [求助]两个BF53x板 通过sport1口进行数据的... 
本帖共有555个阅读者
发表帖子 发表投票 回复主题
[求助]两个BF53x板 通过sport1口进行数据的传输
水下通信(论坛新手)
水下通信
头衔:社区公民
帮派:无帮无派
帖数:54
金钱:417
积分:49
注册时间:2015/12/3
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
[求助]两个BF53x板 通过sport1口进行数据的传输
板子是ADSP-EDU-BF53x 仿真器是AD-HP-510ICE 开发环境是VDSP(update10)程序就是买板子时提供的bf53x_sport程序
源程序是在一个板子上用sport1口的发送和接收来进行数据的传输和接收  现在我想让这个程序在两个板子上用sport1口完成数据的传输和接收 一个板子通过sport1口发送另一个板子通过sport1口接收  连线如图

上传的图片
  20161189334369.jpg [ 59.96 KB 624×475 ] (缩略时请点击查看原图)

 

左边是发送板 右边是接收板 发送板的DT1PRI(14引脚)与接收板的DR1PRI(11引脚)连接
                          发送板的TFS1(12引脚)与接收板的RFS1(9引脚)连接


关于程序的改动:发送部分就是把源程序的接收使能屏蔽掉了(如下图)
                接收部分就是把源程序的发送使能屏蔽掉了(如下图)
上传的图片
  20161189404969.png [ 14.62 KB 614×494 ] (缩略时请点击查看原图)

 


上传的图片
  20161189415869.jpg [ 51.61 KB 630×488 ] (缩略时请点击查看原图)

 


源程序运行在一个板子上iRxBuffer得到的数据和iTxBuffer是一样的  源程序如下
/********************************************************
*
*   北京四维卓信电子有限公司
*
*  【OpenADSP开源社区】
*
********************************************************/
#include <cdefBF533.h>
#include <sys\exception.h>

#define FLOW_1 0x1000

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

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);
}



分开后 在两个板子上调试得到的iRxBuffer的数据是乱码而不是跟iTxBuffer一样的数据???

这里还需说明的是  我只有一个仿真器  所以采取的办法是先将程序下载到发送板里去然后 接收板与电脑连接调试查看结果

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2016/11/8 10:08:43
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
SPORT传输你要接4根线:时钟,同步信号,数据,地。
你只接了两根线,不可能通讯成功。

另外把代码中:
*pSPORT1_RCR1 = IRCLK|RFSR; //配置SPORT接收工作模式
改为:
*pSPORT1_RCR1 = RFSR;

接收数据方不产生时钟。

你一块板子可以通讯成功,是因为硬件上接收和发送的时钟已经连接在了一起。连接时钟记得要把TCLK 接到接收端的RCLK上

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2016/11/8 22:35:02
水下通信(论坛新手)
水下通信
头衔:社区公民
帮派:无帮无派
帖数:54
金钱:417
积分:49
注册时间:2015/12/3
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
按照你说的加了TCLK和RCLK的连线  然后把接收部分程序也改了 结果没数据了呢  


上传的图片
  2016111015521181.png [ 461.96 KB 624×478 ] (缩略时请点击查看原图)

 


上传的图片
  2016111015521781.png [ 36.62 KB 1087×567 ] (缩略时请点击查看原图)

 


需要把地也接一起?

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2016/11/10 15:54:07
水下通信(论坛新手)
水下通信
头衔:社区公民
帮派:无帮无派
帖数:54
金钱:417
积分:49
注册时间:2015/12/3
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
如果加上IRCLK  会有乱码
上传的图片
  201611101614581.png [ 40.73 KB 1096×553 ] (缩略时请点击查看原图)

 


这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2016/11/10 16:01:54
水下通信(论坛新手)
水下通信
头衔:社区公民
帮派:无帮无派
帖数:54
金钱:417
积分:49
注册时间:2015/12/3
4信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
把地也连接上了 没数据呢  为什么呢

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2016/11/13 17:11:08
水下通信(论坛新手)
水下通信
头衔:社区公民
帮派:无帮无派
帖数:54
金钱:417
积分:49
注册时间:2015/12/3
5信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
去掉IRCLK后 单步执行程序发现程序不进Sport1_RX中断程序了(如下图画出部分)

上传的图片
  2016111317265652.jpg [ 183.52 KB 1340×729 ] (缩略时请点击查看原图)

 


单步执行完使能部分Enable_DMA_Sport1_RX()  再单步就会卡 不会像之前那样直接进中断程序EX_INTERRUPT_HANDLER(Sport1_RX_ISR)
整体运行的话下面的输出窗口也不会有“SPORT RX DMA Done!”输出  
所以显然删掉IRCLK以后 就没有进中断了  所以iRxBuffer也没有数据呢  

求解答!!

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2016/11/13 17:33:16
水下通信(论坛新手)
水下通信
头衔:社区公民
帮派:无帮无派
帖数:54
金钱:417
积分:49
注册时间:2015/12/3
6信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
版主你是不管我了么  好桑心/(ㄒoㄒ)/~~  

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2016/11/14 18:29:32
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
7信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你这样做:
先把接收代码中的发送部分全部屏蔽掉,再把发送代码中的接收部分完全屏蔽掉,防止干扰。
然后先运行发送端代码,用示波器测量看时钟,同步,数据有没有到接收板卡管脚上,小心测量,别短接,短接接口会击穿。你可以把发送代码烧写到板卡里。让其一直发送。
注意两个板卡地线一定要连接。

然后再挂上仿真器调试接收代码。
如果接收不到数据,你可以试着修改接收代码的SPORT寄存器*pSPORT1_RCR1的RCKFE位。

你最好先测试下你的芯片接口有没有击穿,若测试正常,可按我的说方法试试,你的硬件连线请确认没有接错。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2016/11/15 20:36:42
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.154461 Call, 1 Queries, Processed in 0.031250 second(s),