DMA寄存器设置

1.设置DMA模式:

   寄存器名:DMAMODE0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+80h(LCS)

   寄存器值:DMAMODE0[1:0]=11:定义DMA总线宽度为32位;

             DMAMODE0[9]=0:设置DMA传输模式为BLOCK模式;

             DMAMODE0[6]=1:使能READY#输入;

             DMAMODE0[11]=0:保持局部端地址为增量模式;   

             DMAMODE0[8:7]=11:设置DMA支持连续突发传输;

             DMAMODE0[10]=1:使能DMA完成中断;

             DMAMODE0[11]=1:设置DMA完成中断触发INTA#中断。 

    

2.设置DMA通道优先级:

   寄存器名:MARBR

   寄存器类型:局部配置寄存器 

   寄存器地址:PCIBAR0+08h

   寄存器值:MARBR[20:19]=01:设置DMA通道0的优先级最高;

3.设置DMA传输参数:

   (1)设置PCI-E端起始地址

   寄存器名:DMAPADR0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+84h

   寄存器值:DMAPADR0[31:0]=(U32)PciBuffer.PhysicalAddr;

   (2)设置局部端起始地址  

   寄存器名:DMALADR0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+88h

   寄存器值:DMALADR0[31:0]

             开始时寄存器值为0x1000000*4,以后每做完一次DMA写操作,该寄存器值递增2048*4;  

   (3)设置DMA长度  

   寄存器名:DMASIZ0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+8Ch

   寄存器值:DMASIZ0[22:0]=2048*4;

   (4)设置DMA传输方向                    

   寄存器名:DMADPR0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+90h

   寄存器值:DMADPR0[3]=0;(PCI-E TO LOCAL)

4.设置DMA中断:

   寄存器名:INTCSR

   寄存器类型:Run Time寄存器 

   寄存器地址:PCIBAR0+68h

   寄存器值:INTCSR[18]=1:使能DMA Channel0中断;

5.启动DMA传输:

   寄存器名:DMACSR0

   寄存器类型:局部配置寄存器 

   寄存器地址:PCIBAR0+A8h

   寄存器值:DMACSR0[1:0]=11:启动DMA传输;

  

控制地址配置的一些寄存器:

6.设置地址配置使能寄存器

   寄存器类型:用户自定义寄存器

   寄存器地址:局部总线SPACE0地址空间 0x0000000A*4

   寄存器值:enable(1:使能地址配置,0:禁止地址配置)

             开始配置时置1,配置结束后置0; 

7.设置地址配置RAM读使能寄存器

   寄存器类型:用户自定义寄存器

   寄存器地址:局部总线SPACE0地址空间 0x0000000D*4

   寄存器值:enable(1:使能读RAM,0:禁止读RAM) 

              配置结束后置1;

                           

·                                 数据采集线程中配置的寄存器(此后的寄存器在线程中配置)

采用DMA读的方式将数据采集进来,进行DMA传输时需要配置的寄存器(从PCI-E端进行访问,使用DMA Channel 0):

1.设置DMA模式:

   寄存器名:DMAMODE0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+80h

   寄存器值:DMAMODE0[1:0]=11:定义DMA总线宽度为32位;

             DMAMODE0[9]=0:设置DMA传输模式为BLOCK模式;

             DMAMODE0[6]=1:使能READY#输入;

             DMAMODE0[11]=1:保持局部端地址为常量;   

             DMAMODE0[8:7]=11:设置DMA支持连续突发传输;

             DMAMODE0[10]=1:使能DMA完成中断;

             DMAMODE0[11]=1:设置DMA完成中断触发INTA#中断。   

2.设置DMA通道优先级:

   寄存器名:MARBR

   寄存器类型:局部配置寄存器 

   寄存器地址:PCIBAR0+08h

   寄存器值:MARBR[20:19]=01:设置DMA通道0的优先级最高;

  

