ADSP21479 寄存器解读

以下所有对寄存器的描述均来自于《ADSP-214xx SHARC Processor Hardware Reference》,后简称《HWR》。

本笔记主要是针对芯片 ADSP21479 寄存器(PLL、SDRAM、SRU、中断等)进行总结和记录。

[TOC]

Register Preview

位类型和操作

许多寄存器旁边都会标注位类型和操作方法,位类型包括 可读可写(RW)、只读(RO)、只读清除(ROC)、只写清除(WOC)、可读可写1清除(RW1C)、 可读可写1设置(RW1S)。

image-20210528134312811

注意不要尝试去写入这些 reversed位 ,读取的值就会使这些位上的值进行更新或者复位。

image-20210528134457084

头文件-外围设备及寄存器宏定义

<def21479.h> 是关于 外围设备(peripherals)和 寄存器(registers)的子集。

<cdef21479.h> 包含了对IOP寄存器的宏定义,对C/C++可用。所有定义均和 <def21479.h> 一致,除了以 p 作为前缀的宏定义 和 (relevant casts)以外,它们的用法如 *pSYSTAT = 0x12345678;

《HWR》仅有第99页中提及了这两份文件。

image-20210602171608976

DEF21479.H

  • 外部接口IOP寄存器(IOP registers for External Port)、SDRAM控制寄存器、AMI寄存器、DMA地址寄存器、SPORT(SP0~SP7)(包含串行接口寄存器、多通道发送接收(Multichannel tx/rx)、SPORT计数寄存器、错误中断控制寄存器、控制寄存器、多通道选择(Multichannel select))、SPI和SPIB寄存器、定时器寄存器、POWER MGT寄存器、外围设备中断优先级控制寄存器(Peripheral interrupt priority control register)、DAI寄存器(DAI参数寄存器、边缘中断锁存寄存器、中断优先级寄存器、(shadow)高/低优先级中断锁存寄存器、DAI状态寄存器、DAI针脚缓存状态寄存器、)、SRU寄存器(包括SRU时钟控制寄存器、数据控制寄存器、FS控制寄存器、针脚控制寄存器、外部Misc.A/B控制寄存器、针脚使能寄存器、shift寄存器的时钟控制和数据控制)、精度时钟控制寄存器(Precision Clock A/B Control Register 0/1)(包括脉冲宽度控制、幅度同步、脉冲宽度控制)、MTM寄存器、PWM寄存器、UART寄存器、TWI寄存器、FIR加速寄存器、IIR加速寄存器、FFT加速寄存器、MLB设备寄存器、WDT寄存器、Shift寄存器、RTC寄存器。

  • DPI、DTCP模块


  • 系统寄存器位定义(MODE1和MMASK寄存器、MODE2寄存器、ASTAT、STKYx和STKYy寄存器、IRPTL寄存器、IMASK寄存器、IMASKP寄存器、LIRPTL寄存器、FLAGS寄存器)

  • IOP控制/状态寄存器位定义(EEMUSTAT寄存器、RUNRSTCTL寄存器、SYSCTL寄存器、BRKCTL寄存器、REVPID、SDCTL寄存器位、SDRRC(SDRAM刷新速率控制)寄存器、SDSTAT(SDRAM状态)寄存器、SDSTAT(SDRAM状态)寄存器2、EPCTL寄存器位)

  • AMICTL寄存器位(DMAC寄存器控制位、SPICTL寄存器、SPISTAT寄存器、SPCTL(0~5、N0~N7)寄存器、GP计时器状态寄存器、GP计时器控制寄存器、电源管理控制寄存器、外部时钟管理控制寄存器、DAI中断锁存寄存器、IDP控制寄存器、IDP PDAP控制寄存器、DAI针脚缓存状态寄存器(0~19)、DAI状态寄存器、DPI针脚缓存状态寄存器(0~13)、DPI中断锁存寄存器)

  • 精度时钟控制寄存器(A0、A1、B0、B1、C0、C1、D0、D1)、精度时钟脉冲宽度控制寄存器、精度时钟幅度同步、精度时钟脉冲宽度控制寄存器

  • 优先级中断控制(Priority Interrupt Control)寄存器(可编程中断(Programmable Interrupt)寄存器位)

  • PWM全局控制寄存器、PWM全局状态寄存器、PWM控制寄存器、PWM状态寄存器、PWM输出禁用、PWM调试状态、PWM极性选择寄存器(Polarity Select Register)

  • TWI寄存器、主设备内部时钟寄存器(TWIMITR)、TWI从设备控制寄存器(TWISCTL)、TWI从设备状态寄存器(TWISSTAT)、TWI主设备控制寄存器(TWIMCTL)、TWI主设备状态寄存器(TWIMSTAT)、TWI中断控制寄存器(TWIIMASK/TWIIRPTL)、TWI先进先出控制寄存器(TWIFIFOCTL)、TWI先进先出状态寄存器(TWIFIFOSTAT)

  • UART寄存器、UARTIIR、UARTLCR、UARTMODE、UARTLSR、UARTTXCTL/RXCTL、UARTTXSTAT/RXSTAT

  • SPDIF传输寄存器、SPDIF通道状态寄存器、SPDIF用户位状态寄存器、SPDIF接收器寄存器、SPDIF传输控制寄存器、SPDIF TX输入数据格式、SPDIF接收控制寄存器、SPDIF接收状态(只读)

  • 采样率转换控制寄存器(0~3)、输入数据格式、输出数据格式、SRC频应复元(Deemphasis)设置、彩艳率转换率(0~3)、采样率转换静音(MUTE)寄存器(SRCMUTE)

  • FIR加速器、IIR加速器、FFT加速器

  • MLB位定义(DCCR/SSCR/SMCR/IBCR/CECR/CSCR)、WDT寄存器位定义、Shift寄存器位定义、RTC寄存器位定义(控制、初始化、状态、初始化状态)

CDEF21479.H

  • 仿真、断点寄存器
  • 外部接口的IOP寄存器
  • SDRAM控制寄存器
  • AMI的IOP寄存器
  • DAM地址寄存器
  • SPORT(0~7)(串行接口寄存器、MT/MR寄存器、TDM寄存器、)
  • SPI寄存器、SPIB寄存器(通过DAI进行路由)
  • 计时器寄存器
  • 电源管理寄存器
  • 外围中断优先级控制寄存器
  • DAI寄存器(DMA参数寄存器、SRU寄存器、采样率转换寄存器)
  • DPI寄存器
  • DTCP模块
  • SPDIF传输寄存器(通道状态缓存、用户位缓存、SPDIF接收寄存器)
  • PCG精度时钟控制寄存器
  • MTM(Memory to Memory)寄存器
  • PWM脉冲调制寄存器
  • UART寄存器
  • TWI寄存器
  • FIR加速寄存器
  • IIR加速寄存器
  • FFT加速寄存器
  • MLB设备寄存器
  • WDT寄存器
  • Shift寄存器
  • RTC寄存器

在《HWR》“自己眼”中,可能自己就这么点儿寄存器。

image-20210528140017190

Reset Register

RUNRSTCTL,运行中复位控制寄存器(Running Reset Control Register)。

表A-5 RUNRSTCTL寄存器位功能描述

image-20210527170816951

可编程中断优先级控制寄存器

  • supports 19 programmable prioritized interrupts

  • 任何外部中断输出都可能被连接至任何可编程优先级中断输入。

表A-6 默认中断路由

image-20210527171119962
image-20210527171204914
image-20210527171219793

目标信号控制寄存器

本寄存器控制了:

  • programmable priority interrupts

  • default interrupt sources

image-20210527171809869

图 A-4 PICR0 寄存器

image-20210527171824344

图 A-5 PICR1 寄存器

image-20210527171841316

图 A-6 PICR2 寄存器

image-20210527171852287

图 A-7 PICR3 寄存器

TWI IN MASTER-TX

Peripherals with Multiple Interrupt Request Signals

TWI和UART有分离的中断输出。两者都默认连接至P14I(DPI)。然而,两者都允许分离连接至默认不路由的PICR,反而提供了更多可通过DAI/DPI中断优先级更改的混合模型。

The TWI and the UART have separate interrupt outputs. Both peripherals are already connected via the P14I (DPI) by default. However both peripherals allow separate connectivity into the PICR that are not routed by default. This provides more flexibility for priority change across the DAI/DPI interrupts.

TWI Register

《HWR》第1193页起定义了TWI的寄存器。第1244页同样给了TWI相关的寄存器一个列表。

image-20210528140209933

<cdef21479.h> 对TWI相关的寄存器定义如下,p为前缀的定义是该寄存器的地址位,通过与<def21479.h> 的定义进行 运算并赋值给对应的寄存器地址进行控制,如 *pTWIMITR = (0x14) | TWIEN;

