第1章TI多核C66x DSP介绍 C66x DSP(Digital Signal Processor)是最新一代定点和浮点DSP,由4个乘法器组成,以实施单精度浮点乘法运算。C66x DSP内核可同时运行多达8项浮点乘法运算,加之高达1.4GHz的时钟频率,使其具有很高的浮点处理性能。将多个C66x DSP内核与其他内核融合,即可创建出具有出众性能的多核片上系统(SystemonChip,SoC)器件。 TMS320C6678(以下简写成C6678)处理器具有8个TMS320C66x内核,内核工作主频为1.4GHz时,理论上具有179.2GFLOP(22.4GFLOP×8)和358.4GMAC(44.8GMAC×8)的处理性能。每个处理器内部有多级存储器: C66x内核中有L1P、L1D、L2SRAM; 多核共享的有MSM SRAM(Multicore Shared Memory SRAM)。处理器具有多核导航器、网络协处理器、数据包加速器、信号量、PLL等多核共享的一些外部资源,同时提供如SRIO(Serial Rapid IO)、PCIE(PCI Express)、EMIF(External Memory Interface)等多种外部接口。 66AK2Hx处理器最多可包含4个ARM CortexA15、8个TMS320C66x高性能DSP。66AK2H14/12/06提供最高5.6GHz(1.4GHz×4)ARM和9.6GHz(1.2GHz×8)DSP处理性能。C66x DSP内核中L2 SRAM容量不同,66AK2Hx处理器L2容量为1024KB,C6678处理器L2容量为512KB。 本章主要介绍基于C66x DSP内核的DSP处理器。首先概要性地介绍了C6678和66AK2Hx处理器,随后介绍了C66x处理器内核,然后以C6678处理器为例详细介绍了锁相环、外围设备、定时器、信号量、多核导航器等相关内容,最后给出了一些设计建议。 1.1C6678处理器 本节主要介绍C6678处理器,与66AK系列不同的是,其处理内核全部由C66x内核组成。 1.1.1C6678概览 TI推出的Keystone架构的多核DSP,片内集成多个处理内核。采用多核并行处理设计可以大大提高单个处理器的综合处理性能。 C6678处理器平台具有8个TMS320C66x内核,每个内核内都有L1P、L1D和L2 SRAM存储器,多核共享的存储器为MSM SRAM。 处理器具有多核导航器、网络协处理器、数据包加速器和信号量等多核共享的一些外部资源。多核导航器具有8192个多用途硬件队列,由队列管理器负责管理。 在内核主频为1GHz的情况下,L1数据缓存和L1程序缓存通信带宽为32GB/s,L2缓存通信带宽为16GB/s,多核共享存储器通信带宽为64GB/s。DDR3在主频1333MHz的情况下带宽为10.664GB/s。各级RAM的容量分别是: L1数据缓存和L1程序缓存为32KB,L2缓存为512KB,多核共享存储器为4MB,DDR3最大支持8GB。 1.1.2外围设备 器件支持SRIO、PCIE Gen2、HyperLink、千兆以太网(Gigabit Ethernet,GbE) 等多种接口。SRIO接口支持4通道SRIO 2.1,每通道支持1.24/2.5/3.125/5G波特率传输。PCIE Gen2单个接口支持1通道或2通道,每通道最高可支持5G波特率。HyperLink接口支持与其他Keystone架构连接,最高支持50G波特率。Gigabit网络(GbE)交换子系统,支持两个SGMII接口、支持10/100/1000Mb/s操作。 64位DDR3接口支持8GB访问空间。16位EMIF接口最大支持256MB NAND FLASH和16MB NOR FLASH,最大可支持1MB异步SRAM。C6678处理器具有2个TSIP、1个UART、1个I2C(InterIntegrated Circuit)、16个GPIO(GeneralPurpose Input/Output)、1个SPI(Serial Peripheral Interconnect)接口、1个Semaphore模块、16个64b定时器、3个片上PLL。 C6678器件架构如图1.1所示。 图1.1C6678处理器架构 1.266AK处理器 66AK2Hx处理器平台基于KeyStone Ⅱ架构,最多可包含4个ARM CortexA15、8个C66x高性能DSP。与C6678不同的是,66AK是具有ARM和C66x内核的SoC器件。 66AK2H14/12/06提供最高5.6GHz(1.4GHz×4)ARM和9.6GHz (1.2GHz×8)DSP处理性能,并具有安全加速器、包加速器和网络交换功能,比多个芯片的解决方案更省电。 C66x核载处理器内包含定点和浮点计算能力,运算能力是38.4GMACS/核和192GFLOPS/核(@ 1.2GHz主频)。C66x软件100%向下兼容C64x+器件,包含90个新指令,其中FPi (Floating Point instruction)用于提升浮点运算能力、VPi (Vector math oriented Processing instruction)用于提升矢量运算能力。 66AK是基于C66x多核DSP和ARM多核处理器架构的异构多核的SoC器件。66AK器件架构如图1.2所示。 图1.266AK处理器架构 1.366AK2H14/12/06和C6678各项功能对比 66AK2H14/12/06和C6678各项功能的对比如表1.1所示。 表1.1C6678和66AK对比 硬 件 配 置66AK2H1466AK2H1266AK2H06C6678 核数 C66x DSP8个4个8个 ARM CortexA154个2个0个 外围 设备 数 10GbE2个——— DDR3存储控制器2个(72位总线宽度)1个(64位总线宽度) 16bit异步EMIF1个1个 EDMA35个(64独立通道)1个(16独立通道[内核时钟/2]) 2个(64独立通道[内核时钟/3]) SRIO 1×/2×/4×1个1个 HyperLink (4lanes)2个1个 I2C3个1个 SPI3个1个 Tsip—2个 PCIE(2lanes)1个1个 USB 3.01个— UART2个1个 10/100/1000 Ethernet4个2个 管理数据I/O(MDIO)1个1个 64位定时器(可配置)20个64位或 40个32位14个64位 或 28个32位16个64位或32个32位 GPIO32个16个 片上 存储 器组 织 L1P存储控制器(C66x)32KB每核32KB每核 L1D存储控制器(C66x)32KB每核32KB每核 L2缓存(C66x)1MB每核512KB每核 L3 ROM (C66x)128KB128KB L1P (ARM CortexA15)32KB每核— L1D (ARM CortexA15)32KB每核— L2缓存 (ARM CortexA15)4096KB— L3 ROM (ARM CortexA15)256KB— MSMC6MB4MB 频率 C66x最高可达1.2GHz最高可达1.4GHz ARM CortexA15最高可达1.4GHz 66AK系列在处理器种类、个数及性能上都有提升。66AK的工艺是0.028μm,C6678的工艺是0.040μm。 两个处理器的加速器都是一样多的,每个处理器都有一个包加速器和一个安全加速器。 1.4C66x处理器内核 C66x内核是C6678处理器的核心,用于完成高性能处理任务。 C66x内核由以下组件组成: C66x DSP、一级程序存储器控制器(L1P)、一级数据存储器控制器(L1D)、二级存储器控制(L2)、内部DMA(Internal Direct Memory Access,IDMA)、外部存储控制器(External Memory Controller,EMC)、扩展存储控制器(Extended Memory Controller,XMC)、带宽管理(BandWidth Management,BWM)、中断控制器和休眠控制器(PowerDown Controller,PDC)组成。 一级数据存储器控制器(L1D)、二级存储器控制(L2)、外部存储控制器(EMC)、扩展存储控制器(XMC)、带宽管理(BWM)在 将第4章C66x存储器组织中介绍。内部DMA(IDMA)在将第6章DMA传输中介绍。 C66x DSP是最新一代定点和浮点DSP。C66x DSP通过提高C674X指令组结构提升性能。C66x DSP内核如图1.3所示。 图1.3C66x处理器内核 每个C6678内核具有两套处理单元和两套寄存器组,结构如图1.4所示。8个功能单元( .M1、.L1、.D1、S1、M2、L2、D2、S2) 都具备每个时钟周期执行一条指令的能力。.M功能单元执行所有乘法运算; .S和.L单元执行一组通用的算术、逻辑和分支函数; .D单元主要完成从存储器加载( Load)数据到寄存器堆(Register File),并从寄存器堆保存(Store)结果到存储器。通过多套处理单元并行及各个处理模块流水并行可以大大提高处理性能。 图1.4C66x CPU数据路径 如图1.5所示的TI最新C66x内核,具有同C64x+内核相同的基本A & B结构。值得注意的是: .M单元的16位乘法器已增至每个功能单元16个,从而实现内核原始计算能力提升4倍。C66x DSP实现的突破性创新使得由4个乘法器组成的各群集可协同工作,以实施单精度浮点乘法运算。C66x DSP内核可同时运行多达8项浮点乘法运算,加之高达1.4GHz的时钟频率,使其具有很高的浮点处理性能。将多个C66x DSP内核进行完美整合,即可创建出具有出众性能的多核片上系统设备。 图1.5C66x乘法单元 尽管与浮点处理相比,DSP定点处理更快,但却不得不为特定算法在开发时间上付出代价。为使定点和浮点组件都能同时实现最佳性能,该款C66x DSP内核支持定点与浮点运算指令。 浮点指令包括: (1) 单精度复数乘法。 (2) 矢量乘法。 (3) 单精度矢量加减法。 (4) 单精度浮点整数之间的矢量变换。 (5) 支持双精度浮点算术运算(加、减、乘、除及与整数间的转换)。 最新定点指令可实现最佳的矢量信号处理,其中包括: (1) 复数矢量和矩阵乘法,诸如针对矢量的DCMPY以及针对矩阵乘法的CMATMPYR1。 (2) 实矢量乘法。 (3) 增强型点积计算。 (4) 矢量加减法。 (5) 矢量位移。 (6) 矢量比较。 (7) 矢量打包与拆包。 1.5电源休眠控制器 电源休眠控制器(PowerDown Controller,PDC)可由软件驱动,对所有内核组件进行休眠管理。DSP可以休眠全部或部分C66x内核。本节介绍C66x内核电源休眠管理及其特征。 1.5.1C66x内核电源休眠管理介绍 C66x内核支持关掉C66x内核的部分功能模块或休眠整个内核。设计师可以结合这些特征设计系统,以降低系统电源需求。 表1.2列出了C66x内核可用的电源休眠特征以及如何/何时应用的概要描述。 表1.2C66x内核电源休眠特征 电源休眠特征如何/何时应用 L1P存储器当SPLOOP指令执行时 L2存储器保留直到访问(Retention Until Access,RTA),存储器提供基于页的动态唤醒 Cache控制硬件当Cache被禁用时 DSP在发出IDLE指令时 整个C66x内核通过PDC和IDLE使能 1.5.2电源休眠管理特征 1. L1P存储器 当内核从SPLOOP缓冲执行指令时,L1P存储器动态地休眠。该特征是动态使能的,并对用户透明。在完成了SPLOOP指令后,当DSP重新从L1P存储器取数时,L1P存储器被唤醒。换句话说,当L1P没有被访问时,L1P休眠。 注意: 当整个内核电源休眠时,L1P也被休眠。 2. L2存储器 C66x内核不支持用户控制的L2动态电源休眠。对于Keystone器件,L2是保留直到访问 的存储器类型,只有被访问时才唤醒对应的一个块,访问结束后又把那个块重新置回低泄漏模式。L2存储器 以基于页的唤醒方式进行动态休眠,其自身自动处理休眠管理功能。 注意: 当整个内核电源休眠时,L2存储器也被休眠。 3. Cache电源休眠模式 当L1D、L1P或L2 Cache没有使能时,它们保持休眠模式。 注意: 当整个内核电源休眠时,三个Cache控制器被休眠。 4. DSP电源休眠 DSP可以通过执行一个IDLE指令进行休眠,也可以被中断唤醒。 5. C66x内核电源休眠 C66x内核电源休眠通常被称为静态休眠,这种模式通常需要较长的时间; 而用在较短时间的场合,称为动态休眠。 C66x内核电源休眠完全通过软件控制,通过对C66x内核电源休眠指令控制寄存器(PDCCMD)中的(MEGPD)位编程设置,用户可以实施控制。在C66x内核电源休眠中,需要按照以下顺序进行: (1) 设置电源休眠指令控制寄存器(PDCCMD)的MEGPD位为1,使能电源休眠。 (2) 使能用户想唤醒的C66x内核的DSP中断,禁止所有其他中断。 (3) 执行IDLE指令。 内核电源休眠时,C66x内核保持休眠状态,直到被步骤(2)使能的中断唤醒。 注意: 当C66x内核休眠时,如果出现一个到L1D、L1P或L2存储器的DMA访问,PDC唤醒所有存储 控制器; 当DMA访问完成后,PDC会重新休眠所有存储控制器。 1.6锁相环及其设置 锁相环(Phase Locked Loop,PLL)是处理器的时钟源,控制着C6678处理器中C66x内核、各外围设备的时钟。 1.6.1主PLL和PLL控制器 主PLL由标准PLL控制器控制。PLL控制器负责管理处理器系统时钟的时钟比、对准和选通功能。如图1.6所示为主PLL和PLL控制器的功能框图。 图1.6主PLL和PLL控制器 注意: 主PLL控制寄存器可以被器件中的任何主设备访问。倍频器的PLLM[5:0]位被PLL控制器中的PLLM寄存器控制,PLLM[12:6]位被器件级MAINPLLCTL0寄存器控制。输出除数和PLL旁路(Bypass)逻辑被SECCTL寄存器相应的域控制。在C6678器件里,只有PLLDIV2、PLLDIV5和PLLDIV8是可编程的。 主PLL用于驱动内核、交叉开关网络(Switch Fabric)和大多数外围设备的时钟(除了DDR3和网络协处理器(PASS))。主PLL的PLL控制器管理不同的时钟分频器、对准和同步。 主PLL的PLL控制器具有一些SYSCLK输出,每个SYSCLK具有一个相应的分频器对PLL输出的时钟分频。 注意: 除了在下面描述中明确提到可编程的SYSCLK外,其他时钟分频器不是可编程的。 SYSCLK1: 用于内核的全比例时钟。 SYSCLK2: 1/x比例时钟,用于内核(仿真)。默认的比例是1/3,这是可编程的,范围从/1到/32,该时钟最大不能超过350MHz。SYSCLK2可以被软件关掉。 SYSCLK3: 1/2比例时钟,用于MSMC时钟、HyperLink、CPU/2 SCR、DDR EMIF和CPU/2 EDMA。 SYSCLK4: 1/3比例时钟,用于交叉开关网络和高速外围设备。Debug_SS和ETBs也会使用这个时钟。 SYSCLK5: 1/y比例时钟,只用于系统追踪(System Trace)模块。默认比例是1/5,可以被配置,最大配置时钟是210MHz、最小配置时钟是32MHz。SYSCLK5可以被软件关掉。 SYSCLK6: 1/64比例时钟(emif_ptv),被用于驱动DDR3 EMIF PVT补偿缓冲。 SYSCLK7: 1/6比例时钟,用于慢速外围设备和资源的系统输出引脚。 SYSCLK8: 1/z比例时钟,该时钟被用作系统中的慢速系统时钟,默认的比例是1/64,可以被编程设置为/24~/80。 SYSCLK9: 1/12比例时钟,用于SmartReflex。 SYSCLK10: 1/3比例时钟,只用于SRIO。 SYSCLK11: 1/6比例时钟,只用于PSC。 主PLL用两个芯片级寄存器——主PLL控制寄存器0(MAINPLLCTL0)和主PLL控制寄存器1(MAINPLLCTL1)来实现配置。MAINPLLCTL0的组成结构如图1.7所示,寄存器说明见表1.3; MAINPLLCTL1 的组成结构如图1.8所示,寄存器说明见表1.4。 图1.7MAINPLLCTL0的组成结构 RW: 读和写; W: 只写; R: 只读; n: 表示复位后的值(下同)。 表1.3MAINPLLCTL0说明 位域描述 31~24BWADJ[7:0]BWADJ[11:8]和BWADJ[7:0]分别位于MAINPLLCTL0和MAINPLLCTL1寄存器,寄存器组合(BWADJ[11:0])必须被配置一个值 23~19Reserved保留 18~12PLLM[12:6]一个13位总线,用于选择倍频因子(此为高位部分) 11~6Reserved保留 5~0PLLD一个6位总线,用于选择分频因子 图1.8MAINPLLCTL1的组成结构 表1.4MAINPLLCTL1说明 位域描述 31~7Reserved保留 6ENSAT需要被设置为1,用于正确操作PLL 5~4Reserved保留 3~0BWADJ[11:8]BWADJ[11:8]和BWADJ[7:0]分别位于MAINPLLCTL0和MAINPLLCTL1寄存器。寄存器组合(BWADJ[11:0])必须被设置等于PLLM[12:0]值的一半,如果PLLM是一个奇数则向下取整,如PLLM=15,那么BWADJ=7 注意: 当PLL控制器中GO操作被发起时,MAINPLLCTL0寄存器PLLM[12:6]位必须被先写,然后写控制器的PLLM寄存器PLLM[5:0]位,以获得完整的13位寄存器值的锁存。详细信息参考Phase Locked Loop (PLL) Controller for KeyStone Devices User Guide。PLL二级控制寄存器 (SECCTL)如图1.9所示,寄存器说明见表1.5。 图1.9PLL二级控制寄存器 表1.5PLL二级控制寄存器说明 位域描述 31~24Reserved保留 23BYPASS主PLL旁路使能: 0=主PLL旁路禁止; 1=主PLL旁路使能 22~19OUTPUT DIVIDE输出分频比例: 0h=÷1,分频比例为1; 1h=÷2,分频比例为2; 2hFh= Reserved 18~0Reserved保留 其他相关寄存器详见相关手册。 1.6.2DDR3 PLL DDR3 PLL为DDR3存储控制器产生的接口时钟。当上电复位后,在加载配置期间、使能和使用之前,DDR3 PLL被程序设置为一个有效的频率。如图1.10所示为DDR3 PLL功能结构图。 图1.10DDR3 PLL功能结构图 1. DDR3 PLL控制寄存器 DDR3 PLL被用于驱动DDR PHY EMIF,没有使用PLL控制器。通过使用Bootcfg模块中的DDR3PLLCTL0和DDR3PLLCTL1寄存器,可以控制DDR3 PLL。这些存储器映射寄存器(MemoryMapped Registers,MMRs)存在于Bootcfg空间内部。为了写这些寄存器,软件必须使用KICK0/KICK1寄存器完成一个解锁流程。如图1.11所示为DDR3 PLL控制寄存器0(DDR3PLLCTL0)的组成结构图,表1.6为其说明。 图1.11DDR3PLLCTL0的组成结构 表1.6DDR3PLLCTL0说明 位域描述 31~24BWADJ [7:0]BWADJ[11:8]和BWADJ[7:0]分别位于DDR3PLLCTL0和DDR3PLLCTL1寄存器。寄存器组合(BWADJ[11:0])必须被程序设定为等于PLLM[12:0]值的一半(如果PLLM是一个奇数则向下取整),例如PLLM=15,那么BWADJ=7 23BYPASS使能旁路模式: 0=旁路禁止; 1=旁路使能 22~19Reserved保留 18~6PLLM一个13位总线,用于选择倍频因子 5~0PLLD一个6位总线,用于选择分频因子 如图1.12所示为DDR3 PLL控制寄存器1(DDR3PLLCTL1)的组成结构图,表1.7为 其说明。 图1.12DDR3PLLCTL1的组成结构 表1.7DDR3PLLCTL1说明 位域描述 31~14Reserved保留 13PLLRSTPLL复位位: 0 = PLL复位被释放; 1 = PLL复位被确认 12~7Reserved保留 6ENSAT需要被设置为1,用于正确操作PLL 5~4Reserved保留 3~0BWADJ [11:8]BWADJ[11:8]和BWADJ[7:0]被分配在DDR3PLLCTL0和DDR3PLLCTL1。寄存器组合(BWADJ[11:0])必须被程序设定为等于PLLM[12:0]值的一半(如果PLLM是一个奇数则向下取整),如PLLM=15,那么BWADJ=7 2. DDR3 PLL器件特定信息 如图1.10所示,DDR3 PLL(PLLOUT)的输出被二分频并直接接到DDR3存储控制器。 DDR3 PLL在上电复位时失锁,当RESETSTAT引脚拉高时被锁定,在任何其他复位时都不会失锁。 主PLL和PLL控制器必须总是在DDR3 PLL之前被初始化,必须遵照如下顺序初始化DDR3 PLL: (1) 在寄存器DDR3PLLCTL1中,写ENSAT = 1(用于最佳的PLL操作)。 (2) 在寄存器DDR3PLLCTL0中,写BYPASS = 1(设置PLL旁路)。 (3) 在寄存器DDR3PLLCTL1中,写PLLRST = 1(PLL被复位)。 (4) 程序设置DDR3PLLCTL0寄存器中的PLLM和PLLD。 (5) 程序设置DDR3PLLCTL0中的BWADJ[7:0]和DDR3PLLCTL1寄存器中的BWADJ[11:8]。BWADJ值必须被设置为((PLLM + 1) >> 1) - 1。 (6) 基于参考时钟,至少等待5μs (PLL复位时间)。 (7) 在寄存器DDR3PLLCTL1中,写PLLRST = 0 (PLL复位被释放)。 (8) 至少等待500×REFCLK周期×(PLLD + 1) (PLL锁定时间)。 (9) 在寄存器DDR3PLLCTL0中,写BYPASS = 0 (切换到PLL模式)。 注意: 对于PLL中的任何寄存器,软件必须总是按照“读修改写”的顺序执行。这是为了确保只有相关的寄存器位被修改,剩下的位(包括保留位)不会被影响。 1.6.3PASS PLL PASS PLL产生网络协处理器的时钟接口。通过使用PACLKSEL引脚,用户可以选择PASS PLL输入源,从CORECLK输出时钟参考源或PASSCLK参考源中选择一个作为输入。在上电复位时,PASS PLL为旁路模式(BYPASS Mode),在使能和使用前需要被重新设置到一个有效频率。PASS PLL的示意图如图1.13所示。 图1.13PASS PLL示意图 1.7C6678处理器接口通信相关外围设备 C6678具有丰富的外围设备,可以协助处理器内核完成很多功能,如高速通信接口(HyperLink、SRIO、PCIE等)、低速接口(I2C、UART等)、通用目的输入输出(GeneralPurpose Input/Output,GPIO)等。本节介绍C6678处理器中与接口通信相关的外围设备。 1.7.1I2C外围设备 TMS320C6678器件包含一个 I2C(Inter Integrated Circuit)外围设备模块,并提供一个DSP与其他器件用I2C连接的接口。该接口遵从飞利浦半导体I2C bus规范(版本2.1),外部部件可以通过2线串行总线与DSP连接,实现最多8位数据的收发。 注意: 当使用I2C模块时,应确保在SDA和SCL引脚上有外部上拉电阻。 I2C模块可以被DSP用来控制本地外围器件(DAC、ADC等),与一个系统中其他控制器通信,或用来实现一个用户接口。通常,I2C在系统中也用于健康管理。I2C模块结构图如图1.14所示,接口简单、通用性好。 图1.14I2C模块组成框图 I2C模块具有以下特点。 (1) 符合飞利浦半导体I2C总线规范(2.1版)。 ① 支持字节格式传输。 ② 7位和10位寻址模式。 ③ 通用广播(General Call),当发出[0000000]的地址信息后,所有I2C上的从设备(Slave)都要对此做出反应,该机制适合用在主设备(Master)要对所有的从设备进行广播性讯息更新与沟通的场合,是一种总体、批次的运作方式。 ④ START字节模式。 ⑤ 支持多个主发送(MasterTransmitter)和从接收模式(SlaveReceiver)。 ⑥ 支持多个从发送(SlaveTransmitter)和主接收(MasterReceiver)模式。 ⑦ 主发送/接收和接收/发送模式结合。 ⑧ I2C数据传输速率从10kb/s到400kb/s。 (2) 2~7位格式传输。 (3) 自由数据格式(Free Data Format,FDF)模式,在FDF数据格式中,START条件后最初的一些位是数据字(Data Word)。在每个数据字之后插入一个ACK位,根据ICMDR(I2C Mode Register)的位计数(Bit Count,BC)位,数据字可以是1~8位。不发送地址或数据方向位。因此,发送者和接收者都必须支持FDF数据格式,并且在整个传输过程中数据的方向必须是恒定的。 (4) 一个读DMA事件和一个写DMA事件,事件可由DMA使用。 (5) 7个CPU可以使用的中断。 I2C模块由以下主要模块组成。 (1) 串行接口: 一个数据引脚(SDA)和一个时钟引脚(SCL)。 (2) 数据寄存器: 在SDA引脚与CPU或EDMA控制器之间传输的数据,数据寄存器用于临时保存接收和发送的数据。 (3) 控制和状态寄存器。 (4) EDMA总线接口,使CPU和EDMA控制器能够访问I2C模块寄存器。 (5) 时钟同步器,同步I2C输入时钟(来自时钟发生器(Clock Generator))和SCL引脚上的时钟,并与不同时钟速度的主机同步数据传输。 (6) 一个预分频器(Prescaler),用于划分驱动至I2C模块的输入时钟。 (7) SDA和SCL两个引脚上各有一个噪声滤波器。 (8) 处理I2C模块(当它是主模块时)和另一个主模块之间仲裁的仲裁器。 (9) 中断生成逻辑,以便中断可以发送到CPU。 (10) EDMA事件生成逻辑,以便EDMA控制器中的行为可以与I2C模块中的数据接收和数据传输同步。 I2C外围设备的寄存器如表1.8所示。CPU或EDMA控制器将数据写入ICDXR(I2C Data Transmit Register),并从ICDRR(I2C Data Receive Register)读取接收到的数据。当I2C模块被配置为发送时,写入ICDXR的数据被复制到ICXSR(I2C Transmit Shift Register),并在SDA引脚上一次移位一位。当 I2C模块被配置为接收器时,接收的数据被转移到ICRSR(I2C Receive Shift Register)中,然后被复制到ICDRR中。 表1.8I2C外围设备的寄存器 Hex地址寄存器说明 0253 0000ICOARI2C自己的地址寄存器(Own Address Register) 0253 0004ICIMRI2C中断屏蔽/状态寄存器(Interrupt Mask/Status Register) 0253 0008ICSTRI2C中断状态寄存器(Interrupt Status Register) 0253 000CICCLKLI2C时钟低(low)分时器寄存器(Clock LowTime Divider Register) 0253 0010ICCLKHI2C时钟高(high)分时器寄存器(Clock HighTime Divider Register) 0253 0014ICCNTI2C数据计数寄存器(Data Count Register) 0253 0018ICDRRI2C数据接收寄存器(Data Receive Register) 0253 001CICSARI2C从地址寄存器(Slave Address Register) 0253 0020ICDXRI2C数据发送寄存器(Data Transmit Register) 0253 0024ICMDRI2C模式寄存器(Mode Register) 0253 0028ICIVRI2C中断向量寄存器(Interrupt Vector Register) 0253 002CICEMDRI2C扩展模式寄存器(Extended Mode Register) 0253 0030ICPSCI2C预分频器寄存器(Prescaler Register) 0253 0034ICPID1I2C外围识别寄存器1(Peripheral Identification Register) [值: 0x0000 0105] 0253 0038ICPID2I2C外围识别寄存器2[值: 0x0000 0005] 0253 003C 0253 007FReserved保留 I2C总线是支持多主模式的多主总线。 这允许多个设备能够连接到I2C总线,并能控制该总线。每个I2C设备由一个唯一的地址识别,并且可以根据设备的功能作为发送器或接收器工作。除了作为发送器或接收器外,连接到I2C总线的设备在执行数据传输时也可以被视为主设备或从设备。 请注意,主设备是在总线上启动数据传输并生成时钟信号以允许该传输的设备。在这个传输过程中,由该主机寻址的任何设备都被认为是从机。图1.15为多个I2C模块连接的示例,用于从一个设备到其他设备的双向传输。 图1.15多个I2C模块连接图 I2C的更详细信息见KeyStone Architecture InterIC Control Bus(I2C)User Guide。 1.7.2SPI外围设备 SPI模块提供一个DSP和其他兼容SPI器件的接口,该接口的主要功能是连接SPI ROM用于引导(Boot),也可以连接其他芯片级组件(如温度传感或I/O扩展)。C6678 SPI模块只支持主模式。 SPI是一个高速同步串行输入/输出端口,允许的串行比特流可设置长度为 2~16位,以可设置的比特传输率移入和移出器件。SPI通常用于器件和外部外设之间的通信。典型的应用包括诸如移位寄存器、显示驱动器、SPI EPROM和模数转换器等设备与外部I/O或外围扩展的接口。C6678 SPI支持3pin和4pin两种模式。对于4pin芯片选择模式,C6678最多支持两个芯片选择。 SPI具有以下功能。 (1) 16位移位寄存器。 (2) 16位接收缓冲寄存器(SPIBUF)和16位SPI仿真寄存器(SPI Emulation Register,SPIEML)。 (3) 16位传输数据寄存器(SPIDAT0)和16位传输数据和格式选择寄存器(SPIDAT1)。 (4) 8位波特时钟发生器。 (5) 串行时钟(SPICLK)I/O引脚。 (6) 从输入、主输出(SPISIMO)I/O引脚。 (7) 从输出、主输入(SPISOMI)I/O引脚。 (8) 多个从芯片选择(SPISCS[n])I/O引脚(仅4pin模式)。 (9) 可编程SPI时钟频率范围。 (10) 可编程字符长度(2~16位)。 (11) 可编程时钟相位(延迟或无延迟)。 (12) 可编程时钟极性(高或低)。 (13) 中断能力。 (14) 支持DMA(读/写同步事件)。 (15) 高达66MHz的工作频率。 SPI允许软件对以下选项进行编程。 (1) SPICLK频率(SPI模块Clock/2至SPI模块Clock/256)。 (2) 3pin和4pin选项。 (3) 字符长度(2~16位)和移位方向(MSB/LSB优先)。 (4) 时钟相位(延迟或无延迟)和极性(高或低)。 (5) 主模式下传输之间的延迟。 (6) 主模式下芯片选择建立和保持时间(Chip Select Setup and Hold Time)。 (7) 主模式下芯片选择保持(Chip Select Hold)。 SPI不支持以下功能。 (1) 多缓冲区模式。 (2) 并行模式或奇偶校验。 (3) SPIENA Pin。 (4) SPI从机模式。 (5) GPIO模式。 SPI功能框图如图1.16所示。 图1.16SPI功能框图 注: (A) 指示由SPI寄存器位控制的记录。(B) 实线表示SPI主模式的数据流。 SPI引脚的描述如表1.9所示。 表1.9SPI引脚描述 引脚输入输出类型功能 SPISIMO输出主模式串行数据输出 SPISOMI输入主模式下的串行数据输入 SPICLK输出主模式下的串行时钟输出 SPISCS[n] 输出主模式下从端芯片选择输出 SPI工作在主模式。SPI总线主设备是驱动SPICLK、 SPISIMO和可选的 SPISCS[n]信号的设备,因而启动SPI总线传输。SPI全局控制寄存器1(SPIGCR1)中的CLKMOD和MASTER位选择主模式。在主模式下,SPI支持如下两个选项。 (1) 3pin选项; (2) 4pin带芯片选择选项。 3pin选项是基本的时钟、数据输入和数据输出SPI接口,并使用SPICLK、SPISIMO和SPISOMI引脚。3pin SPI连接关系图见图1.17。SPI总线主模式是驱动SPICLK信号并启动SPI总线传输的设备。在SPI主模式下,SPISOMI引脚输出缓冲区处于高阻抗状态,SPICLK和SPISIMO引脚输出缓冲区已启用。 图1.173pin SPI连接关系图 在带有3pin选项的主模式下,DSP将发送数据写入SPI发送数据寄存器(SPIDAT0[15 :0] 或SPIDAT1[15:0])。这将启动传输,一系列时钟脉冲将在SPICLK引脚上驱动出来。SPICLK引脚上的每个时钟脉冲都会导致 主SPI设备和从SPI设备同时传输一个位(在两个方向)。CPU写入SPIDAT1中的配置位(不是写入SPIDAT1[15:0])不会导致新的传输。当选定的位数被发送时,接收的数据被传输到SPI接收缓冲寄存器(SPIBUF)以便CPU读取。数据以SPIBUF格式右对齐存储。 4pin带芯片选择选项,添加用于支持单个SPI总线上多个SPI从设备的 SPISCS[n]引脚。4pin SPI连接关系图见图1.18。 SPISCS[n]应通过配置SPI引脚控制寄存器0(SPI Pin Control Register 0,SPIPC0)将 引脚配置为功能引脚。在SPI主模式下,SPISOMI引脚输出缓冲区处于高阻抗状态,SPICLK、SPISIMO和SPISCS[n]引脚输出缓冲区已启用。 图1.184pin SPI连接关系 在主模式下, SPISCS[n]引脚用作输出,并在选择特定从设备时切换。然而,这在支持多个 SPISCS[n]引脚的设备上最有用。SPI只支持一个 SPISCS[n],因此该引脚在主模式下的用处有限。在实际应用中,需要通用的I/O(GPIO)引脚来支持多个从设备芯片的选择。 SPI寄存器的逻辑地址范围为0x20BF0000~0x20BF01FF,SPI寄存器的描述如表1.10所示。 表1.10SPI寄存器的描述 偏移地址寄存器描述 0hSPIGCR0全局控制寄存器0(Global Control Register 0): 包含模块的软件复位位 4hSPIGCR1全局控制寄存器1(Global Control Register 1): 控制模块的基本配置 8hSPIINT0中断寄存器(Interrupt Register): Interrupts、Error、DMA和其他功能的使能位 ChSPILVL级别寄存器(Level Register): SPI中断级别在此寄存器中设置 10hSPIFLG标志寄存器(Flag Register): 描述操作期间多个事件的状态 14hSPIPC0引脚控制寄存器0(Pin Control Register 0): 确定引脚是否作为通用I/O或SPI功能引脚运行 38hSPIDAT0发送数据寄存器0(Transmit Data Register 0) 3ChSPIDAT1 发送数据寄存器1(Transmit Data Register 1): 具有格式选择的发送数据寄存器 40hSPIBUF接收缓冲寄存器(Receive Buffer Register): 保留接收的字 44hSPIEMU 接收缓冲区仿真(Receive Buffer Emulation): SPIBUF的镜像,读取不清除标志寄存器 48hSPIDELAY Delay Register: 设置SPISCS[n]模式, SPISCS[n]传输前/传输后延迟时间 4ChSPIDEF 芯片选择默认寄存器(Chip Select Default Register): 仅在 SPISCS[n]解码模式下设置 SPISCS[n]信号高/低有效 50hSPIFMT0Format 0 Register: 数据字Format 0的配置 54hSPIFMT1Format 1 Register: 数据字Format 1的配置 58hSPIFMT2Format 2 Register: 数据字Format 2的配置 5ChSPIFMT3Format 3 Register: 数据字Format 3的配置 60hINTVEC0中断向量寄存器0(Interrupt Vector Register 0): INT0的中断向量 64hINTVEC1中断向量寄存器1(Interrupt Vector Register 1): INT1的中断向量 SPI的更详细信息见KeyStone Architecture Serial Peripheral Interface (SPI) User Guide。 1.7.3HyperLink 外围设备 C6678包含HyperLink总线用于芯片接口,这是一个4线(Lane)SerDes接口,最高通信速率为每线12.5 Gb/s,支持的数据率包括 1.25Gb/s、3.125Gb/s、6.25Gb/s、10Gb/s和12.5Gb/s。 注意: HyperLink必须用直流耦合器连接,详见KeyStone Architecture HyperLink User Guide。 HyperLink提供了一个高速、低延迟和引脚数少的通信接口,扩展了两个KeyStone器件之间内部基于CBA 3.x(Common Bus Architecture)的事务。它可以模拟当前使用的所