3.设置DMA传输参数:

   (1)设置PCI-E端起始地址

   寄存器名:DMAPADR0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+84h

   寄存器值:DMAPADR0[31:0]=(U32)PciBuffer.PhysicalAddr;

   (2)设置局部端起始地址  

   寄存器名:DMALADR0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+88h

   寄存器值:DMALADR0[31:0]=0x0000000C*4;  

   (3)设置DMA长度  

   寄存器名:DMASIZ0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+8Ch

   寄存器值:DMASIZ0[22:0]=m_DMALength*4;

   (4)设置DMA传输方向                    

   寄存器名:DMADPR0

   寄存器类型:DMA配置寄存器

   寄存器地址:PCIBAR0+90h

   寄存器值:DMADPR0[3]=1;(LOCAL TO PCI-E)

4.使能LINTI#、INTA#、DMA Channel0中断:

   寄存器名:INTCSR

   寄存器类型:Run Time寄存器 

   寄存器地址:PCIBAR0+68h

   寄存器值:INTCSR[8]=1:使能INTA#中断;

             INTCSR[11]=1:使能LINTI#中断;

             INTCSR[18]=1:使能DMA Channel0中断;

5.启动DMA传输:

   寄存器名:DMACSR0

   寄存器类型:局部配置寄存器 

   寄存器地址:PCIBAR0+A8h

   寄存器值:DMACSR0[1:0]=11:启动DMA传输;  

  

                       

控制FIFO时配置的寄存器:

6.设置FIFO的中断使能寄存器:

   寄存器类型:用户自定义寄存器

   寄存器地址:局部总线SPACE0地址空间 0x00000001*4

   寄存器值:InterruptState=1(1:使能,0:废止) 

7.设置FIFO的写使能寄存器:

   寄存器类型:用户自定义寄存器

   寄存器地址:局部总线SPACE0地址空间 0x0000000B*4

   寄存器值:enable=1(1:使能,0:废止) 

·                                 结束采集时配置的寄存器

1.设置FIFO的写使能寄存器:

   寄存器类型:用户自定义寄存器

   寄存器地址:局部总线SPACE0地址空间 0x0000000B*4

   寄存器值:enable=0(1:使能,0:废止) 

2.设置FIFO的中断使能寄存器:

   寄存器类型:用户自定义寄存器

   寄存器地址:局部总线SPACE0地址空间 0x00000001*4

   寄存器值:InterruptState=0(1:使能,0:废止) 

3.废止LINTI#、INTA#、DMA Channel0中断:

   寄存器名:INTCSR

   寄存器类型:Run Time寄存器 

   寄存器地址:PCIBAR0+68h

   寄存器值:INTCSR[8]=0:废止INTA#中断;

             INTCSR[11]=0:废止LINTI#中断;

             INTCSR[18]=0:废止DMA Channel0中断;

4.终止DMA传输:

   寄存器名:DMACSR0

   寄存器类型:局部配置寄存器 

   寄存器地址:PCIBAR0+A8h

   寄存器值:DMACSR0[1:0]=00:终止DMA传输; 

  

  

!!NOTE:配置用户自定义寄存器的函数(详见PLX SDK User Manual.pdf文件,PLX6.0)为:

PlxPci_PciBarSpaceWrite(

            PLX_DEVICE_OBJECT *pDevice, //Pointer to an open device

            U8                 BarIndex, //The index of the PCI BAR to access.  Valid values are in the range 0-5.

            U32                offset, //If bOffsetAsLocalAddr is FALSE, offset is an offset from the PCI BAR space. The mapping will not be

            //adjusted because the function assumes the space is already mapped correctly. The data range accessed

            //must not be larger than the size of the PCI-to-Local Space window.

            //If bOffsetAsLocalAddr is TRUE, offset is treated as the actual local bus base address to start reading from.

            //For 32-bit devices, this allows access to any location on the 4GB local bus space.          

            VOID              *pBuffer, //A pointer to a user supplied buffer that contains the data to write.

            U32                ByteCount,

            PLX_ACCESS_TYPE    AccessType,

            BOOLEAN            bOffsetAsLocalAddr

        );

        Description:

        This function writes from the local bus of a PCI device containing a PLX chip

        (sometimes referred to as Direct Slave Write).