TWI中所有的Status相关寄存器都是 “只读” 状态,其《位描述》表上都有一个 RO 标志。

image-20210527095053483

在VisualDSP++这款IDE中,也可以通过 直接观察到所有TWI的寄存器值。

image-20210607103816755 image-20210607103747655

TWIMITR

TWIMITR(Master Internal Time Register),即主机内部时间寄存器(如图A-143所示,并在表A-129中描述)。

  • 用于启用TWI模块,以及建立外围时钟(PCLK)和TWI控制器内部定时事件之间的关系。
    • 内部时间参考是从PCLK得出的,使用的是预标定值。PRESCALE = fPCLK / 10 MHz

The internal time reference is derived from PCLK using the prescaled value shown below.

PRESCALE = fPCLK/10 MHz

image-20210525133555377

图 A-143 TWIMITR 寄存器

表A-129 寄存器位功能描述

BITS NAME DESCRIPTION
6-0 PRESCALE 预分频
用于生成一个内部时间参考的外围时钟(PCLK)周期数。
必须设置PRESCALE的值,以创建一个周期为10MHz的内部时间参考。这表示为一个7位的二进制值。
7 TWIEN TWI使能
该位必须设置为从属或主模式操作。
建议在初始化PRESCALE时设置该位,并保持设置,以确保总线繁忙检测逻辑的精确运行。
- 0 = 禁用TWI
- 1 = 启用TWI主、从模式操作。如果该位从高电平过渡到低电平,缓冲器将被刷新,需要2个时钟周期。

TWIDIV

在主模式运行期间,跟SCL相关的TWIDIV(Clock Divider Register),即时钟分频器寄存器(如图A-144所示,并在表A-130中描述)。

  • 被用来创建串行时钟(SCL)的 持续时间。
  • 串行时钟的频率可以从400KHz到小于20KHz不等。产生的时钟分辨率为1/10 MHz或100 ns。

image-20210525134728762

图 A-144 TWIDIV 寄存器

表A-130 TWIDIV 寄存器位功能描述

BITS NAME DESCRIPTION
7-0 CLKLOW 时钟低电平
该时间映射了串行时间低电平的周期。
以8位二进制数表示。
15-8 CLKHI 时钟高电平
该时间映射了串行时钟在等到一个新时钟低电平到来之前的持续时间。
以8位二进制数表示。

TWIMCTL

TWIMCTL(Master Control Register),即TWI主机控制寄存器。

  • 控制了控制与主机模式操作相关的逻辑。
  • 该寄存器内的操作不会影响到从寄设备的操作;且不应该被修改以控制从属模式的功能。

The TWI master mode control register controls the logic associated with master mode operation.

Bits in this register do not affect slave mode operation and should not be modified to control slave mode functionality.

image-20210525140532502

图 A-145 TWIMCTL 寄存器

表A-131 TWIMCTL 寄存器位功能描述

image-20210525143454398

image-20210525143529519

TWIMADDR

在传输的寻址阶段中,TWI控制器的主机使能,并传输TWI主机模式地址寄存器中的内容。

在对本寄存器进行编程时,忽略读/写位。只有从机地址的前7位(6-0)会被写入本寄存器。

例如:从机的地址是 1010 000x ,则本寄存器的写入内容则是 1010 000(16进制的 0x50 )。将该地址发送至总线时,TWI控制器根据 主机控制寄存器上TWIMDIR 位来决定对从机的读写。

During the addressing phase of a transfer, the TWI controller, with its master enabled, transmits the contents of the TWI master mode address register. When programming this register, omit the read/write bit. That is, only the upper 7 bits that make up the slave address should be written to this register. For example, if the slave address is 1010000X, then TWIMADDR is programmed with 1010000, which corresponds to 0x50. When sending out the address on the bus, the TWI controller appends the read/write bit as appropriate, based on the state of the TWIMDIR bit in the master mode control register.

image-20210525140743855

图 A-146 TWIMADDR 寄存器

TWIMSTAT

  • Not directly associated with the generation of interrupts but offer information on the current transfer.
  • Slave mode operation does not affect master mode status bits.
image-20210603153452903

如果TWIMSTAT寄存器中的第2位是1

image-20210603153655529

image-20210603153719024

TWIFIFOCTL

TWIFIFOCTL(FIFO Control Register),即先进先出控制寄存器,只控制FIFO,完全不与主机模式 或 从机模式操作绑定。

image-20210525144403383

图 A-151 TWIFIFOCTL 寄存器

表A-135 TWIFIFOCTL 寄存器位功能描述

image-20210525144738016

TWIFIFOSTAT

  • 指示FIFO缓冲区的接收和发送内容的状态。
  • FIFO缓冲器不区分主数据和从数据。
  • 可以对FIFO进行管理,允许同时进行主、从操作。
image-20210603152156841
image-20210603152211766
image-20210603152235432

TWITXS: 传输FIFO状态。

这些只读位表示FIFO缓冲器中有效数据字节的数量。该状态在每次使用外围数据总线写入FIFO缓冲区或通过传输移位寄存器读取时被更新。

在每次使用外设数据总线写FIFO缓冲区或通过传输移位寄存器读访问时更新。允许同时访问。

  • 00 = FIFO是空的。无论是单字节还是双字节的FIFO外设写入都会立即通过。
  • 01 = FIFO包含一个字节的数据。对FIFO的单字节外围写立即通过。一个双字节的外设写入要等到FIFO为空时才进行。
  • 11 = FIFO已满,包含两个字节的数据。
  • 10 = 保留

TWIIRPTL

TWIIRPTL(TWI interrupt sources register),即TWI中断源寄存器。

  • 包含了有关 functional areas requiring servicing 的信息。

  • 大量的比特被当做鉴定器/指示器来使用,主要用于 further read 以及 为 不同的状态寄存器提供服务(service various status register)。

  • 在维护了与位绑定的中断源后,用户需要清除该中断源位。

  • 所有的位都是粘性的 (sticky)和 RW1C

image-20210525163016113

图 A-1534 TWIIRPTL 寄存器

表A-137 TWIIRPTL 寄存器位功能描述

image-20210525163933340

image-20210525163959598

TWITXINT

首先要搞清楚,这个TWITXINT 是寄存器还是寄存器位,如果是寄存器位,哪它来自于哪个寄存器呢。目前已知包含TWITXINT的寄存器有:TWIIRPTLTWIIMASKTWIFIFOCTL(TWITXINT2)

在TWIIRPT寄存器中的TWITXINT寄存器位:

发送FIFO服务。

如果 TWIFIFOCTL 寄存器中的 XMTINTLEN2 为 0,则每次 TWIFOSTAT 寄存器中的 TWITXS 字段被更新为 01 或 00 时,该位都被设置。

如果 XMTINTLEN 为 1,则每次 TWITXS 被更新为 00 时,该位都被设置。

1 = 发送 FIFO 缓冲区有一个或两个 8 位位置可供写入。

0 = FIFO不需要服务或TWITXS字段在该位最后被清除后没有变化。

TWITXINT interrupt

This interrupt is generated when there is one or two bytes of empty space in the FIFO. Simple data handling is all that is required.

TWIIMASK

TWIIMARK (TWI Interrupt mask register),即TWI中断隐藏寄存器。

  • 使能中断源(interrupt sources)插入中断输出(Interrupt output)
  • 每一个使能位(enable bit)都会与 TWI中断延迟寄存器(TWIIRPTL,即TWI interrupt latch register)一个中断延迟位(interrupt latch bit)通信。
  • 对TWIIMASK寄存器的读写不会影响 TWIIRPTL 寄存器的内容。

image-20210525145706357

图 A-154 TWIIMASK 寄存器

表A-138 TWIIMASK 寄存器位功能描述

image-20210525150058029

image-20210525150122857

TXTWI8

8位传输用FIFO寄存器(TWI 8-bit transmit FIFO register),做数据缓存之用。

  • 存储数据以“先进先出”的顺序进入通信传输缓存。
  • 尽管外围总线写入带宽是32位,但是只有一个字节会被写入8位的 TXTWI8
  • 伴随着每一次数据写入,TWIFIFOSTAT 寄存器中的 TWITXS 传输状态位都会被更新。
  • 当FIFO缓存存满时,仍有数据需要写入的话,核心就会让数据等着,直到转运缓存(TRANSMIT FIFO BUFFER)由至少一个字节的空间时才能完成写入操作。

image-20210525155309392

图 22-7 8位传输FIFO寄存器

image-20210527114613231

例程

