精华内容
下载资源
问答
  • 基于VHDL语言的McBSP接口设计、电子技术,开发板制作交流
  • 一种直接利用DSP的MCBSP接口和DMA通道实现UART的方法、电子技术,开发板制作交流
  • TMS320VC54x处理器McBSP接口的设计和实现,以低速语音编解码系统为例,介绍了TMS320VC54x数字信号处理器的多通道缓冲串口的软硬件设计,给出了具体的设计思想和实现方法。关键词:数字信号处理;语音编解码;接口;...
  • DM8168的McSPI/McASP/McBSP接口

    千次阅读 2018-07-16 10:42:04
    DM8168的McSPI/McASP/McBSP接口2012年04月07日 14:37:06阅读数:6208DM8168的McSPI/McASP/McBSP接口McSPI接口SPI管脚:管脚类型描述SPI_SCLKI/OSPI串行时钟(MASTER时:输出;SLAVE:输入)SPI_D0I/O能被配置为输入...

    DM8168的McSPI/McASP/McBSP接口

    DM8168McSPI/McASP/McBSP接口

    McSPI接口

    SPI管脚:

    管脚

    类型

    描述

    SPI_SCLK

    I/O

    SPI串行时钟(MASTER时:输出;SLAVE:输入)

    SPI_D0

    I/O

    能被配置为输入或输出(MOSImaster outslave inMISOmaster in slave out

    SPI_D1

    I/O

    能被配置为输入或输出(MOSImaster outslave inMISOmaster in slave out

    /SPI_CS0

    I/O

    SPI片选0MASTER时:输出;SLAVE:输入,低有效

    /SPI_CS1

    I/O

    SPI片选1MASTER时:输出;SLAVE:输入,低有效

    /SPI_CS2

    I/O

    SPI片选2MASTER时:输出;SLAVE:输入,低有效

    /SPI_CS3

    I/O

    SPI片选3MASTER时:输出;SLAVE:输入,低有效

    时序:

    SPI接口可以进行以下配置:

    • SPI字长
    • SPI使能产生可编程
    • SPI使能断言
    • SPI使能极性
    • SPI时钟频率
    • SPI时钟相位(PHA
    • SPI时钟极性(POL

    McASP接口

    McASP0管脚:

    管脚

    类型

    描述

    MCA[0]_ACLKR

    I/O

    McASP0接收位时钟

    MCA[0]_AHCLKR

    I/O

    McASP0接收高频主时钟I/O

    MCA[0]_AFSR

    I/O

    McASP0接收帧同步IO

    MCA[0]_AMUTEIN

    I/O

    McASP0禁音输入

    MCA[0]_ACLKX

    I/O

    McASP0发送位时钟

    MCA[0]_AHCLKX

    I/O

    McASP0发送高频主时钟I/O

    MCA[0]_AFSX

    I/O

    McASP0发送帧同步

    MCA[0]_AMUTE

    O

    McASP0禁音输出

    MCA[0]_AXR[5]

    I/O

    McASP0发送/接收数据I/Os

    MCA[0]_AXR[4]

    I/O

    MCA[0]_AXR[3]

    I/O

    MCA[0]_AXR[2]

    I/O

    MCA[0]_AXR[1]

    I/O

    MCA[0]_AXR[0]

    I/O

    McASP1管脚:

    管脚

    类型

    描述

    MCA[1]_ACLKR

    I/O

    McASP1接收位时钟

    MCA[1]_AHCLKR

    I/O

    McASP1接收高频主时钟I/O

    MCA[1]_AFSR

    I/O

    McASP1接收帧同步IO

    MCA[1]_AMUTEIN

    I/O

    McASP1禁音输入

    MCA[1]_ACLKX

    I/O

    McASP1发送位时钟

    MCA[1]_AHCLKX

    I/O

    McASP1发送高频主时钟I/O

    MCA[1]_AFSX

    I/O

    McASP1发送帧同步

    MCA[1]_AMUTE

    O

    McASP1禁音输出

    MCA[1]_AXR[1]

    I/O

    McASP1发送/接收数据I/Os

    MCA[1]_AXR[0]

    I/O

    McASP2管脚:

    管脚

    类型

    描述

    MCA[2]_ACLKR

    I/O

    McASP2接收位时钟

    MCA[2]_AHCLKR

    I/O

    McASP2接收高频主时钟I/O

    MCA[2]_AFSR

    I/O

    McASP2接收帧同步IO

    MCA[2]_AMUTEIN

    I/O

    McASP2禁音输入

    MCA[2]_ACLKX

    I/O

    McASP2发送位时钟

    MCA[2]_AHCLKX

    I/O

    McASP2发送高频主时钟I/O

    MCA[2]_AFSX

    I/O

    McASP2发送帧同步

    MCA[2]_AMUTE

    O

    McASP2禁音输出

    MCA[2]_AXR[1]

    I/O

    McASP2发送/接收数据I/Os

    MCA[2]_AXR[0]

    I/O

    几个概念:

    • 位、字、slot、帧

    图中,位(bitb0-b7构成字(word),这个字加4个附着位(pad)构成slot,在这个slot中的对齐方式是左对齐。帧(Frame)由两个slotslot0slot1)构成。

    • McAsp支持的TDM格式

    (A)FS的宽度可以是1bit

    FS还可以设置延迟时间:

    (A)     FS的宽度可以是1bit

    (B)     是上一帧的最后一位,这个最后一位与slot0之间不允许有间隙

    • McAsp支持的I2S格式:

    (A)     支持AXR0-AXR56个数据脚

    I2S方式,我们通常用通道(channel)来代替Slot。一般两个通道:左通道和右通道

    l  McASP支持的S/PDIF

    McASP的发送器支持S/PDIF格式。S/PDIF格式是将时钟(CLOCK)、帧(FRAME)和数据(Data)编码成一个信号,通过AXRx脚来发送。所以需要了解编码方式、子帧格式、帧格式。

    (1)     编码方式(BMCBiphase-Mark Code

    (2)     子帧格式

    Preamble code

    Previous logical state

    Logical state on pin AXRn

    Description

    B(或Z

    0/1

    1110 1000/00010111

    块的开始和子帧1

    M(或X

    0/1

    1110 0010/00011101

    子帧1

    W(或Y

    0/1

    1110 0100/00011011

    子帧2

    但是DM8168DIT仅产生Previous logical state0Preamble,因为McASP在发送DIT模式的时候是采用偶极性的编码方案。

    (3)     帧格式

     

    McBSP接口

    管脚定义:

    管脚

    类型

    描述

    MCB_CLKR

    I/O

    McBSP的接收时钟

    MCB_FSR

    I/O

    McBSP的接收帧同步

    MCB_DR

    I

    McBSP的接收输入输入

    MCB_CLKX

    I/O

    McBSP的发送时钟

    MCB_FSX

    I/O

    McBSP的发送帧同步

    MCB_DX

    O

    McBSP的发送数据输出

    MCB_CLKS

    I

    McBSP的源时钟

    时序:

    我们可以设置每帧的相位数(单相位或双相位);每帧的字数(对于单相位,每帧字数可以达128,但是对双相位,只能是2个字,对应,每个相位1个字);每个相位中的字的长度。

    • 单相位帧

    在这种方式,可以设置每帧的字数(word个数)、每个字(word)的位数(bit数)等

    • 双相位帧

    这种方式,每个相位,只能设置1个字。在这里第一个相位的字是16bit,第二个相位的字是8bit

     

    总结

    • McSPIMcASPMcBSP的区别是非常明显的,不多说
    • McBSP能实现部分McASP的功能,比如都支持TDMI2S,因此二者在功能上存在交叉。
    展开全文
  • TMS320VC5509A通过MCBSP接口与NUC972的IIS接口进行音频传输(二) 今天继续学习DSP5509A与NUC972通过IIS进行音频数据传输,主要分析DSP5509A这一端的MCBSP接口的配置。首先先介绍一下DSP5509A的MCBSP接口。TI的官方...

        如果有问题,请加QQ群 891339868 进行交流

    TMS320VC5509A通过MCBSP接口与NUC972的IIS接口进行音频传输(二)

    今天继续学习DSP5509A与NUC972通过IIS进行音频数据传输,主要分析DSP5509A这一端的MCBSP接口的配置。首先先介绍一下DSP5509A的MCBSP接口。TI的官方文档是这样描述的:The TMS320C55x DSPs provide multiple high-speedmultichannel buffered serial ports (McBSPs) that allow direct interface to other C55x DSPs codecs,and other devices in a system。高速、多缓冲、串行接口、可以直接连接其他DSPcodec、其他设备是其使用的关键词。MCBSP接口详细的资料,可以查阅官方文档。根据官方文档描述的特性,可以兼容AC97IIS这两种标准音频接口。本文档主要描述配置为IIS的方法。

    首先看一下MCBSP接口包含的接口,如下图所示:

     

    IIS音频系统中,DSP5509A作为从设备,CLKR为接收数据提供时钟,CLKX为发送数据提供时钟,CLKSDSP5509A上面没有,可以忽略,DR接收数据,DX发送数据,FSR为接收数据的同步时钟,FSX为发送数据的同步时钟。

    再了解一下DSP5509A的MCBSP传输数据的典型时序图,首先看一下单数据相的,如下图所示:

     

    根据图上的时序可以看出来,CLKR/CLKX分别为发送和接收数据提供位时钟,FSR/FSX分别提供帧同步时钟,在单数据相模式下,每一帧数据的格式需要完全一致,不过每一帧数据的数目可以最多128个数据(8bit/12bit/16bit/20bit/24bit/32bit)。

    再看一下双数据相的传输的时序图,如下图所示:

     

    根据上图的时序,在双数据相模式下,在一个帧同步信号内,可以实现两种不同格式的数据进行传输,最多一帧数据可以传输256个数据(8bit/12bit/16bit/20bit/24bit/32bit)。

    由于Nuc972上面是标准的IIS接口,咱们首先了解一下IIS接口定义:

    1. 串行时钟SCLK,也叫位时钟(BCLK),即对应数字音频的每一位数据,SCLK的频率=2*采样频率*采样位数;
    2. 帧时钟LRCK,用于切换左右声道的数据,低电平为左声道,高电平为右声道,LRCK频率等于采样频率;
    3. 串行数据SDIN、SDOUT为数据传输接口;
    4. 有时为了使系统能够更好的同步,还需要另外一个信号MCLK,成为主时钟,也叫系统时钟(sys clokc),一般是采样频率的256倍或者是384倍。这个不是必须的,我的理解是为整个系统统一提供时钟,为了更好的同步,在这个项目中,不使用这个时钟。

    IIS的操作模式分为三种:标准的IIS模式、左对齐模式、右对齐模式。在这里我们用的是标准的IIS模式,所以咱们讨论一下标准的IIS模式的数据传输的时序图,其他两种就不讨论了,有兴趣的可以去网上了解。标准的IIS模式时序图如下图所示:

     

    从时序图上可以看出来,WCLK提供左右声道选择时钟,BCLK提供数据传输的位时钟,SDIN/SDOUT上分别输入和输出数据。每次数据传输需要在WCLK来到后需要延时一个位时钟进行数据传输(这一点很重要,需要在MCBSP配置中进行设置)。

    对比IIS与MCBSP时序图,有一点不同,MCBSP使用的同步信号在IIS接口上没有,所以需要使用IIS的WCLK作为MCBSP的FSR/FSX同步时钟,WCLK的下降沿作为同步时钟。根据这种考虑,MCBSP可以选择双数据项模式,每相数据一个数据,这样正好可以兼容IIS接口的时序。由于MCBSP接口的寄存器比较多,在这里就不一一列举了,把关键的地方说一下:

    1. 双数据相模式,每相一个数据,数据位为16bit,我这里使用的16bit数据模式;
    2. 接收到同步时钟后,延时一个位时钟再传输数据,这一点正好兼容IIS标准模式下的一个位时钟的间隙;
    3. 时钟发生寄存器默认值就可以了,因为是从模式,外部提供时钟;
    4. MCBSP引脚FSX/FSR的时钟源都设置为外部提供,CLKR/CLKX都设置为输入模式,FSX/FSR同步时钟的有效电平都设置为低电平模式。

    通过以上配置后,MCBSP就可以按照IIS标准模式进行数据传输了。

    不过一般在大数据量的传输中,都使用DMA模式减少CPU的工作量,所以需要进一步对DMA进行配置。咱们首先了解一下DSP5509A的DMA的相关信息,DSP5509A上一共有6个DMA通道,可以分别绑定HPI接口、DARAM、SARAM、外设总线控制器、EMIF接口。据图的框图如下图所示:

     

    在每一个DMA通道中,都内置一个FIFO缓存区,具体的传输流程如下图所示:

     

    DSP5509A的每一个DMA通道都提供每次数据传输完成后自动初始化的功能,可以很方便的对DMA寄存器进行重新初始化,从而节省时间。自动初始化DMA寄存器分为两种模式,一种是不改变寄存器内容初始化,另外一种是改变寄存器内容初始化。咱们首先看一下不改变寄存器内容的操作流程,如下图所示:

     

    根据上图所示,如果设置AUTOINIT=1,REPEAT=1的话,一个通道的DMA一次传输完成后,CPU会自动重新初始化,不需要用户程序干预,这种方式比较适合数量小的情况下,采取单数据缓冲区操作的模式。

    下面看一下改变DMA寄存器内容的操作流程,如下图所示:

     

    根据图中描述,这种模式操作起来相对来说比较复杂,主要适合于乒乓操作的方式。对比上一种操作方式,需要在DMA启动前初始化时设置REPEAT=0,随后启动DMA传输, DMA启动后需要用户程序设置ENDPROG=1,告诉DMA寄存器内容已经设置完毕,DMA控制器此时一直在等待ENDPROG是否已经被置一,DMA控制器收到这个信号后,将配置寄存器中的内容复制到工作寄存器,同时将ENDPROG复位为零,此时用户程序需要轮询ENDPROG是否已经被DMA控制器复位为零,如果检测到ENDPROG复位为零,用户程序就可以重新配置DMA配置寄存器的内容了,就这样,依次循环下去。在此项目中,采用的就是这种操作方式,为了能及时的检测ENDPROG标志(这一点很重要,要不然会出现数据丢失的问题),我在定时器中断服务程序里面对ENDPROG进行检测。

    说到这里,DSP5509A的MCBSP就配置完成了。

    展开全文
  • TMS320VC5509A通过MCBSP接口与NUC972的IIS接口进行音频传输(三) 今天咱们继续了解DSP5509A的MCBSP接口与NUC972的IIS接口的音频传输的第三部分,就是DSP5509A在linux上的驱动部分。 首先咱们了解一下linux系统...

       如果有问题,请加QQ群 891339868 进行交流

    TMS320VC5509A通过MCBSP接口与NUC972的IIS接口进行音频传输(三)

       今天咱们继续了解DSP5509A的MCBSP接口与NUC972的IIS接口的音频传输的第三部分,就是DSP5509A在linux上的驱动部分。

        首先咱们了解一下linux系统上的音频系统。目前linux上主流的音频框架是ALSA(Advanced Linux Sound Architecture的简称),具体的就不说了,框架比较复杂,网上的资料也比较多,可以去仔细了解了解,今天咱们主要说说针对这个项目,咱们具体需要做什么工作。针对嵌入式linux系统,ALSA框架拓展了一套专用的框架,ASoC(ALSA System on chip的简称)。ASoC分为三部分:一是Machine驱动,二是Codec驱动,三是Platform驱动。他们之间的关系如下图所示:

    简单的说,Platform驱动是CPU端的驱动,Codec驱动codec的驱动,Machine驱动是将前两种驱动进行有机结合的驱动。咱们就根据NUC972的BSP对着三部分分别进行分析。

        NUC972的BSP是基于linux3.1开发的,音频部分在/sound/soc/路径中,包含ALSA驱动的核心部分和各种平台和codec的驱动代码其中/sound/soc/codecs文件夹里面包含各种codec的驱动代码,/sound/soc/nuc970文件夹里面包含NUC970系列的machine驱动和platform驱动,而将DSP5509A模拟成codec的驱动需要咱们自己编写。首先看一下/sound/soc/nuc970文件夹里面包含的内容,主要包含三个文件,nuc970-audio.c、nuc970-i2s.c、nuc970-pcm.c。其中nuc970-audio.c对应上面描述的Machine驱动,nuc970-i2s.c和nuc970-pcm.c对应上面描述的platform驱动。Platform为什么分两部分呢?是因为ASoc在具体实现Platform时,将Platform分为两部分,一部分是snd_soc_platform_driver,负责管理音频数据,把音频数据通过DMA或其他操作传送至cpu dai(cpu传送数据的物理接口的逻辑抽象)中,第二部分是snd_soc_dai_driver,主要完成cpu一侧的dai的参数配置,同时也会通过一定的途径把必要的DMA等参数与snd_soc_platform_driver进行交互。具体来说,nuc970-i2s.c文件就是nuc970系列的snd_soc_dai_driver,nuc970-pcm.c就是nuc970系列的snd_soc_platform_dirver。

        首先看nuc970-pcm.c文件,看驱动文件咱们一般都是按从文件的最后向上看的,如下图所示,这是该驱动文件的最后几行:

    可以看的出来snd_soc_platform_driver也是被抽象成一个platform格式的驱动,注意,这里的platform驱动是linux内核中驱动的一种逻辑格式,和上面所说的nuc970平台的platform驱动不是一回事儿。这里面最关键的是“nuc970-audio-pcm”这个名字,Machine驱动就是根据这个名字在内核中自动匹配这个驱动文件的,其他的不用修改,主要是NUC970系列cpu的DMA操作音频的代码,新唐的工程师已经给咱们写好了。

        再看一下nuc970-i2s.c这个文件,如下图所示,这是该驱动文件的最后几行:

    和snd_soc_platform_driver类似,snd_soc_dai_driver也是被抽象成了一个platform驱动,同样的,这里面最重要的是“nuc970-audio-i2s”这个名字,Machine驱动就是根据这个名字在内核中自动匹配这个驱动文件的,其他的不用修改,主要是NUC970系列cpu的dai接口的代码,包括设置频率、格式等信息,新唐的工程师已经给咱们写好了。

        接着咱们再了解了解nuc970系列cpu的Machine驱动,就是nuc970-audio.c文件。先看最后几行,如下图所示:

    同样的,该驱动也是被抽象成了一个platform驱动,主要包含两部分内容,一个是声卡的注册,一个是声卡的卸载,分别对应nuc970_audio_probe函数和nuc970_audio_remove函数。

    再看一下声卡注册的内容,如下图所示:

    从这几行代码中可以很清楚的看出来,向系统中注册声卡就是注册nuc970evb_i2s_dai和nuc_970evb_audio_machine这两个结构体里面的内容。首先看一下nuc970evb_audio_machine这个结构体,它是struct snd_soc_card格式,也就是声卡的抽象,其中里面name变量的值“nuc970_IIS”就是该声卡在系统中注册声卡的名字,dai_link变量包含的就是在声卡初始化的时候,Machine驱动需要在内核中寻找匹配的各个部分驱动的名字和对应的操作方法,具体的就是结构体struct snd_soc_dai_link nuc970evb_i2s_dai。这个结构体中关键的有以下几个名字,第一个是cpu_dai_name,对应nuc970-i2s.c文件中抽象成的平台驱动模块的名字,第二个是platform_name,对应nuc970-pcm.c文件中成的平台驱动模块的名字,第三个是codec_dai_name,第四个是codec_name,这两个是codec dai的名字和codec的名字,在讨论到codec驱动部分的时候在详细说,还有一个ops变量,这个是驱动提供的操作codec和cpu的接口,具体定义在结构体struct snd_soc_ops nuc970_audio_ops中,其中主要的变量是hw_params,这个变量在回调函数nuc970_audio_hw_params中实现,具体的实现代码如下图所示:

    在这个函数中主要是根据上层程序传入的参数对codec dai和cpu dai、主时钟和采样率进行设置,由于在这个项目中是用DSP5509A模拟的codec,所以在这里不需要对codec进行设置,只需要对cpu端的参数进行设置就可以了,DSP5509A端的设置需要在DSP5509A的程序中进行设置,将两边的配置设置相同就行了。

        接下来就需要编写将DSP5509A模拟成codec的驱动代码了。内核3.1版本的架构,如果需要将codec编译进内核,需要将codec驱动代码放到/sound/soc/codecs文件夹里面,所以我创建一个tms320vc5509a.c的文件,放到这个文件夹里面,首先看一下文件的最后几行,如下图所示:

       

    根据上面的代码可以看得出来,该驱动被抽象成一个i2c类型的驱动,这是由于一般的codec都有一个i2c的配置接口,内核中一般也是将codec驱动抽象成一个i2c类型的驱动,所以这里也需要将DSP5509A的驱动代码抽象成i2c类型的驱动。驱动中包含另外的三部分分别是probe、remove、id_table,分别是驱动的注册、卸载、注册设备的id号,下面咱们详细的分析一下:

    首先看这个实现注册的回调函数,如下图所示:

    这个注册函数和普通的codec的注册函数基本上一样,只有一点儿不太一样,由于DSP5509A不是一个真正的codec,所以不需要(其实也没有办法对其进行操作),所以不需要在这里面对codec进行复位,就是上图中屏蔽的那一段代码。在这个函数中包含三个必须的结构体,一个是struct snd_soc_dai_driver TMS320VC5509A_dai,这个是对codec的dai的设置,具体内容如下图所示:

    其中变量name的内容“tms320vc5509a-hifi”需要和Machine驱动中的struct soc_dai_link nuc970evb_i2s_dai的变量codec_dai_name相同。第二个必须的结构体是struct snd_soc_codec_driver soc_codec_dev_TMS320VC5509A,这个结构体内容是对codec的各种操作的接口,这里不需要对codec进行操作的接口,所以设置一个空结构体就行。第三个必须的结构体是struct regmap_config TMS320VC5509A_regmap_config,这个结构体内容是codec的各种设置接口,设置一个空结构体就行。

    接着看实现卸载的回调函数,如下图所示:

    这个和普通的codec卸载函数相同。

    接着看注册i2c设备id号代码,如下图所示:

    从代码看得出来,这一段代码是将名字为tms320vc5509a的i2c设备注册到i2c设备列表中,其中这个名字需要和platform_device中i2c设备的名字项目,在驱动初始化时进行匹配。

        到现在为止,这几部分驱动的内容就大概了解清楚了,如果需要将驱动编译到内核中,启动时自动加载驱动,只需要更改相关的Kconfig文件即可。如下图所示,内核启动时,TMS320VC5509A已经成功被探测到:

    nuc970_IIS就是在Machine驱动nuc970-audio.c中注册的声卡的名字,如下图所示:

    到此为止,驱动层的代码已经完成。如果在板子上移植了alsa工具包,就可以使用arecord 工具进行录音测试,使用aplay工具进行放音测试。

    展开全文
  • 高性能 Mcbsp全双工驱动 void McbspB_Init(void); Uint16 McbspB_Rec(Uint16* pDat, Uint16 Len); Uint16 McbspB_Tra(Uint16* pDat, Uint16 Len);
  • McBsp接口使用和概念

    2020-05-20 14:50:07
    McBSP包括一个数据通道和一个控制通道,通过7个引脚与外部设备连接。数据发送引脚DX负责数据的发送,数据接收引脚DR负责数据的接收,发送时钟引脚CLKX,接收时钟引脚CLKR,发送帧同步引脚FSX和接收帧同步引脚FSR提供...
    McBSP包括一个数据通道和一个控制通道,通过7个 引脚外部设备连接。数据发送 引脚DX负责数据的发送,数据接收引脚DR负责数据的接收,发送时钟引脚CLKX,接收时钟引脚CLKR,发送 帧同步引脚FSX和接收帧同步引脚FSR提供串行时钟和 控制信号
    McBSP 是英文Multichannel Buffered Serial Port (多通道缓冲 串行口)的缩写
    McBSP是TI公司生产的 数字信号处理芯片的多通道缓冲 串行口。McBSP是在标准 串行接口的基础之上对功能进行扩展,因此,具有与标准串行接口相同的基本功能。
    它可以和其他DSP器件、编码器等其他串口器件通信。
    McBsp很有用链接:http://wenku.baidu.com/link?url=aHBZP4Vy5rQPwYheFt-Zr3zXlX34HNn9zPwRElz-c55Nxj0-NhoOFbvu9IW8GK0XNaiVZAbEOXJ4VGhFc7pVtZwkzTVYlyHEkiLekGNGGHS

    McBSP初始化以及和EDMA的结合使用(C64X DSP)

    (1)时钟、帧以及相关寄存器设定

    http://blog.csdn.net/aesthete/archive/2006/07/06/885425.aspx

    2)McBSP初始化

             McBSP可以通过两种方式进行数据传输:

    EDMA方式:McBSP发送事件通知EDMA通道进行传输,有接收事件REVT和输出事件XEVT,它们都与固定EDMA通道进行了绑定;

    CPU方式:McBSP通过中断方式通知CPU进行数据的传输,有接收中断RINT和输出中断XINT,中断的设定由SPCR.RINTM和SPCR.XINTM控制,如果要使用中断方式,应该设为00b;CPU也可以通过轮询方式(Polled)来控制数据的传输,主要是通过查询SPCR.RRDY和SPCR.XRDY来实现;

    McBSP串口复位,两种方式:

    ①设备复位:REST引脚置为低电平,所有的串口部件都复位,相应的寄存器也处于复位状态;

    ②寄存器方式复位:跟设备复位不同,寄存器方式复位可以独立复位各部件,如单独对接收部件复位等;寄存器复位是通过设置SPCR.XRST...等完成的;

    MsBSP的EDMA传输方式初始化步骤:

           SPRC.GRST(XRST, RRST, FRST)设定为0,如果刚刚进行了设备复位,则无需再去设定;

          设置SRGR、SPCR、PCR、RCR寄存器,注意不要设置上述的几个复位字段;

           设置SPRC.GRST为1使GRS启动,此时GRS选定的时钟源就可以驱动CLKG开始工作;(如果接收部件和输出部件的帧同步和时钟都由外部源驱动的话,则这一步可以省略,因为无需Sampel Rate Generator支持工作);

           等待两个位时钟(CLKR、CLKX):

    N = ((1+CLKGDV) * 2 * CLKSM) + ((1+CLKGDV) * 2 * (Ps /P) * (!CLKSM));

              启用中断

               需要设定DSP的控制寄存器CSR.GIE位和IER.NMIE;

               对于EDMA,启动CPU中断INT8,启用EDMA中断EDMA_INT,并且选定合适的EDMA通道(12~15通道,17和18通道);

               EDMA初始化:

    对EDMA通道进行编程设定,如:

    设定源地址Source Address为DRR用于读,或者为内存位置用于写;

    设定目的地址Destination Address为DXR用于写,或者为内存位置用于读;

    CNT设置为要传输元素和帧个数;

    接收同步事件R/WSYNC为McBSP的REVT用于读;

    输出同步事件R/WSYNC为McBSP的XEVT用于写;

    设置EDMA通道传输完成中断位TCINT为1,启用Transfer Complete中断;

    PRI推荐为1;

               准备EDMA的启动:设置EDMA事件启用寄存器EER的对应于某(些)通道的位,启用某(些)通道的事件触发;

              如果McBSP接收部件以及输出部件在帧传输过程中是作为从设备(Slave,即帧同步信号是从外部获取的)的,则需要设置SPCR.XRST或SPCR.RRST为1,表示准备接收帧同步信号并且开始数据传输;还有一种进行同步的方法是使用帧同步中断来唤醒接收/输出部件,但是需要设定SPCR.(R/X)INTM为10b;

               准备接收或者输出帧主设备(Master,即同步信号从内部获取)运行,需要设定SPCR.RRST或者SPCR.XRST为1;

               如果FSGM=1,表示帧同步信号由SRG的FSG驱动,则需要设置FRST为1来启动FSG;如果FSGM=0,表示每次DXR复制到XSR都会产生一帧,因此FRST无意义;

    MsBSP的CPU中断传输方式初始化步骤:

             设置SPCR.XINTM或者SPCR.RINTM为00b,表示允许McBSP在DXR或者DRR中的数据准备好时给CPU发送中断;除了上述步骤的EDMA相关部分,其余都相同,EDMA部分替换为如下步骤:

    ①通过中断选择器MUXL/H把XINT(0/1/2)和/或者RINT(0/1/2)中断映射到CPU;

    2.      ②启用映射的中断。一旦McBSP初始化完成,传输每一个元素(写入DXR或者从DRR中读取)都会引起一次ISR的执行;

    MsBSP的CPU轮询传输方式初始化步骤:

             去除EDMA方式中的EDMA相关和中断相关,最后一步之后编写一个轮询循环检查SPCR.RRDY或者SPCR.XRDY以便确定McBSP是否准备好了接收或者输出。

    (3)CSL在McBSP和EDMA中的应用

             以DM642为例,要使用CSL API和C语言进行编程,需要在CCS集成开发环境的Project->Build Option中作一些设定,如link csldm642.lib以及link rts6400.lib,也需要预定义DSP芯片类型,如CHIP_DM642。当然,也可以在cmd文件中使用-l 选项加载csldm642.lib和rts6400.lib,在源文件或者头文件中#define CHIP_DM642。

             在编程过程中,常用的CSL API如下:

    声明CSL对象:

    MCBSP_Handle hMcbsp

    EMDA_Handle hEdma

    EDMA_Handle hEdma_NULL

    设置中断向量表:

    IRQ_setVecs(vectors)

    初始化CSL库:

    CSL_init()

    配置McBSP:

    MCBSP_Config mcbspCfg

    MCBSP_config(hMcbsp, &mcbspCfg)

    打开McBSP通道:

    hMcbsp = MCBSP_open(MCBSP_DEV0, MCBSP_OPEN_RESET);

    启用sample rate generator:

    MCBSP_enableSrgr(hMcbsp)

    复位EDMA通道:

    DMA_reset(INV)

    EDMA_clearPram(0x00000000)

    启用中断:

    IRQ_nmiEnable()

    IRQ_globalEnable()

    IRQ_disable(IRQ_EVT_DMAINT0)

    IRQ_clear(IRQ_EVT_DMAINT0)

    IRQ_enable(IRQ_EVT_DMAINT0)

    打开EDMA通道:

    hEdma = EDMA_open(EDMA_CHA_REVT0, EDMA_OPEN_RESET);

    配置EDMA通道:

    EDMA_Config config;

    EDMA_config(&config);

    EDMA_configArgs()

    配置空的EDMA参数集,需要结束时link到此参数集:

    hEdma_NULL = EDMA_allocTable(−1);

    EDMA_reset(hEdma_NULL);

    EDMA_link(hEdma, hEdma_NULL); /* Link to terminating event */

    启用EDMA:

    EDMA_enableChannel(hEdma)

    启用McBSP接收和传输部件

    MCBSP_enableRcv(hMcbsp)

    MCBSP_enableXmt(hMcbsp)

    启用帧同步:

    MCBSP_enableFsync(hMcbsp)

    处理EDMA中断:

    EDMA_intTest()

    EDMA_intClear()

    关闭McBSP 和 EDMA 通道:

    MCBSP_close(hMcbsp)

    DMA_close(hDma)

    EDMA_close(hEdma)
    -----------------------------------------------------------------------------

    本文大部分内容摘自

    赵洪亮《TMS320C55X DSP应用系统设计(第2版)》

    TI 《TMS320VC5501/5502/5509/5510 DSP Multichannel Buffered Serial Port (McBSP) Reference Guide》

    ------------------------------------------------------------------------------------------

    McBSP包括一个数据通道和一个控制通道,通过7个引脚与外部设备连接。

    功能框图如下:

    注意:

    1、对于5502,MCBSP接收到的DSP的内部时钟是来自DSP的slow peripherals clock group,即是从divider2 (D2)分频器产生的时钟信号(SYSCLK2)。

    2、在C55X系列中,不是每一款DSP都支持CLKS信号。对于不支持CLKS信号的芯片,是无法使用CLKS的相关功能的。

    其中,7个引脚分别为

    DX负责数据的发送;

    DR负责数据的接收;

    CLKX是发送时钟引脚;

    CLKR是接收时钟引脚;

    FSX是发送帧同步引脚;

    FSR是接收帧同步引脚。



      CPU和DMA控制器通过外设总线与MCBSP进行通信。当发送数据时,CPU和DMA将数据写入数据发送寄存器(DXR1,DXR2),接着复制到发送移位寄存器(XSR1,XSR2),通过发送移位寄存器输出至DX引脚。同样,当接收数据时,DR引脚上接收到的数据先移位到接收移位寄存器(RSR1,RSR2),接着复制到接收缓冲寄存器(RBR1,RBR2)中,RBR再将数据复制到数据接收寄存器(DRR1,DRR2)中,由CPU或DMA读取数据。这样就可以同时进行内部和外部的数据采集。
     

    一、MCBSB的数据传输过程

      MCBSP的接收操作是三缓冲(triple buffered)的,而发送操作是双缓冲(double buffered)的。寄存器值的使用取决于串行字长是否符合16bits。

      如果字长为16bits或小于16bits(8bits、12bits),则只须使用一套寄存器(RSR1,RBR1,DRR1,DXR1,XSR1)。

      如果字长大于16bits,则需要使用两套寄存器(RSR1/2,RBR1/2,DRR1/2,DXR1/2,XSR1/2)。
     

    二、数据的压缩和扩展

    1、MCBSP的压缩和扩展硬件可以将数据按照μ-律和A-律格式进行压缩和扩展。其示意图如下:

      对于使用μ-律压缩和扩展的数据,要保证其在DXR1中进行14位左对齐,如下图:

      对于使用A-律压缩和扩展的数据,要保证其在DXR1中进行13位左对齐,如下图:

    2、翻转数据位的顺序

      MCBSP默认为最高位先发送,但是对于一些固定的8bits传输协议,需要先进发送最低位的数据。MCBSP可以通过设置XCR2的XCOMPAND 为01,则8bits的数据在通过串行口发送前将会被翻转,这样发送数据时就变成低位优先发送。


    三、时钟和帧信号

    1、时钟

      数据从DR管脚到RSR寄存器及从XSR寄存器到DX管脚是一位一位传送的。每传输一位的时间是由时钟信号的上升沿或下降沿来决定的。 

      接收时钟信号(CLKR)控制着DR管脚到RSR寄存器的每一个bit的传输;发送时钟信号(CLKX)控制着XSR寄存器到DX管脚的每一个bit的传输。CLKR和CLKX信号可以来自MCBSP的外部时钟引脚,也可以来自MCBSP内部。另外,CLKR和CLKX信号的极性(正或负?)是可编程控制的。

      下如示意了时钟信号如何控制每一bit传输的时间:

      注:5502的MCBSP的最高频率是DSP的slow peripherals clock的1/2。如果使用DSP的管脚来输入CLKX和CLKR信号,则注意选择合适的输入时钟频率。如果使用内部生成的采样频率,则注意选择适合的输入时钟频率和设置相应的分频数(CLKGDV)。

    2、串行字

      bits在移位寄存器(RSR或XSR)和数据管脚间传输时,是按组转移的,一组称为一个串行字(serial word)。一个串行字的bit数是可以由用户来定义的。

      从DR管脚进来的数据会先存放在RSR寄存器,直到RSR寄存器存满了一个串行字,然后,这个串行字才会被发往RBR(最后道达DRR)。DX管脚同理。

    3、帧和帧同步

      把一个或多个串行字当成一个组来进行传输,称为帧。你可以定义一个帧里包含多少个串行字。

      一个帧里的字会被连续传输,帧与帧之间则会有停顿。MCBSP使用帧同步信号来确定每一个帧的发送/接收。当帧同步信号产生一个脉冲,则MCBSP开始接收/发送一个帧数据,当下一个帧同步脉冲产生时,就发送下一帧,依此类推。

      FSR信号用了开始DR管脚的数据传输,FSX用来开始DX管脚的数据传输。FSR和FSX信号可以来自MCBSP的边界管脚或来自MCBSP内部。

    4、检测帧同步信号,即使在reset状态中

      MCBSP可以发送传输/接收中断至CPU,用了通知CPU 自己发生了某些特定事件。为了帮助甄别帧同步信号,一些中断可以被发送用来作为帧同步脉冲的响应。将相应的中断模式位设置为10(对于接收,RINTM=10;对于发送,XINTM=10)。

      不同于其他的串口中断模式,MCBSP的中断模式在串口的相关部分处于reset状态时仍然在运行。

    5、忽略不希望遇到的帧同步脉冲

      MCBSP可以配置,用以忽略发送或接收帧同步脉冲。

      如果想识别帧同步信号,则对于接收端,设置RFIG=0;对于接收端XFIG=0。

      如果想忽略帧同步信号,则对于接收端,设置RFIG=1;对于接收端XFIG=1。

    6、帧频率

      振频率等于时钟频率除以一个帧持续的时钟周期数,如下图所示:

    最大振频率为时钟频率除以一个帧所包含的bit数,如下图:

    当帧频率为最大值时,其脉冲与数据波形的关系如下:

    示意图中使用的是1-bit的数据延时(1-bit data delay)。

    注:对于5502芯片,如果使用0bit延时的帧同步并且使用的是外部时钟,则需要一个多余的帧周期,因而最高帧频率将达不到上述的速度;如果是1-bit或2-bits延时或使用内部时钟,则不需要多余的帧周期,因而可以达到上述的帧频率。

    四、帧阶段(Frame Phases)

    MCBSP可以通过配置,让一个帧拥有不同的阶段。

    一个帧的不同阶段可以拥有不同的字的数量,每个字的bits个数也可以不同。得益于这样的时间,MCBSP的帧可以灵活的传输各种结构的数据。

    1、一帧中的阶段数、字数和bits数

    一帧中的阶段数、字数和bits数的如何有寄存器决定:

    只有一个phase的帧的传输:

    有两个phases的帧的传输


    五、MCBSP接收

    物理数据通路:

    接收数据时序图:

    下面将描述数据由DR管脚到CPU或DMA的过程:

    (1)MCBSP用FSR管脚等待帧同步信号的到来

    (2)当帧同步脉冲到来后,MCBSP插入相应的数据延迟。数据延迟的数量在RCR2寄存器的RDATDLY位中设定。

    (3)MCBSP从DR管脚接收数据,并移位至接收移位寄存器(RSR1/21)中。(如果字长小于或等于16bit,则只使用RSR1寄存器,如果大于16bits则除了RSR1外还要使用RSR2寄存器,数据的高位存在RSR2寄存器中)

    (4)当一个完整的字被完全送达后,MCBSP将RSR寄存器中的值拷贝到接收缓冲寄存器(RBR),规定RBR1不被之前的数据占满。(如果字长小于或等于16bit,则只使用RBR1寄存器,如果大于16bits则除了RBR1外还要使用RSR2寄存器,数据的高位存在RBR2寄存器中)

    (5)MCBSP将RBR中的数据拷贝到数据接收寄存器(DRR)中,规定DRR1不被之前的数据占满。当DRR1接收到新数据时,SPCR1寄存器的receiver ready bit(RRDY)将置1。这暗示着接收的数据已经准备妥当,可以被CPU或DMA控制器读取。(如果字长小于或等于16bit,则只使用DRR1寄存器,如果大于16bits则除了DRR1外还要使用DRR2寄存器,数据的高位存在DRR2寄存器中)。如果在由RBR拷贝到DRR的过程中使用了数据扩展或压缩(companding),则RBR1中的8-bit数据将扩展为DRR中左对齐的16-bit数据。如果在拷贝过程中没有使用数据扩展或压缩,则从RBR[1,2]拷贝到DRR[1,2]的数据将进行调整并按照RJUST位进行bit填充。

    (6)CPU或DMA控制器从数据接收寄存器中读取数据。当DRR1的内容被读取后,RRDY将被置0,然后下一个RBR至DRR的拷贝将开始。

    注:如果DRR1和DRR2都被使用了(即字长大于16-bit),那么CPU或DMA控制器必须先读DRR2的数据然后再读DRR1的数据。当DRR1的数据被读取后,下一个RBR至DRR的拷贝周期马上开始。如果先读DRR1的话,则DRR2中的数据将丢失。


    六、MCBSP发送

    MCBSP发送物理通路示意图:

    MCBSP发送时序图:

    MCBSP发送数据的过程如下:

    (1)CPU或DMA控制器将数据写入数据发送寄存器(DXR)中。当DXR1中载入数据时,SPCR2寄存器中的transmitter ready bit(XRDY)位被清零,用以表示发送器还未准备好新数据。如果字长超过16-bit,则除了DXR1寄存器外,还需要使用DXR2寄存器;否则,只要使用DXR1寄存器即可。

    注:如果DXR1和DXR2寄存器都被使用了,则CPU或DMA控制器在向DXR寄存器中载入数据时,需要先载入DXR2的数据,然后载入DXR1的数据。当DXR1中被载入数据时,DXR寄存器中的数据会立刻被拷贝入发送移位寄存器(XSR)中。如果DXR2没有被先载入,则先前的DXR2中的数据将被移位至XSR2中,而导致数据错误。

    (2)当新数据到达DXR1后,MCBSP将会将数据发送寄存器(DXR)中的内容拷贝入发送移位寄存器(XSR)中。另外,transmit ready bit将会被置1。由此表示接收器已经准备好从CPU和DMA控制器中接收数据。如果字长超过16-bit,则除了XSR1寄存器外,还需要使用XSR2寄存器;否则,只要使用XSR1寄存器即可。

    如果数据压缩和扩展(companding)被启用,则MCBSP将DXR1中的16-bit数据压缩为XSR1中的8位数据;如果没有被启用,则MCBSP直接将DXR中的数据传输到XSR而不做任何调整和改动。

    (3)MCBSP在FSX管脚上等待传输帧同步信号。

    (4)当帧同步脉冲到达时,MCBSP按照XCR2寄存器中的XDATDLY位所设定的数据延迟来插入数据延迟。

    (5)MCBSP将发送移位寄存器(TXR)中的数据位移位至DX管脚。


    八、MCBSP产生的中断和DMA事件

    MCBSP通过下述内部信号来通知CPU和DMA控制器:



    展开全文
  • DSP5509A: #include #include ...MCBSP_Config Mcbsp0Config = { MCBSP_SPCR1_DEFAULT, MCBSP_SPCR2_DEFAULT, /*单数据相,接受数据长度为16位,每相1个数据*/ MCBSP_RCR1_RMK( MCBSP_RCR1_
  • 具体的工作流程和工作原理已经在TMS320VC5509A通过MCBSP接口与NUC972的IIS接口进行音频传输(二)这个里面说个差不多了,只是在那片博客中没有说具体的主从模式还有代码,今天说的是DSP5509A的MCBSP作为主模式,...
  • 目前TI的TLV320AIC23B与TI的DSP的MCBSP接口进行通信比较多的方式是AIC23作为主器件,DSP作为从器件,使用DSP模式进行通信,这样在大部分应用场景还是很方便的,不过在某些场景是不合适的,特别是AIC23在使用12M时钟...
  • 最近一段时间研究了一下DSP5509A的MCBSP(多缓冲串口)接口和Nuc972的IIS接口进行音频数据传输的问题,今天终于有了点儿心得,和大家分享一下。 总体思路是基于嵌入式linux音频框架ASOC,将DSP5509A模拟成一个codec...
  • McBSP FPGA MicroBlaze DMA

    2017-10-26 14:25:52
    针对McBSP接口的实际应用,选用AIC23B音频编解码芯片做为测试设备。该芯片的控制接口做为SPI从设备与McBSP-1接口连接,而数字音频接口做为I2S主设备与McBSP-2接口连接。McBSP接口硬件平台在K7系列FPGA中采用软核SOC...
  • MCBSP总线数据收发

    2018-09-10 13:35:14
    此程序的作用是实现 McBSP 接口的数据收发功能,将 McBSP 发出去的数据直接采集回来。
  • 随着串行接口技术的不断成熟,逐步达到了以上设计要求,成为重要的接口方案。尤其在数字信号处理器方面,串行口的重要性体现得更加突出,几乎所有的数字信号处理器都提供了一个或多个串行接口,并且随着数字信号...
  • 一、DSP的串行接口技术  DSP是一种独特的微处理器,是以数字信号来处理大量信息的器件。其工作原理是接收模拟信号,转换为0或1的数字信号。再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回...
  • DSP28335的McBsp配置为SPI接口的DMA的收发配置程序,程序中完成了MCBSP配置为SPI工作模式的方式,并通过DMA完成数据收发操作
  • McBSP

    千次阅读 2016-08-03 14:03:30
    权当学习与交流使用,谨向...TMS320F28335总共有2个McBSP(多通道缓冲串口)接口。每个接口有六根引脚, 分别是: MCLKX(发送时钟引脚) MCLKR(接收时钟引脚) MFSX(发送帧同步引脚) MFSR(接收帧同
  • TMS320DM6437的性能很高,但是开发... DSP的McBSP接口可由内部时钟发生器或外部器件提供收/发时钟信号(CLKR/CLKX)及收/发帧同步信号(FSR/FSX)。EN_IN、EN_OUT为DSP控制FPGA中McBSP接口的使能信号,它们均与DSP
  • TMS320F28335学习笔记-McBSP模块

    千次阅读 2012-10-07 11:36:42
    1.McBSP接口总共有几个?每个McBSP接口有几根pin? TMS320F28335总共有两个McBSP接口。每个接口有六根pin, 分别是:MFSX, MFSR, MCLKX, MCLKR, MDX, MDR。  2.McBSP用于SPI模式时使用那些pin?他们和标准...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 599
精华内容 239
关键字:

mcbsp接口