(这部分重点推荐了 SHARC 处理器的一些外设单元的程序)
PCG(外设时钟发生器)编程
本部分主要讨论使用 PCG(精确时钟发生器)为 SHARC SPORT 提供时钟的注意事项。
- 使用 PCG 产生的信号为 I 2 S 模式的 SPORT 提供 FS 和 SCLK 信号时,需要配置 PCG 的延迟寄存 器,使信号时序与 I 2 S 协议时序一致。LRCLK 信号必须由串行时钟的下降沿驱动。 „
- 使用 PCG 为 TDM 模式的 SPORT 提供信号时,要求帧同步信号仅在一个串行 bit 时钟周期保持 有效。注意,TDM 模式的帧同步是电平触发的,而不是边沿触发。PCG 脉宽寄存器(PCG_PW) 应该置“1”,这样帧同步仅在一个串行时钟周期有效。在这样的配置下,由于帧同步是单串行时 钟周期有效,SPORT 是使能还是再次使能的状态都没关系。如果帧同步无效期间,SPORT 被使能,需要等待直到下个有效帧同步信号。在 PCG 配置需要 50%工作周期的系统下,使用 DAI 中断来使能 SPORT。
假设 PCG 帧同步和时钟信号在 SPORT 使能或再次使能前启动,由于串口可以在同步和时钟信 号启动后的任何时候使能,可能有以下情形发生:串口在任何有效同步信号采样时,开始锁存(接 收机情形)或驱动数据(发送机情形)。注意,帧同步信号在 TDM 模式是电平触发而不是边沿触发 的。这样的情况会在串口禁止然后重新使能下反复发生,以致失去同步。这可能导致通道移位 或者数据丢失。启动串口的正确过程应该是等待帧同步信号无效沿,然后在帧同步信号无效期 间使能串口。这就保证了串口在帧同步信号有效电平期间采样数据。
这个过程还应该在串口禁止和重新使能的时候采用,从而保证串口不会在有效帧的中部采样数 据。这个操作由以下过程实现。PCG 帧同步映射到 DAI 中断。帧同步无效边沿触发 DAI 中断, 这意味着帧同步信号会在一段时间无效,串口应该在帧同步信号无效期间启动,或者执行串口 禁止和重新使能时操作。
使用 IDP 使能 I2S(数据输入口)
使用 IDP 从外面的设备接收数据,配置成 I2S 模式接收数据时,需要按照一定步骤。如果不按此步 骤操作,可能导致通道漂移或交换。
1. 将帧同步信号通过 SRU(信号路由单元)连接到 DAI 中断。
2. 将中断配置成帧同步无效边沿触发。
3. 等待 DAI 中断,在中断服务子程序中使能 IDP 端口。
4. 通过读 DAI 中断锁存寄存器清除 DAI 中断。
这个步骤可以保证 IDP 端口在适当时间被使能,从而避免在接收数据时发生通道漂移或交换的情况。
DAI 中断
不同于其它中断,DAI 中断不是在 DAI 中断子程序中自动被清除的。一旦锁存,中断标志将保持直 到通过读 DAI 中断锁存寄存器显式地清除锁存状态。DAI 中断通过读取 DAI 锁存寄存器被清除。如 果此操作没有发生,程序将在每次退出中断后再次进入 DAI 中断服务子程序。
在 DMA 中断服务子程序中禁止外设功能
SHARC 处理器外设支持 DMA 数据传输模式。DMA 中断在 DMA 传输计数器终止时发生。当一个 外设被配置为接收数据时,DMA 计数器在所有数据被接收并且搬移到内部内存中以后终止。当外设被配置为发送数据,即使 DMA 计数器终止并产生中断,数据还保存在 DMA FIFO 中。如果软件在 ISR 中关闭 DMA 和外设,应该先查询 DMA FIFO 状态。当 FIFO 为空时,可以安全关闭外设,否则 会导致数据丢失。
SPORT/SPI 双触发
这部分仅适用于 ADSP-21367/8/9 和 ADSP-2137x 处理器。假定 SPI 用于内核模式的数据传输。当内 核遇到传输缓存空的状态时,即产生发送中断。在发送中断子程序中,软件将写一个新的数值到发 送缓存中,然后从中断返回。在此情况,从 ISR 返回后,处理器再次检测到发送缓存的空状态,然 后重新进入 SPI 发送中断服务子程序。这样的状态都是由于高度流水线的 IOP 写操作。写入发送缓 存以后,直到数据真正被发送以及传输缓存状态变化到“非空”状态,需要 10 个内核时钟周期。因此, 在此情况下,从中断子程序返回需要延迟至少 10 个内核时钟周期。
SHARC PLL 编程
ADSP-2116x SHARC 处理器中,使用 CLKCFG(时钟配置)信号配置 PLL(以及内核时钟和外部端口时 钟频率)。对于 ADSP-2126x,ADSP-2136x 和 ADSP-2137x SHARC 处理器,需要额外的外部 CLKCFG 信号,PLL 可以通过软件配置。这样,软件可以利用电源控制寄存器(PMCTL)中的 PLL 乘法器和分 频计数器实现多样的可编程比率。这也为用户通过软件改变内核频率提供了灵活性。为恰当地配置 PLL,推荐使用 Managing the Core PLL on ADSP-2136x SHARC Processor(EE-290)[3]中记述的方法。 EE-290 还提供了代码例程,以及利用 elfar 工具集成 C 可调用的 PLL 配置函数到库中的详细步骤。 确保 DIVEN 位在进入和退出 by-pass 模式前被清除。
SPORTs 和门控时钟设备的接口
有的系统设计需要将SHARC的SPORT和诸如数据转换器或SPI主处理器之类的门控时钟设备接口。 为保证与门控时钟设备间的恰当操作和数据传输,Interfacing Gated Clocks to ADSP-21065L SHARC Processors (EE-244)Interfacing AD7676 ADCs to ADSP-21065L SHARC Processor(EE-247)以及 Interfacing AD7676 ADCs to ADSP-21365 SHARC Processor(EE-248)可供参考,同时还有例子说明。
调试技巧
俗话说,防患于未然。系统设计工程师和软件工程师应该经常查看他们打算使用的 SHARC 处理器 的异常文档。了解已知硅片问题和建议解决方法,也缩短了开发周期。对于必须从硬件(例如电路板 设计)上解决的问题,它能够帮助您避免昂贵和长时间的电路再版。
这一部分讲述了通常可能遇到的问题以及调试技巧。这些技巧能够弥补您的其它调试努力。以下是 最常见的情况。
引导失败
用户可以使用 JTAG ICE 下载执行应用程序,却不能在引导装载下执行应用程序,这是十分常见的 案例。调试时请注意以下几点:
- 检查处理器的 BOOTBFG 管脚,确保各自连在适当的数字电压电平高或者低。如果使用电阻来 增加改变引导模式灵活性,确保阻值选择正确。检查电平的最好方法就是通过示波器检测处理 器管脚。
- 确保 JTAG ICE 的/TRST 信号通过电路板接地。不要让此信号线悬空。悬空可能导致引导失败或 其它内存访问失败。
- 确保在生成启动文件(.LDR)前使用正确的引导内核。如果使用改进的引导内核,请使用 VisualDSP++®应用例程中(例如标志锁定)提供的默认引导内核并使用简单的例子(比如管脚切换) 来确认基本的引导装载。
- 确保在生成.LDR 文件时,选择正确的参数。选择不合适的参数可能导致引导失败。
- 检查是否使用 ICE(在线硬件仿真器)引导装载代码。连接 ICE 到目标板,打开 VisualDSP++的仿 真环境。打开目标板开始引导装载。把环境从“simulator”改变成“emulator”,观察汇编窗口。它 显示是否从外部资源装载引导应用程序。如果没有看到期望的代码,引导失败。还可以使用本 方法检查处理器是否下载初始的 256 个指令。
- 确保上电的重启时序与数据手册一致。
- 检查 CLKCFG 信号,保证 PLL 没有过驱动。确保所选的比例和 CLKIN 频率没有超过内核时钟 的预定范围。
- 检测与引导相关的信号,例如/BMS(ADSP-21367/8/9 和 ADSP-2137x 的/MS1),/RD,ADD 以及 总线上的 DATA。检查板上电路完整性,是否板上有开路或者短路情况。还能观察 RSTOUT 来 确定 PLL 是否锁定。
- 检查引导装载操作过程中外部总线是否有总线冲突。例如,以 ADSP-21367/8/9 和 ADSP-2137x 处理器为例,/MS2 和/MS3(如果使用)应该有外部的上拉电阻。否则,接口到/MS2 和/MS3 的内 存驱动总线,在引导期间导致总线冲突。
应用崩溃
大部分情况,这类问题是在运行应用程序时导致软件崩溃。有时也会出现处理器停在不明地址,或 重新开始整个应用。导致此结果的因素有以下几个:
- 处理器执行间接访问,可能导致.LDF 文件定义的堆栈空间被破坏。这可能导致程序在运行时所 需要的关键数据被损坏,从而导致软件崩溃。由于可能导致破坏,保证应用程序不会执行这样 的内存访问。程序运行时,可以通过 ICE 利用 V, isualDSP++的硬件断点特性来调试。如果处理器 执行了这些区域的非法访问,这些访问会被检测到。
- „ 检查应用程序是否执行了破坏性的/无意的系统寄存器或 IOP 寄存器访问,这可能导致应用暂停 或者重新开始。例如,检查应用程序是否在代码中设置了软重启/重新引导。检查间接跳转或调 用。
- 由于不合适的退耦/旁路电容,电路板可能出现无法预计的行为,常常是某段代码错误执行。保 证电路板上处理器和其它设备使用了合适的退耦电容和散电容(电容型号/电容值以及放置点都 是关键),这样才能在系统运行期间提供有效的电流/功率切换。频繁的内核或 I/O 切换需要额外 的切换电流。如果未提供相应电流,一些系统关闭,应用崩溃或特定代码的错误执行的现象可 能发生。
- 很好的习惯就是使用校验和验证确认引导装载应用程序的正确性,确保数据和代码是完全正确 下载。bit 错误可能在噪声环境中发生。由于 bit 错误,处理器可能执行错误(非法)的指令或处理 错误数据,从而导致不可预料的行为。
- 当不作为循环缓存使用时,确保 DAG(数据地址发生器)的长度寄存器(Lx)是显式被初始化为 0。 当使用 ICE 下载和执行代码,相关的症状可能没被注意到,因为 ICE 会将长度寄存器初始化为 0,这样症状只有在作为独立系统进行引导装载和执行时才被发现。
- 查找特定工具版本(或升级包)下,VisualDSP++编译器的已知问题。编译器可能生成错误代码, 导致无法预料的行为。建议您使用最新版的 VisualDSP++。
最新版 VisualDSP++的发布记录放在 Analog Device 网站: www.analog.com/processors/sharc/evaluationDevelopment/crosscore/toolsUpgrades/index.html
同时,旧版本 VisualDSP++的发布记录位于: www.analog.com/processors/sharc/evaluationDevelopment/crosscore/toolsUpgrades/archives.html
数据丢失
这是关于使用 SPORT,SPI 或其它串形接口接收数据时,丢失开始的几个数据。这种情况下,确保 从机总是在主机开启之前启动。主机提供诸如串行时钟和帧同步信号,从机从主机接收这些信号。
数据损坏
这是关于使用 SPORT,SPI,链接端口等串行链路接收数据时发生数据损坏的情况。这种情况下, 确认信号完整性,考虑由于超调/欠调以及由于串话或其它噪声源产生的噪声毛刺。尝试在可能的地 方使用内部回环来排除处理器功能性问题。在无限持续模式下使用示波器查找 SI 问题。在此情况下, 尝试对串行时钟,帧同步等信号使用终端(尽可能是串行终端)。有时,尽管在设计中有其它功能性建 议弥补,还是出现接收通道的漂移/交替的问题
VisualDSP++的小问题
当更换(或升级)VisualDSP++版本时,会出现一些问题。在此情况下,检查编译器的差别,已知的工 具问题等。尝试关闭代码优化以便进一步找到编译器优化相关的问题。从一开始尽可能使用最新的 VisualDSP++版本/升级版。 |