主寄存器初始化函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
ADAU1772_1_ADDR = 0X3C;  //第一个从设备的地址是0x3C,其ADDR1和ADDR0引脚均为0;
ADAU1772_2_ADDR = 0X3D; //第一个从设备的地址是0x3D,其ADDR1和ADDR0引脚为0和1;

void Master_TWI_Init(void){
// 预分频为 fPCLK/10 MHz
*pTWIMITR = (0x14) | TWIEN; //0x14和0x80进行 位或操作,将结果148写入TWI主机时间寄存器中

// CLKDIV = TWI SCL period ? 10 MHz time reference
// CLKDIV = (1/100 KHz) / 100 ns = 100
// For 40 - 60 duty cycle, CLKHI = 40 and CLKLOW = 60

*pTWIDIV = (CLKHI << 8) | CLKLOW;

// 需要被访问的从设备的地址
*pTWIMADDR = ADAU1772_1_ADDR;

// 传送至从属设备的第一个字节数据
*pTXTWI8 = 0x00;
*pTXTWI8 = 0x85; //(0101 0101b)

/* // 配置TWIFIFOCTL寄存器,为每个数据字节(byte)生成中断
*pTWIFIFOCTL = TWITXFLUSH | TWIRXFLUSH;
*pTWIFIFOCTL = 0;
*/ //暂时禁用该数据写入寄存器配置(包括中断和写入读取规则等)
*pTWIFIFOCTL = 0x15; //即(0 1111b),详细配置信息请参照《ADSP-214xx SHARC Processor Hardware Reference》

// 中断使能位,上方已经写过了,有些重复
#ifdef INTERRUPT_MODE
*pTWIIMASK |= TWITXINT;
#endif

// 打开TWI的控制寄存器
*pTWIMCTL = (N << 6); //??
*pTWIMCTL |= TWIMEN; // 打开主机模式(Master Mode enable)
}

特性 Features

《HWR》第855页起对TWI进行了描述。

image-20210603140215469
  • 需要使用DPI进行针脚信号的路由,不能使用DAI
  • 支持主从模式
  • 支持数据缓存接入和核心数据接入,不支持DMA
  • 最大时钟频率400KHz
  • 7-bit 寻址
  • 支持多播主机仲裁
  • 主时钟同步和时钟低延伸支持
  • 低中断速率
  • 分离多字节接收和传输的FIFOs
  • 在总线锁死时,对数据和时钟线的独立复写控制
  • 峰值抑制的输入滤波器

image-20210527100834503

image-20210527100951355

针脚描述 Pin Descriptions

image-20210527101956389

SRU编程 SRU Programming

TWI信号可以通过 SRU2 ,如表22-3所示进行路由。

image-20210527102029529

Identify the peripherals that you are trying to connect to the SHARC DSP, and count the unique signals. List the unique I/O signals and look carefully to see what else you may be able to eliminate.

  • 如果时钟或帧同步连接至多个设备,算作一个信号。If the same clock or frame sync is connected to multiple devices, it counts as one signal.

  • 如果与一个串行数据流驱动多个设备,也算作一个信号。When a serial data stream drives multiple output devices, it also counts as a single signal.

  • 如果两个信号相同,但极性相反(倒置),算作一个信号。(因为SRU可以从另一个信号中产生任何一个)

  • 如果一个时钟信号是另一个时钟信号的相位对齐的整数子倍数,则将它们组合在一起。

大多数引脚缓冲区在给定的设计中只在一个方向上使用。请注意,许多外设都具有能够实现双向操作的引脚,但仅在系统中的一个方向上使用。当针脚缓冲区是单向的时,SRU的编程会大大简化。

如果针是双向的,确定方向改变的原因。这是另一个别针的状态吗?它是处理器级控制寄存器的状态吗?它是一个端口的软件配置吗?想想当SHARC将逻辑值驱动到双向针上时,以及当针刚刚读取逻辑输入时,可能会控制什么。

注意 下图中的 PBxx_O / PBxx_I / PBENxx_I 。针脚缓冲器就像一个小型缓冲器放大器,可以提供足够的电流来驱动针脚和电路板上的痕迹。打开时(即当其启用输入为逻辑高时),针缓冲输入处的逻辑值被驱动到针缓冲输出上。当关闭时(即,当其启用输入为逻辑低时),缓冲器放大器为高阻抗,并且引脚缓冲器输出的逻辑电平很容易由外部源控制。引脚缓冲区是与DAI相关联的物理IC包引线的逻辑网关。

image-20210603170447943

由于引脚缓冲器是一个片上外设,连接到物理封装上的信号被称为引脚缓冲器的输出。虽然它是SHARC的一个输入,但它是引脚缓冲器的一个输出。请注意,图1显示了两个连接的轨迹,它们被标记为 PBxx_O(引脚缓冲器输出)。其中一个是SRU接口的一部分,另一个是外部封装连接引脚。当引脚缓冲器被用作输入时,信号会沿着这个路径。换句话说,SRU内的引脚缓冲器输出总是等于外部引脚的逻辑值。

——《Configuring the Signal Routing Unit of ADSP-2126x SHARC® DSPs

只有DAI有 PBEN ,DPI只有 PB。

PAGE 874 - SRU PROGRAMMING MODE

1
2
3
4
5
6
7
SRU(LOW, DPI_PBxx_I); /* input buffer is low */
SRU(TWI_DATA_PBEN_O, DPI_PBENxx_I); /* TWI data output*/
//SRU(DPI_PBxx_O, TWI_DATA_I); /* TWI data input */

SRU2(LOW, DPI_PByy_I); /* input buffer is low */
SRU2(TWI_CLK_PBEN_O, DPI_PBENyy_I); /* TWI clock output*/
//SRU2(DPI_PByy_O, TWI_CLK_I); /* TWI clock input*/

时钟频率 Clocking

  • 外围时钟(fPCLK)是TWI时钟频率的基础。
  • 串行时钟频率最高400KHz,最低20KHz;其分辨率为 1/10MHz 或 100ns。

分频数的计算案例如下:

image-20210527102754286

功能描述 Functional Description

下图22-1展示了TWI控制器的架构。

  • 外围接口(peripheral interface)支持32位宽的数据传输,并被处理器用于支持寄存器和FIFO缓冲器的读写。
  • 寄存器块 包含了所有的控制和状态位,并依托程序模型来反映了可以写入或读取的内容。状态位可由其各自的(respective)功能块更新。
  • FIFO缓冲器 被配置为一个1字节宽、2字节深的发送/接收FIFO缓冲器。

image-20210527103515471

  • 发送移位寄存器(transmit shift)串行地将其数据从外部移出芯片(shift its data out externally off chip)。该输出可以被控制以产生确认,也可以被手动改写。
  • 接收移位寄存器(receive shift)从片外串行接收其数据(receive its data serially from off chip)。接收移位寄存器的宽度为1个字节,收到的数据可以被转移到FIFO缓冲区或用于地址比较(address comparison)。
  • 地址比较块 (address compare block)支持在TWI控制器模块作为从机访问时的地址比较。
  • 预分频器块 (prescaler block)必须被编程以产生一个相对于外设时钟的 10MHz 时间基准。这个时间基准用于过滤数据和数据表中电气参数指定的定时事件(见飞利浦的I2C总线规范),以及 TWI_CLOCK 的时钟信号生成。
  • 时钟生成模块 (clock generation module)用于在主模式下生成一个外部串行时钟(TWI_CLOCK)。它包括在多主时钟配置中进行同步所需的逻辑,以及在从属模式下配置时的时钟拉伸。

时钟输出

TWI控制器的时钟输出遵循以下规则。

  1. 一旦时钟高电平(CLKHI)计数完成,串行时钟输出(serial clock output)被驱动为低电平,时钟低电平(CLKLOW)计数开始。

  2. 一旦时钟低电平计数完成,串行时钟线被三振(three-stated),时钟同步逻辑进入延迟模式(阴影区),直到 TWI_CLOCK 线被检测到逻辑1电平。这时,时钟高电平计数开始。

TWI控制器只在主控模式运行时发出时钟,而且只在传输启动时发出。如果总线的仲裁(arbitration)丢失,串行时钟输出立即进入三态(three-states)。如果多个时钟试图驱动串行时钟线,TWI控制器将其时钟与其他剩余的时钟同步。这在图22-2中有所说明。

The TWI controller only issues a clock during master mode operation and only at the time a transfer has been initiated.

image-20210603144317584

TWI控制器遵守《Philips I2C Bus Specification version 2.1 dated January 2000》传输协议。图22-3是简易的TWI传输示意。

image-20210603145223033

图22-4是TWI控制器在传输过程中的寄存器映射。

image-20210603145235075

总线仲裁 Bus Arbitration

image-20210603145739629

开始与结束情景 Start & Stop condition

操作模式 Operating Modes

通用呼叫寻址 General Call Addressing

