您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 新手,请求指点—关于应用层PPI接收数据问题... 
本帖共有410个阅读者
发表帖子 发表投票 回复主题
新手,请求指点—关于应用层PPI接收数据问题———————————
Summer(论坛新手)
Summer
头衔:社区公民
帮派:无帮无派
帖数:3
金钱:129
积分:5
注册时间:2014/4/25
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
新手,请求指点—关于应用层PPI接收数据问题———————————

//****************************************************************************** 目标板架构
: FPGA + DSP (BF561)



*       目      标 : BF561接收 1024 个数据,并将接收到的数据打印出来



*       数 据 源   : FPGA 产生1 MHz 分频时钟,并在该时钟下做计数,把计数结果(为



*                                  
16bits)作为输出,此外产生一个帧同步信号。



*                                            即从数据源得到              PPI_CLK,  PPI_FS1,
data[15:0]



*       DSP
            :   CCLK==125 MHZ    SCLK==50 MHZ



*       编译uClinux版本:
2011R1-RC3



//*****************************************************************************



摸索了很久一直没有实现这个功能,请求高手指点。





问题1:在2011R1-RC3版本中,对PPI_PORT_ENABLE、PPI_PORT_DIRECTION,并没有定义,在对PPI口读取 数据时(应用程序),是否
用 fd=open(“dev/ppi0”,O_RDWR),即可使能ppi口,即实现了对PPI0_CONTROL寄存器的EN位写“1”使能?



问题2: 我期望实现的机制是 在应用程序中,开辟一个数组,open设备后,读取数据,再用   printf() 打印出数组中从PPI口读到的数据。手册上说PPI必须与DMA一起使用。我找的这个参考程序里面并没有体现对DMA的设置,是不是在驱动层实现了呢?



参考程序的设计构想是否成立?





Bfin_ppi.h------------------------------2011R1-RC3------------------------------------





没有对PPI_PORT_ENABLE、PPI_PORT_DIRECTION,做定义





Bfin_ppi.c------------------------------2011R1-RC3------------------------------------



#elif defined(EPPI0_CONTROL) || defined(EPPI1_CONTROL)  /* EPPI */



#define PORT_EN      EPPI_EN                                  



#define PORT_DIR  EPPI_DIR







Ppi_read



         /*
configure PPI registers to match DMA registers */



         dev->regs->ppi_control
&= ~PORT_DIR;



         dev->regs->ppi_count
= conf->line_len - PPI_COUNT_CORR_OFFSET;



         dev->regs->ppi_frame
= conf->num_lines;



         dev->regs->ppi_delay
= conf->delay;





         if
(conf->timers)



                   disable_timer_output(dev);





         enable_dma(dma);





         /* enable ppi */



         dev->regs->ppi_control
|= PORT_EN;



         SSYNC();



Ppi_write



         /*
configure PPI registers to match DMA registers */





         dev->regs->ppi_control
|= PORT_DIR;



         dev->regs->ppi_count
= conf->line_len - PPI_COUNT_CORR_OFFSET;



         dev->regs->ppi_frame
= conf->num_lines;



         dev->regs->ppi_delay
= conf->delay;





         enable_dma(dma);



         /*
enable ppi */



         dev->regs->ppi_control
|= PORT_EN;



         SSYNC();



在2008BEV   bfin_ppi.h中------------------------------------------------------------------------------------



/*



** ioctl commands



*/



#define CMD_PPI_PORT_ENABLE    1



#define CMD_PPI_PORT_DIRECTION 2



在2008BEV   bfin_ppi.c中--------------------------------------------------------------------------------------