PlxPci_PciBarSpaceWrite(

            pDevice,

            0,

            REG_ADD,   

            ®_VALUE, //A pointer to a user supplied buffer that contains the data to write.

            sizeof(REG_VALUE),

            BitSize32, // 32-bit accesses

            FALSE

        );

其中,REG_ADD为寄存器地址、REG_VALUE为寄存器值,返回值为ApiSuccess表示配置成功!

寄存器地址说明见AddressDevide.h文件

!!NOTE:配置局部配置寄存器、DMA配置寄存器、Run Time寄存器的函数(详见PCI SDK Programmer's Reference Manual.pdf文件)为:

写寄存器:

PLX_STATUS

PlxPci_PciRegisterWrite(

    U8  bus,

    U8  slot,

    U8  function,

    U16 REG_ADD,

    U32 REG_VALUE

    );

其中,REG_ADD为寄存器相对于PCIBAR0的偏移地址、REG_VALUE为寄存器值,返回值为ApiSuccess表示写寄存器成功!  

读寄存器:

U32 REG_VALUE = PlxPci_PciRegisterRead(

    U8          bus,

    U8          slot,

    U8          function,

    U16         REG_ADD,

    PLX_STATUS * pStatus

    );

其中,REG_ADD为寄存器相对于PCIBAR0的偏移地址、REG_VALUE为返回的寄存器值

 

·                                 寄存器的配置是从“开始采集”开始依次介绍的(参见应用程序),配置寄存器的API函数见上页的NOTE!

一、采样初始化时配置的寄存器

1.设置DMA长度寄存器:

  寄存器类型:用户自定义寄存器

  寄存器地址:局部总线SPACE0地址空间 0x0000000F*4

  寄存器值:m_DMALength(最大为2048)

 

2.设置采样模式寄存器:

  寄存器类型:用户自定义寄存器

  寄存器地址:局部总线SPACE0地址空间 0x00000005*4

  寄存器值:m_SampleMode(0表示连续采样,1表示局部采样)

  !!note:若采用离散采样模式,还需配置采样地址,采用DMA写的方式写入RAM,涉及的寄存器配置单独说明,见二

 

3.设置采样起始地址寄存器:

  寄存器类型:用户自定义寄存器

  寄存器地址:局部总线SPACE0地址空间 0x00000006*4

  寄存器值:m_StartAddress

4.设置采样终止地址寄存器:

  寄存器类型:用户自定义寄存器

  寄存器地址:局部总线SPACE0地址空间 0x00000007*4

  寄存器值:m_EndAddress

 

5.设置计数器清零寄存器:

  寄存器类型:用户自定义寄存器

  寄存器地址:局部总线SPACE0地址空间 0x00000003*4

  寄存器值:SampleParamSet(高电平有效)

6.设置计数时间单位寄存器:

  寄存器类型:用户自定义寄存器

  寄存器地址:局部总线SPACE0地址空间 0x00000004*4

  寄存器值:SampleParamSet

7.设置计数器控制寄存器:

  寄存器类型:用户自定义寄存器

  寄存器地址:局部总线SPACE0地址空间 0x00000002*4

  寄存器值:SampleParamSet(1:启动计数器,0:终止计数器)

 

8.设置地址总线宽度寄存器:

  寄存器类型:用户自定义寄存器

  寄存器地址:局部总线SPACE0地址空间 0x00000008*4

  寄存器值:m_AddressBusWidth

 

9.设置数据总线宽度寄存器:

  寄存器类型:用户自定义寄存器

  寄存器地址:局部总线SPACE0地址空间 0x00000009*4

  寄存器值:m_DataBusWidth

你可能感兴趣的:(ARM嵌入式相关)