如果TWI控制器被启用为从机(TWISEN),并且使用TWIGCE位启用了一般呼叫,则TWI控制器总是解码并确认一般呼叫地址。一般呼叫寻址(0x00)由GCALL位的设置表示,根据传输的性质,TWI控制器是一个从属接收者。如果与传输相关的数据不被确认(NAKed),TWINAK位可以被设置。

如果TWI控制器作为主发射器发出一个总调用,可以设置适当的地址和传输方向,同时加载发送FIFO数据。

The TWI controller always decodes and acknowledges a general call address if it is enabled as a slave (TWISEN) and if general call is enabled using the TWIGCE bit. General call addressing (0x00) is indicated by the setting of the GCALL bit, and by the nature of the transfer, the TWI controller is a slave-receiver. If the data associated with the transfer is to be not acknowledged (NAKed), the TWINAK bit can be set.

If the TWI controller is to issue a general call as a master-transmitter, the appropriate address and transfer direction can be set along with loading transmit FIFO data.

从设备模式寻址 Slave Mode Addressing

With the appropriate selection of 7-bit addressing using the TWISLEN bit, the corresponding number of address bits (SADDR) are referenced during the address phase of a transfer.

主设备模式寻址 Master Mode Addressing

无论是启用主发送器还是使用 TWIMLEN 位进行7位寻址的主接收器,TWI主站都会按要求执行所有寻址和数据传输。这包括产生重复启动条件,重新传输第一个地址字节的7位,以及确认和产生一个新的传输方向变化(由 TWIMLEN 位指示)。

Whether enabled as a master-transmitter or master-receiver with 7-bit addressing using the TWIMLEN bit, the TWI master performs all addressing and data transfers as required. This includes generating the repeated start condition, re-transmission of the 7-bits of the first address byte, and acknowledgement and generation of a new transfer direction change (indicated by the TWIMLEN bit).

快速模式 Fast Mode

Fast mode (400 kHz) uses essentially the same mechanics as standard mode (100 kHz). It is the electrical specifications and timing that are different. When fast mode is enabled using the TWIFAST bit, the following timings are modified to meet the electrical requirements.

  • Serial data rise times before arbitration evaluation (tr)
  • Stop condition setup time from serial clock to serial data (tSUSTO)
  • Bus free time between a stop and start condition (tBUF)

数据传输 Data Transfer

PAGE867:

数据传输部分介绍 3个寄存器4个缓冲区域3个缓存状态

寄存器 Register

Serial Shift Register: TWI有一个输入和输出的串行移位器,下面将介绍。

Output Shift Register: 发送移位寄存器接收字节宽的缓冲区数据或寄存器数据(地址),并将其数据从外部串行移出芯片。该输出可以被控制以产生确认信号,也可以被手动改写。

Input Shift Register: 接收移位寄存器从芯片外串行地接收数据。在内部,接收移位寄存器是字节宽的,收到的数据可以被转移到缓冲区或用于地址比较。

中断 Interrupt

image-20210527104039047

调试特征 Debug Feature

Masking

1
2
3
4
bit set IMASK P14I; /* unmasks P14I interrupt */
ustat1=dm(DPI_IMASK_RE); /* set TWI Int */
bit set ustat1 TWI_INT;
dm(DPI_IMASK_RE)=ustat1;

Service

1
2
3
4
5
6
7
8
9
10
11
TWI_ISR:
ustat1 = dm(TWIIRPTL); /* read IRPTL to identify cause*/
bit TST ustat1 TWITXINT; /* test TX buffer bit*/
IF TF jump TX_BUF;

TX_BUF:
dm(TWIIRPTL) = ustat1; /* RW1C to clear TWI TX buffer
interrupt */
r0=dm(TWIMCTL); /* dummy read*/
instruction;
rti;

主设备发送模式

以下为单主机传输模式的的编程过程: 1. Program the TWIMADDR register. - This defines the address transmitted during the address phase of the transfer. 2. Program the TXTWI8 or TXTWI16 registers. - This is the initial data transmitted. - It is considered an error to complete the address phase of the transfer and not have data available in the transmit FIFO buffer. 3. Program the TWIFIFOCTL register. - Indicate if transmit FIFO buffer interrupts should occur with each byte transmitted (8 bits) or with each 2 bytes transmitted (16 bits). 4. Program the TWIIMASK register. - Enable the bits associated with the desired interrupt sources. - For example, programming the value 0x0030 results in an interrupt output to the processor when the master transfer completes, or if a master transfer error has occurred. 5. Program the TWIMCTL register. - This prepares and enables master mode operation. - As an example, programming the value 0x0201 enables master mode operation, generates a 7-bit address, sets the direction to master-transmit, uses standard mode timing, and transmits 8 data bytes before generating a stop condition.

image-20210527104628291

Clock

The PLLD bits define the VCO output clock to core clock ratio to build the processor core clock (CCLK). The post divider can be changed any time and new division ratios are implemented on the fly.

The PCLK and CLKIN clocks are used in the arbitration logic for the shared external bus.

The PLL bit settings PLLM/PLLD in PMCTL register need to be programmed such that the PLLM/PLLD ratio is integer (for example 15/2=7.5 fractional, is not allowed).

IOP Clock (PCLK)

The peripheral clock is derived from the core clock with a fixed post divisor of 2.

This clock is the master clock for most peripherals including the I/O processor (IOP).

PLL

PLL Registers

PMCTL

PMCTL 寄存器,Power management control register。(是的,没错,就是不知道为啥管PLL的要叫PMCTL)

  • Controls the SDCLK to core clock ratio or DDR2CLK to core clock ratio related to the external port timing.
    • The fundamental timing clock of the external port is SDRAM clock (SDCLK). The SDRAM clock ratio settings are independent from the peripheral clock (PCLK).
      • The AMI/SDRAM controller is capable of running at up to 133 MHz for ADSP-2147x processors. See Table 4-2 for more information about EXTERNAL PORT CLOCK FREQUENCIES.
    • The fundamental timing clock of the external port is DDR2 clock (DDR2_CLK). The DDR2 clock ratio settings are independent from the peripheral clock (PCLK).
  • 32位内存映射寄存器(32-bit memory-mapped register)
  • 包含控制位,可控制:锁相环(PLL, phase lock loop)(PLL乘法器值(multiplier)、PLL除法器值(divider)、锁相环旁路模式(PLL bypass mode) 和 外围设备使能时钟控制(clock control for enabling peripherals))
  • 包含状态位,可追踪:CLK_CFG针脚(可读写)
  • PMCTL 寄存器的复位值取决于 CLK_CFG 引脚(bits 5-0 & 17-16)
  • 包含三选一的加速器(FIR、IIR、FFT)

image-20210608101359924

image-20210527150852485

图 A-2 PMCTL 寄存器

表A-3 PMCTL寄存器位功能描述

image-20210527151035867
image-20210527151017770
image-20210527151110432

PMCTL1

image-20210527152044822

图 A-3 PMCTL1 寄存器

表A-4 PMCTL1寄存器位功能描述

image-20210527152155406
image-20210527152229763
image-20210527152251696

PLLD

Page 888: PLLD(PLL Divider)定义了 VCO输出时钟核心时钟 的比值,以构建 处理器核心时钟(CCLK)。正在使用的分频器可以被随时改变,新的分频比率可以实时被应用。

Page 957: PLLD只有2位,可以设置为2、4、8、16。

image-20210529113003651

<def21479.h>:image-20210529113403231

以下这几个操作中均需要用到PLLD,分别是:

  • 输出时钟生成器编程模型 (Output Clock Generator Programming Model)
  • 改变链接口时钟(Changing the Link Port Clock)
  • 发布分频器(Post Divider)

image-20210529111641680

image-20210529111748944

image-20210529112121464