switch (cmd) {



case CMD_PPI_PORT_ENABLE:



{



DPRINTK("ppi_ioctl: CMD_PPI_PORT_ENABLE\n");



regdata = bfin_read_PPI0_CONTROL();



pdev->portenable = (unsigned short)arg;



if (arg)



regdata |= PORT_EN;



else



regdata &= ~PORT_EN;



pdev->ppi_control = regdata;



bfin_write_PPI0_CONTROL(pdev->ppi_control);



break;



}



case CMD_PPI_PORT_DIRECTION:



{



DPRINTK("ppi_ioctl:
CMD_PPI_PORT_DIRECTION\n");



regdata = bfin_read_PPI0_CONTROL();



if (arg)



regdata |= PORT_DIR;



else



regdata &= ~PORT_DIR;



pdev->ppi_control = regdata;



bfin_write_PPI0_CONTROL(pdev->ppi_control);



break;



}







问题2: 我期望实现的机制是 在应用程序中,开辟一个数组,open设备后,读取数据,再用   printf() 打印出数组中从PPI口读到的数据。程序如下:





//version1: change the buffer_size from 128 to
1024  -----2014.5.7





//version2: add the printf()  for making sure  the programming running location





//PPI接收程序测试



#include <stdio.h>



#include <fcntl.h>



#include
<sys/ioctl.h>



#include
<unistd.h>



#include <errno.h>



#include
<string.h>



#include
<stdlib.h>



#include
<sys/time.h>





#include
"ppi.h"





typedef unsigned short   UINT16;





UINT16 buf[1024];





int main( int argc,
char** argv )



{



    int i;



    int fd;



    



    for(i=0;i<1024;i++)



    {



       buf[i] = 0;



    }





    fd = open("/dev/ppi0", O_RDWR);



    if (fd==-1)



    {



    printf(" error opening device. fd=-1\n");



    exit(1);



    }



    else



    {



    printf("\nPPI0 open success\n");



    //print  the  ==============fd



    printf("\n%d\n",fd);



    }



    //配置PPI操作寄存器,满足外部帧同步及接收模式





//////////////return
ioctl///then printf ///the return 、、value;;;;;///////////////5.11



    int rt[20];         //  
返回 值



    rt[0]=ioctl(fd,
CMD_PPI_LINELEN, 1024);



    rt[1]=ioctl(fd, CMD_PPI_NUMLINES, 1);



rt[2]=ioctl(fd, CMD_PPI_PORT_DIRECTION, CFG_PPI_PORT_DIR_RX); //返回负值  -1



    rt[3]=ioctl(fd, CMD_PPI_XFR_TYPE,
CFG_PPI_XFR_TYPE_NON646);



    //ioctl(fd, CMD_PPI_FIELD_SELECT,
CFG_PPI_FIELD_SELECT_1);  rt[4]=ioctl(fd,
CMD_PPI_PORT_CFG, CFG_PPI_PORT_CFG_XSYNC1);



    rt[5]=ioctl(fd, CMD_PPI_SKIPPING,
CFG_PPI_SKIP_DISABLE);  



    rt[6]=ioctl(fd, CMD_PPI_PACKING,
CFG_PPI_PACK_DISABLE);



    //ioctl(fd, CMD_PPI_SKIP_ODDEVEN,
CFG_PPI_SKIP_ODD);



    rt[7]=ioctl(fd, CMD_PPI_DATALEN,
CFG_PPI_DATALEN_16);



    rt[8]=ioctl(fd, CMD_PPI_CLK_EDGE,
CFG_PPI_CLK_EDGE_RISE);



    rt[9]=ioctl(fd, CMD_PPI_TRIG_EDGE,
CFG_PPI_TRIG_EDGE_RISE);





    printf("\nrunning
location------------------- 1\n");
/////////5.8/





    rt[10]=ioctl(fd, CMD_PPI_SET_DIMS,
CFG_PPI_DIMS_1D);



    //ioctl(fd, CMD_PPI_SETGPIO, 1); //意义不明确 ////version 4



    rt[11]=ioctl(fd, CMD_PPI_DELAY, 0);



    



    printf("\nrunning
location---------finishi ioctl ---------- 2\n");////////////5.8//



    rt[12]=ioctl(fd,
CMD_PPI_PORT_ENABLE, 1);     //返回负值  -1



//----------------------------------------------------------------------------------------------------------------------    



    int m;



    for(m=0;m<=14;m++)



    {



       printf("\nioctl %d return value  %d\n",m,rt[m]);



    }



//----------------------------------------------------------------------------------------------------------------------



    rt[13]=read(fd,buf,1024*sizeof(UINT16));



    rt[14]=close(fd);



    



    printf("\nrunning
location------------------- 3\n");    
////////////5.8//





    for(i=0;i<1024;i++)



    {



     printf("%d\n",buf[i]);



    }



    printf("\nEnd of data");



    return 0;



}








这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/5/17 9:43:33
Summer(论坛新手)
Summer
头衔:社区公民
帮派:无帮无派
帖数:3
金钱:129
积分:5
注册时间:2014/4/25
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
顶起,求指点迷津…………

这家伙很懒,什么也没有留下!
等级:论坛新手 参考IP地址:*.*.*.*
2014/5/19 8:42:30
尊贵身份标志
OpenADSP(管理员)
OpenADSP
头衔:社区公民
帮派:无帮无派
帖数:5195
金钱:34806
积分:6378
注册时间:2011/6/7
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
帮你转到新手区,看到的人比较多,看有没有人能给出建议。

我是OP...
等级:管理员 参考IP地址:*.*.*.*
2014/5/30 17:26:09
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159300 Call, 1 Queries, Processed in 0.031250 second(s),