官方示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
void Init_PLL(void)
{
int temp,i;

// Step 1 - change the PLLD to 4
temp=*pPMCTL; //备份PMCTL寄存器的值至temp
temp&=~PLLD16 ; //0x20,将PLLD16的值和temp进行逐位“与”运算
temp|=(PLLD4 | DIVEN) ; //0x260 0010 0110 0000
*pPMCTL = temp;

// Step 2 - 等待分频器稳定
SysWait(16);

// Step 3 - set INDIV bit now to bring down the VCO speed and enter the bypass mode
temp&=~DIVEN;
temp|=(INDIV | PLLBP);
*pPMCTL = temp;

// Step 4 -等待PLL锁定
SysWait(4096);

// Step 5 - come out of the bypass mode
temp=*pPMCTL;
temp&=~PLLBP;
*pPMCTL = temp;

// Step 6 - 等待分频器稳定
SysWait(16);

// Step 7 - set the required PLLM and INDIV values here and enter the bypass mode
//PLLM=16, INDIV=0, fVCO=2*PLLM*CLKIN = 2*16*16.625 = 532 MHz
temp = *pPMCTL;
temp&=~ (INDIV | PLLM63);
temp|= (PLL_MULT| PLLBP);
*pPMCTL = temp;

// Step 8 - wait for the PLL to lock
for(i=0;i<4096;i++);

// Step 9 - come out of the bypass mode
temp = *pPMCTL;
temp&=~PLLBP;
*pPMCTL=temp;

// Step 10 - wait for dividers to stabilize
SysWait(16);

// Step 11 - set the required values of PLLD(=2) and SDCKR (=2.5 for ADSP-21489 and 2 for ADSP-21479) here
// fCCLK = fVCO/PLLD = 532/2 = 266 MHz, fSDCLK = fCCLK/SDCKR = 266/2 = 133 MHz
temp=*pPMCTL;
temp&=~(PLLD16 | 0x1C0000 );
temp|= (SDCKR2 | PLLD2 | DIVEN);
*pPMCTL=temp;

// Step 12 - wait for the dividers to stabilize
SysWait(16);
}

问题1: 为啥一定要使用temp变量来进行处理,直接使用 *pPMCTL 不是更方便吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
void initPLL()
{

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

int i, pmctlsetting;

// Set INDIV bit in PMCTL register
pmctlsetting = *pPMCTL; // 备份PMCTL寄存器的原始值
pmctlsetting |= INDIV; //设置锁相环输出的分频率,0则是1分频,1则是2分频,此处通过或运算设置为二分频
*pPMCTL = pmctlsetting; // 将至重新写入PMCTL寄存器

// Program PLL multiplier to same value as CLK_CFGx pins/previously programmed value in software……
*pPMCTL = pmctlsetting;
pmctlsetting |= PLLBP; //设置锁相环旁路模式
*pPMCTL = pmctlsetting;

//Wait for recommended number of cycles
for (i = 0; i < 4096; i++)
NOP;

// Bring PLL out of bypass mode by clearing PLLBP bit
*pPMCTL ^= PLLBP; // 通过异或操作 取消旁路模式

for (i = 0; i < 16; i++)
NOP;

pmctlsetting = *pPMCTL;
pmctlsetting &= ~PLLM63; //通过按位取反操作和与操作,清除PLLM所有位
pmctlsetting &= ~INDIV; //通过按位取反操作和与操作,清除分频
// *pMCTL |= INDIV;
*pPMCTL = pmctlsetting;

// CLKIN = 16.625 MHz, PLLM=32, PLLD = 1, INDIV= 1 => fINPUT = 16.625/2 = 8.3125 MHz
// CCLK = 2*PLLM*fINPUT/2*PLLD = (2*32*8.3125)/(2*1) = 266 MHz, SDCLK = CCLK/2 = 133 MHz
// VCO frequency = 2*fINPUT*PLLM = 2*8.3125*32 = 532 <= fVCOmax (532 MHz)

pmctlsetting = SDCKR2 | PLLM32 | INDIV | DIVEN; //设置
*pPMCTL = pmctlsetting;

pmctlsetting |= PLLBP; //Setting the Bypass bit
pmctlsetting ^= DIVEN; //Clearing the DIVEN bit
*pPMCTL = pmctlsetting; // Putting the PLL into bypass mode

//Wait for around 4096 cycles for the pll to lock.
for (i = 0; i < 5000; i++)
NOP;

pmctlsetting = *pPMCTL;
pmctlsetting ^= PLLBP; //清除旁路模式
*pPMCTL = pmctlsetting;

//Wait for around 15 cycles for the output dividers to stabilize.
for (i = 0; i < 16; i++)
NOP;
}

更改之后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void SystemWait(unsigned int MAX){
int i;
for(i = 0; i < MAX; i++) NOP;
}

void initPLL()
{
*pPMCTL |= INDIV; //设置锁相环输出的分频率,0则是1分频,1则是2分频,此处通过或运算设置为二分频
*pPMCTL |= PLLBP; //设置锁相环旁路模式
SystemWait(4096);

*pPMCTL ^= PLLBP; // 通过异或操作 取消旁路模式
SystemWait(16);

*pPMCTL &= ~( PLLM63 | INDIV ); //PLLM和INDIV位全部或操作后取反,再与原PMCTL里的数据与操作,清除该两个定义位的数据
*pPMCTL = SDCKR2 | PLLM32 | INDIV | DIVEN; //设置这几个位置的值
*pPMCTL = (*pPMCTL | PLLBP) ^ DIVEN
SystemWait(4096);

*pPMCTL ^= PLLBP; //清除旁路模式
SystemWait(16);
}

当使用乘法器(multipliers)和已发布的分频器(post dividers)对PLL进行编程时,DIVENPLLBP 不可以在同一个时钟周期内被编程。注意:DIVEN 位会自动清零(self clearing)。

∵ CLKIN = 16.625 MHz, PLLM=32, PLLD = 1, INDIV= 1 ∴ fINPUT = 16.625/2 = 8.3125 MHz ∴ CCLK = 2*PLLM *fINPUT/2*PLLD = (2*32*8.3125)/(2*1) = 266 MHz ∴ SDCLK = CCLK/2 = 133 MHz, 符合 2147X 对 SDRAM 时钟的要求 VCO frequency = 2*fINPUT*PLLM = 28.312532 = 532 <= fVCOmax (532 MHz)

步骤总结

从官方给出的示例代码中,可以将步骤总结如下:

  1. 设置PLLD - 等待分频器稳定
  2. 设置INDIV位以降低VCO速度,并进入旁路模式 - 等待PLL锁定
  3. 从旁路模式出来 - 等待分频器稳定
  4. 设置PLLM和INDIV,并进入旁路模式 - 等待PLL锁定
  5. 从旁路模式出来 - 等待分频器稳定
  6. 设置PLLD和SDCKR - 等待分频器稳定

从以上步骤可以看出,PLL的初始化,主要是设置 PLLDINDIVPLLMSDCKR 的值,途中反复等待 分频器稳定PLL锁定

问题总结

  1. 进入旁路模式的意义:

Interrupt Control of PINs

Page93

For information on the IRPTL, LIRPTL, and IMASK registers, see SHARC Processor Programming Reference.

下表2-1介绍了经过DAI和DPI的数据通道:

  • DAI共有32个通道(22个外围设备通道,10个miscellaneous通道),DPI共有12个通道(3个外围设备通道,9个miscellaneous通道)
  • DAI允许设置优先级,而DPI不允许
  • DAI和DPI都能识别上升沿(Rising Edge)或下降沿(Falling Edge)
  • 到核心的中断(Interrupt to Core),DAI为2,DPI为1
  • DAI和DPI都是4分频
image-20210602150117965

特征

  • 两个系统中断控制器(SIC, System Interrupt Controller),分别为DAI SIC 和 DPI SIC,连接至核心中断控制器(CIC, Core Interrupt Controller)。

  • DAI SIC 允许高/低中断优先级配置选项

  • DAI中断控制器提供最高32条独立可配置通道

  • DPI中断控制器提供最高12条独立可配置通道

  • DAI SIC和DPI SIC都允许针对波形的上升沿或下降沿进行锁存

  • 与核心锁存中断一致的中断延迟

  • 时钟:系统中断控制器的基础时钟是 4分频 (fPCLK)/4 ;所有中断的确认响应速度为4分频最高。

中断寄存器

可编程中断控制寄存器PICR3 - 0): 为了登记(assign)独立优先级(individual priorities)到各外围通道,19个外围设备可路由至可编程中断输入。

DAI 中断屏蔽寄存器DAI_IMASK):屏蔽上升或下降沿波形。因可屏蔽的边沿有上升沿或下降沿,因此DAI中断屏蔽寄存器分为 DAI_IMASK_RE 和 DAI_IMASK_FE。

DAI 中断屏蔽优先级寄存器DAI_IMASK_PRI):为DAI高/低中断优先级屏蔽中断。

DAI 中断锁存寄存器DAI_IRPTL): 为DAI高/低优先级中断锁存中断。

DPI 中断屏蔽寄存器DPI_IMASK):屏蔽上升或下降沿波形。因可屏蔽的边沿有上升沿或下降沿,因此DPI中断屏蔽寄存器分为 DPI_IMASK_RE 和 DPI_IMASK_FE。

DPI 中断锁存寄存器DPI_IRPTL):为DPI中断锁存中断。

image-20210603134437928
image-20210603134453465

功能描述

可编程中断优先级控制

外围中断

软件中断

多重中断请求信号的外围设备

系统中断控制器

DAI/DPI外围相关事件发生时,这些针脚各自拥有能够指向核心的系统中断控制器。

相对于SHARC核心,音频事件通常发生不频繁,DAI/DPI中断控制器将其所有中断减少到核心主中断系统中的三个中断信号上:

  • 一个映射为DAI低优先级
  • 一个映射为DAI高优先级
  • 第三个映射到DPI中断。

以上这种操作,允许程序更加粗略地去表示优先级。

输出总线中断信号可以有逻辑地导向(ORed)一个中断线并递交至(fed to)核心中断控制逻辑。

The output bus interrupt signals are logically ORed into one interrupt line and fed to the core’s interrupt controller logic.

image-20210602154656729

注意:DAI/DPI中断控制器拥有与核心中断控制器相同的中断延迟,或6个延时周期以相应异步中断。

被用于配置DAI中断控制器的有3个寄存器,被用于配置DPI中断控制器的有2个寄存器。32个DAI中断源和12个DPI中断源中的任意一个都可以用于独立配置开关,来控制进入信号的上升沿、下降沿、上升下降沿(both edges)或无沿(neither edge)。

需要注意的是,当核心中断寄存器是系统寄存器时,DAI/DPI中断控制寄存器是被内存映射的寄存器(memory mapped registers),且通过外围设备总线被接入(accessed via the peripheral bus)。

DAI/DPI中断源

DAI有5个外围(中断)源都被多路复用至(multiplexed into)32个中断源里,并以 DAI_INT 0 ~ 31 作为标签名称。

DPI有3个外围(中断)源都被多路复用至(multiplexed into)12个中断源里,并以 DPI_INT 0 ~ 13 作为标签名称。

下表介绍了DAI/DPI在不同的通信方式和信号响应的关系。

image-20210602195334432

DAI中断锁存优先级设置

DAI系统中断控制器寄存器对( DAI_IRPTL_HDAI_IRPTL_L)取代了通常由核心中断控制器的IRPTL寄存器执行的功能。一个单一的寄存器( DAI_IRPTL_PRI)指定了这些中断被映射到哪个锁存器中。

当一个DAI中断被配置为低优先级(DAI_IMASK_PRI 位被清除,默认设置),它将被锁在 DAI_IRPTL_L 寄存器中。低优先级的DAI中断,DAILI,被连接到 P12I 核心中断上。默认情况下。PICR 寄存器可以改变这种连接。每当DAI的低优先级中断被设置,LIRPTL寄存器中的 DAILI 位就会被设置,核心就会为该低优先级中断服务。

image-20210602200433030

注意: DAI会在中断向量表中触发一个高优先级一个低优先级的中断。当任一来自DAI的中断需要服务时,两个核心ISR之一必须审查(interrogate)DAI的中断控制器以判定其中断源。

中断向量表(Interrupt Vector Table, IVT), Page 177

image-20210602205507981

DPI中断锁存

DPI系统中断控制寄存器(DPI_IRPTL)取代了通常是由核心控制器寄存器(IRPTL)的功能。

当DPI中断配置时,将被锁存在 DPI_IRPTL 寄存器中。默认情况下,DPI中断被连接至P14I核心中断。PICR寄存器可以改变其连接。无论何时,DPI中断一旦设置,LIRPTL 寄存器中已编程的DPI位会被设置,且核心将会为已编程优先级的中断服务。

DAI/DPI边沿触发中断屏蔽

DAI上升沿中断屏蔽寄存器 DAI_IMASK_RE 和 DAI下降沿中断屏蔽寄存器 DAI_IMASK_FE 取代了核心中断控制器 IMASK 的版本。与 IMASK 寄存器一样,这些DAI寄存器提供了一种指定(specify)哪条中断被确认和处理,哪条中断会被忽略的方法。这对寄存器的功能与 IMASK 一致,但具有更高程度的细化。

DAI_IMASK_REDAI_IMASK_FEDPI_IMASK_REDPI_IMASK_FE这些寄存器的使用,能够使程序对上升沿、下降沿、上升下降沿、或者无沿(neither rising or falling edge)的程序确认或响应能够分别独立地屏蔽(masked separately)。

从SRU过来的信号能够被用于生成中断。例如,当 DAI_IMASK_FE 寄存器的 DAI_30_INT 位被设置为1时,任何从外部通道过来的下降沿信号都能在核心中生成中断,且中断锁存器会被设定。对 MASK 寄存器的读取不会清除 IRPTL 寄存器。

DAI/DPI事件中断屏蔽

系统中断控制器需要一个外设的中断源与事件信号相对应的信息(参考第2-8页中的表2-2)。如此一来,就只有上升沿被当做中断源。对于被标记为事件的DAI/DPI外设,程序可以只在上升沿解除中断源的屏蔽。

DAI/DPI中断服务

当多通道被复用至一个中断输出信号时,中断确认的操作方式不尽相同。当DAI/DPI中的服务必须被处理时,三者任一的中断服务程序(interrupt service routines)(DAILI, DAIHIDPII)必须查询RIC以确定中断源。该中断源可能是一个或多个DAI/DPI通道(DAI_INT31-0DPI_INT13-0)。

  • DAI_IRPTL_H 被读取时,高优先级锁存的中断将会被清除。
  • DAI_IRPTL_L 被读取时,低优先级锁存的中断将会被清除。
  • DPI_IRPTL 被读取时,锁存中断将会被清除。
  • DAI_IRPTL_H/L 寄存器被读取时, IDP_FIFO_GTN_INT 中断不会被清除。当中断需要离开的情况发生时,中断自然会被清除。(This interrupt is cleared automatically when the situation that caused the interrupt goes away.)
  • DPI_IRPTL_SH 是被用于读取主寄存器 DPI_IRPTL的影子寄存器。读取这些影子寄存器将会返回 DPI_IRPTL 寄存器中的数据却不会清除里面的内容。

如果在清空锁存器的同一周期内发生中断,则该机制的优先级较低,新的中断器被注册。

注意

  • TWII 和UARTRXI 中断不遵循这条原则。确认信号将在这些外围锁存器中发生。
  • 读取中断锁存器(DAI_IRPTL_XDPI_IRPTL )将会清除中断(只读清除类型)。因此,ISR必须为所有已发现的中断提供服务。即如果复用中断(mumtiple interrupts)被锁存在复用屏蔽寄存器(multiple mask registers)中,必须在执行 RTI 指令前,对所有中断进行服务。

RTI ((interrupt) return instruction):中断返回指令

在中断服务程序中用于返回中断指令,在运行中断之前,用JSR指令将PC(程序计数器)和SR(状态寄存器)压入堆栈,当中断服务程序结束时,执行RTI或RTIS指令,将PC和SR从堆栈中弹出。

——RTI

中断服务

中断服务部分主要描述了中断服务程序操作(interrupt service routines operate)如何正确清除中断请求。

中断驱动I/O是较为有利(advantageous)的,因为核心并不需要去轮询(poll)输入信号。当一次中断触发时,定序器(sequencer)通常会完成其现有的指令并跳转至中断向量表(IVT)。(向量)地址(the address)通常会从向量表里指向ISR程序。定序器(sequencer)跳转至该程序,完成程序执行并通过执行RTI指令退出程序。然而,这条规则并不对所有情况适用,在ISR程序中,有三种中断确认机制,均取决于外围设备:

  • RTI指令
  • 只读清除(ROC)状态位 + RTI指令
  • 写1清除(W1C,Write-1-to-clear)状态为 + RTI指令

锁存器必须在被读取的时候清除中断源,因此DAI/DPI被设计来正确地执行此项工作。需要注意的是,锁存器读取操作会在退出中断程序(exiting an interrupt routine)前自动确认请求(automatically acknowledges the request)。在W1C机制,程序必须写入锁存器的特定位(specific bit)以正确清除中断(terminate the interrupt properly)。

注意:如果确认机制没有被正确遵守,中断将可能在未可预知且频率不定(unwanted and sporadic)的情况下发生。

核心缓存服务请求(输入输出模式)

如果数据流外围设备通过核心访问各自DMA FIFO的数据缓存,则缓存(器)在中断确认过程中发挥着重要作用。

例如,一个接收缓存已满,中断生成时ISR中的缓存被读取,就会触发清除请求(ROC + RTI)。同样的,如果一个传输缓存已空,中断生成时,写入操作将会清除请求(WOC + RTI)。

DMA接入

如果外设通过DMA访问缓冲区,逻辑操作就不同了。在DMA中,缓存状态对中断没有影响。相反,每当DMA计数寄存器达到0时就会产生一个中断。不同的外围设备所使用的中断确认机制都不同。

DMA Direct Memory Access 直接内存访问

是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。

中断延迟

优秀的编程会要求一条(完整的)中断服务 确认 中断请求尽可能简洁地返回至外围设备。这种(中断)响应允许外围设备尽可能快地感知到其他事件。

此(中断确认)服务程序(routine)必须去确保(中断)请求在RTI指令执行前被释放,否则(中断)服务程序会在执行完RTI指令后被立即调用。

有些中断请求通过W1C操作来清除,该写入指令并没有让核心停滞(stall the core)。相反,该操作被自动锁存在写缓存中,并在被发送至外围总线前会通过外围时钟(PCLK)进行同步。

在W1C操作到达外围设备前,此操作可能会需要多个 CCLK 周期(cycles)。如果 W1C 操作在服务程序的结束点进行操作,一个 dummy 读取操作需要在RTI指令前被执行,以确保外围设备能够在RTI之前释放请求。

下列案例描述了中断延迟:

  • 对于具有W1C确认机制的外设来说,写入外设的状态寄存器以清除中断会导致一定的延迟(因为寄存器的写入效应延迟)。
  • 中断驱动的数据传输(核心或DMA)来自任何产生中断和使用ISR程序(routine)的外设,写入外设数据缓冲区(以清除中断)或控制寄存器会导致一定的延迟(因为存在寄存器写入效果延迟和缓冲区时钟域)。

如果像案例所示,程序在延迟的周期内(最多10个CCLK周期),程序从中断服务程序(RTI指令)中生成,中断再次出现。为了避免中断多次出现,需要采取下列其中一种措施:(注意:中断再生的限制(interrupt regeneration restriction)不适用于DMA操作模式下的任何SPORT。)

  1. 在中断返回(RTI)前,从相同的外围区块中读取IOP寄存器。读取操作(的同时)会强制写入,如下列样例所示。

SPI中断服务程序

1
2
3
4
R0 = dm(i0,m0);
dm(TXSPI) = R0; // 写入SPI数据缓存
R0 = dm(SPICTL); /* this dummy read forces the previous write to complete */
rti;

PWM中断服务程序:

1
2
3
4
r1 = PWM_STAT3;
dm(PWMGSTAT)=r1; /* W1C to PWM status reg */
r0=dm(PWMGSTAT); /* this dummy read forces the previous write to complete */
rti;
  1. 在写入操作后添加足够的NOP指令。在最坏的情况下,程序需要在写入后添加10条NOP指令,如下面的示例代码所示。

中断服务程序

1
2
3
4
5
R0 = 0x0;
dm(SPICTL) = R0; /* or disable SPI control */
nop; nop; nop; nop; nop;
nop; nop; nop; nop; nop;
rti;

DMA完成类型

在SHARC处理器中,中断在内部传输完成(此时DMA计数器过期(expired))后被生成。但是,在某些案例中,传输可能尚未完成(不同通道优先级的原因)且有效的数据仍然存在于(resides in)外设的缓冲区中等待着被传输。为了解决此问题,引入了中断访问完成模式(interrupt access completion mode),在此模式下,上一个数据离开缓存时,中断会被生成。此模式可用于 SPORT 、 SPI 、 连接口 和 外部接口DMA。

调试特征

影子中断寄存器

  • 影子中断寄存器(Shadow Interrupt Register)可用于 IDP, S/PDIF, ASRC, UART, TWI 和 DAI/DPI。

  • DAI/DPI 中断控制器拥有可以简化调试活动且不会操纵状态控制(manipulate status control)的影子寄存器。

  • 任何对 DAI_IRPTL_x_SHDPI_IRPTL_SH 影子寄存器的读取都会提供 和 读取 DAI_IRPTL_xDPI_IRPTL 寄存器一样的数据。

  • 对DAI/DPI影子寄存器的读取不会改变核心中断控制器(core interrupt controller)对中断的确认状态。

术语总结

中断确认

中断请求

中断服务

中断延迟

SPORT

对所有SPORT的研究仅限于对I2S开发中需要的研究。

首先,SPORT是指Serial Port,即串行接口。有0 ~ 7 共8个这样的SPORT。

image-20210629151245935

如果需要用到I2S模式,则需要针对 SPCTLxSPMCTLx 两个寄存器中的某些位做单独设置,其设置指引表格如下 :

image-20210629150923785

SPCTL

SPCTL 寄存器在多种模式下具有不同的位定义。

寄存器位指示

image-20210629162509309

image-20210629162550029

image-20210629162728195

寄存器位说明

image-20210629172318405

image-20210629172412087

image-20210629172430662

image-20210629172455121

image-20210629172510903

image-20210629172534214

image-20210629172549089

SPCTLNx

FE: frame edge 帧边沿

FS: frame sync 帧同步

These registers (where x signifies SPORT 0 through 7) allow programs to set frame sync edge detection for I2S compatibility. These registers also allow interrupts to be generated when transmit DMA count is expired or when the last bit of last word is shifted out.

image-20210630162335568

注意:212XX系列和213xx系列芯片上并没有这个寄存器。

image-20210630162415539
image-20210630162442482
image-20210630162505383

SPMCTLx

串行接口多通道控制寄存器,Serial ports multichannel control registers

在214xx系列芯片中,该寄存器独立工作,并不成对操作;因此每一个SPORT都有其独立的多通道控制寄存器,所以只需要向两个SPMCTLx寄存器写一次,就可以将SPORT作为一对来操作。

image-20210630162916913

其中,x表示0、2、4、6,y表示1、3、5、7。

image-20210630163319226
image-20210630163357041
image-20210630163451919

DMA

DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。

CPU和DMA控制器对内存的访问是交替进行的,因为对内存的访问涉及到总线控制,而DMA控制器和CPU在同一时刻仅有一个能获取总线控制权。更具体的DMA控制器与CPU工作方式见下方 传送方式

DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高。

DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。

DMA

在实现DMA传输时,是由 DMA控制器 直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过 DMA请求DMA响应DMA传输DMA结束 4个步骤。

请求:CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求。

响应:DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。

传输:DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。在DMA控制器的控制下,在存储器和外部设备之间直接进行数据传送,在传送过程中不需要中央处理器的参与。开始时需提供要传送的数据的起始位置和数据长度。

结束:当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停 止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查本次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来的程序。

由此可见,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。

传送原理

DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序。那么DMA控制器与CPU怎样 分时使用内存 呢?通常采用以下三种方法:

  1. 停止CPU访问内存;

  2. 周期挪用;

  3. DMA与CPU交替访问内存。

停止CPU访问内存

当外围设备要求传送一批数据时,由DMA控制器发一个停止信号给CPU,要求CPU放弃对地址总线、数据总线和有关控制总线的使用权。DMA控制器获得总线控制权以后,开始进行数据传送。在一批数据传送完毕后,DMA控制器通知CPU可以使用内存,并把总线控制权交还给CPU。图(a)是这种传送方式的时间图。很显然,在这种DMA传送过程中,CPU基本处于不工作状态或者说保持状态。

image-20210630135714198

优点: 控制简单,它适用于数据传输率很高的设备进行成组传送。

缺点: 在DMA控制器访问内存阶段,内存的效能没有充分发挥,相当一部分内存工作周期是空闲的。这是因为,外围设备传送两个数据之间的间隔一般总是大于内存存储周期,即使高速I/O设备也是如此。例如,软盘读出一个8位二进制数大约需要32us,而半导体内存的存储周期小于0.5us,因此许多空闲的存储周期不能被CPU利用。

周期挪用

当I/O设备没有DMA请求时,CPU按程序要求访问内存;一旦I/O设备有DMA请求,则由I/O设备挪用一个或几个 内存周期。这种传送方式的时间图如下图(b):

image-20210630135800538

I/O设备要求DMA传送时可能遇到两种情况: 1. 此时CPU不需要访内,如CPU正在执行乘法指令。由于乘法指令执行时间较长,此时I/O访内与CPU访内没有冲突,即I/O设备挪用一二个内存周期对CPU执行程序没有任何影响

  1. I/O设备要求访内时CPU也要求访内,这就产生了访内冲突,在这种情况下I/O设备访内优先,因为I/O访内有时间要求,前一个I/O数据必须在下一个访问请求到来之前存取完毕。显然,在这种情况下I/O 设备挪用一二个内存周期,意味着CPU延缓了对指令的执行,或者更明确地说,在CPU执行访内指令的过程中插入DMA请求,挪用了一二个内存周期。 与停止CPU访内的DMA方法比较,周期挪用的方法既实现了I/O传送,又较好地发挥了内存和CPU的效率,是一种广泛采用的方法。但是I/O设备每一次周期挪用都有申请总线控制权、建立线控制权和归还总线控制权的过程,所以传送一个字对内存来说要占用一个周期,但对DMA控制器来说一般要2—5个内存周期(视逻辑线路的延迟而定)。因此,周期挪用的方法适用于I/O设备读写周期大于内存存储周期的情况。

DMA与CPU交替访问内存

如果CPU的工作周期比内存存取周期长很多,此时采用交替访内的方法可以使DMA传送和CPU同时发挥最高的效率。这种传送方式的时间图如下:

image-20210630135821665

此图是DMA与CPU交替访内的详细时间图.假设CPU工作周期为1.2us,内存存取周期小于0.6us,那么一个CPU周期可分为C1和C2两个分周期,其中C1专供DMA控制器访内,C2专供CPU访内。

这种方式不需要总线使用权的申请、建立和归还过程,总线使用权是通过C1和C2分时制的。CPU和DMA控制器各自有自己的访内地址寄存器、数据寄存器和读/写信号等控制寄存器。在C1周期中,如果DMA控制器有访内请求,可将地址、数据等信号送到总线上。在C2周期中,如CPU有访内请求,同样传送地址、数据等信号。事实上,对于总线,这是用C1,C2控制的一个多路转换器,这种总线控制权的转移几乎不需要什么时间,所以对DMA传送来讲效率是很高的。

这种传送方式又称为 透明的DMA 方式,其来由是这种DMA传送对CPU来说,如同透明的玻璃一般,没有任何感觉或影响。在透明的DMA方式下工作,CPU既不停止主程序的运行,也不进入等待状态,是一种高效率的工作方式。当然,相应的硬件逻辑也就更加复杂。

ADSP芯片中的DMA

此处仅以《HWR》文件做参考。

  1. 外围设备可以通过DMA(控制器)访问缓存,但其逻辑操作会有所区别。
  2. 在DMA中,缓存器状态与中断没有差别。相反,不管是否归零,DMA计数寄存器都会生成一个中断。
  3. DMA控制器的确认机制与外设不同。
  4. 外部接口拥有两个可以控制 SDRAM/DDR2异步内存接口(AMI,Asynchronous Memory Interface)的DMA通道。AMI控制器通过额外的8/16bits数据宽度以支持DMA;SDRAM/DDR2 通过额外的16bits数据宽度以支持DMA。
  5. 外部接口DMA通过不同的寻址类型(由内向外或由内向内)以支持两种不同的DMA通道。

External ports

外部接口(External ports)具有以下特征:

  1. 支持两种DMA通道
  2. 支持4种模式:标准模式、可以自由选择方向的链式模式(chained mode)、点选列表模式(tap list mode)(Scatter 或 Gather)、延迟线模式(delay line mode)(写入以读取)
  3. 所有以上模式可以循环运行(operate in circular fashion);且在循环模式下,一些模式允许回写索引指针,以正确寻址下一个传输控制块(TCB)
  4. 支持由内向外 由内向内寻址。

寻址

外部接口DMA不仅支持由内向外寻址,还支持由内向内寻址。通过所有外部参数寄存器的内部地址索引以完成该项任务。DMA控制器通过地址以辨别传输(工作)而不是通过额外的控制位设置(control bit setting)。

注意:如果使用内部或外部索引地址,DMA通道的优先级将会改变。

SHARC芯片支持另一种具有更高优先级,但是只支持标准DMA模式的索引模式,即由内向内的DMA索引模式。

注意:DMAC,即Directory Memory Access Control (Rigister),直接内存访问控制寄存器。

TCB

1
2
3
4
5
6
7
8
9
/* TCB = "Transfer Control Block" */
/* TCB format: ECx (length of destination buffer),
EMx (destination buffer step size),
EIx (destination buffer index (initialized to start address)),
GPx ("general purpose"),
CPx ("Chain Point register"; points to last address (IIx) of next TCB to jump to upon completion of this TCB.),
Cx (length of source buffer),
IMx (source buffer step size),
IIx (source buffer index (initialized to start address)) */
image-20210701013537361

image-20210629155207745

image-20210629160318759

Others

DMA、TCB、SPORT之间的关系

DMA,Directly Memory Access,直接内存访问。

TCB,Transfer Control Block,传输控制块。

SPORT,Serial Port,串行接口。

Serial Peripheral ,即串行外设。

Clock、Arbitration、PLL、prescale

《HWR》第884页——PLL

PCLK

CLKIN

LATENCY

TWI 效果延迟(时间)

在TWI寄存器设置后,其效果延迟大概是 1.5到2个PCLK周期。

image-20210525153855627

ASM("NOP")

blog.csdn.net

asm()作用

将函数内部的参数翻译为汇编指令,在C语言环境下直接使用汇编指令执行。

  • asm("nop")是内嵌汇编做空指令延时用的;

  • nop是一个空等待汇编指令,这个指令执行时,单片机是什么也不做,仅仅起一个时间延时作用。

CC2530属于8051系列单片机,asm(“nop”)执行的是一条空指令(单周期指令),占用时间是一个机器周期,晶振为32Mhz。

于是,机器周期=12*1/32=0.375us ; 即一句asm(“nop”)延时了0.375us。

时钟周期

时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。

在一个时钟周期内,CPU仅完成一个最基本的动作。对于某种单片机,若采用了1MHZ的时钟频率,则时钟周期为1us;若采用4MHZ的时钟频率,则时钟 周期为250us。由于时钟脉冲是计算机的基本工作脉冲,它控制着计算机的工作节奏(使计算机的每一步都统一到它的步调上来)。显然,对同一种机型的计算机,时钟频率越高,计算机的工作速度就越快。具体计算就是1/fosc。也就是说如果晶振为1MHz,那么时钟周期就为1us;6MHz的话,就是1/6us。

8051单片机把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。

机器周期

在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。

8051系列单片机的一个机器周期同6个 S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个 状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。 具体计算为:时钟周期 X cycles。如果单片机是12周期的话,那么机器周期就是T×12。假设晶振频率为12M,单片机为12周期的话,那么机器周期就是1us。

例如外接24M晶振的单片机,他的一个机器周期=12/24M 秒;52系列单片机一个机器周期等于12个时钟周期。设晶振频率为12MHz时,52单片机是12T的单片机,即频率要12分频。12M经过分频变为1M,由T=1/f,即一个机器周期变为1us。

指令周期

执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期也不同。通常,包含一个机器周期的指令成为单周期指令,比如CLR,MOV等等。包含两个机器周期的指令称为双周期指令。另外还有4周期指令,比如乘法和除法指令。对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

总线周期

由于存贮器和I/O端口是挂接在总线上的,CPU对存贮器和I/O接口的访问,是通过总线实现的。通常把CPU通过总线对微处理器外部(存贮器或 I/O接口)进行一次访问所需时间称为一个总线周期。

总结一下,时钟周期是最小单位,机器周期需要1个或多个时钟周期,指令周期需要1个或多个机器周期;机器周期指的是完成一个基本操作的时间,这个基本操作有时可能包含总线读写,因而包含总线周期,但是有时可能与总线读写无关,所以,并无明确的相互包含的关系。 指令周期:是CPU的关键指标,指取出并执行一条指令的时间。一般以机器周期为单位,分单指令执行周期、双指令执行周期等。现在的处理器的大部分指令(ARM、DSP)均采用单指令执行周期。机器周期:完成一个基本操作的时间单元,如取指周期、取数周期。时钟周期:CPU的晶振的工作频率的倒数。

问题

个人对TWI作为主设备时,数据的发送流程框图的理解如下:

  • TWI在需要发送数据时,才生成TWI时钟信号,通过SCLK线(对应评估板上的 DPI11, 以及下图的 TWI_CLK_PBEN_O )输出。
  • 需要传输的数据通过TWI接口写入FIFO中(对应的寄存器是TXTWI8 ),并通过SDA线(对应21479评估板上的 DPI12 , 以及下图的 TWI_DATA_PBEN_O )输出,从机收到数据后通过SDA线(对应下图的 TWI_DATA_ I)返回确认(ACK)信息。
    • TWIIRPTL 寄存器中,TWIMCOM 位为1则指示TWI初始化完毕,TWITXINT 为1则指示FIFO寄存器有空位,如果为0则说明 TWIFIFOSTAT 寄存器中的 TWITXS 位没有变化,即数据无法通过SDA发送出去;TWIMERR 则指示主设备传输过程中存在错误,具体错误需要查看 TWIMSTAT 寄存器。
  • 查看 TWIMSTAT 寄存器可知,TWIMSTAT_REER 位为1,该位为1则指示传输缓冲区读取错误,传输移位寄存器需要数据而缓冲区为空。
  • 检查显示,TXTWI8 写入存在问题,写入语句 *pTXTWI8 = 0xAA; 执行后,观察寄存器窗口查看到数据仍为0x00。
image-20210607155906359
image-20210607163859502

参考

  1. DMA
  2. DMA原理介绍