ZHCACT4 june 2023 AM2431 , AM2432 , AM2434 , AM2631 , AM2631-Q1 , AM2632 , AM2632-Q1 , AM2634 , AM2634-Q1 , AM263P2 , AM263P4 , AM263P4-Q1 , AM3351 , AM3352 , AM3354 , AM3356 , AM3357 , AM3358 , AM3358-EP , AM3359 , AM4372 , AM4376 , AM4377 , AM4378 , AM4379 , AM5706 , AM5708 , AM5716 , AM5718 , AM5718-HIREL , AM5726 , AM5728 , AM5729 , AM5746 , AM5748 , AM5749 , AM6411 , AM6412 , AM6421 , AM6422 , AM6441 , AM6442 , AM6526 , AM6528 , AM6546 , AM6548
在工业电机驱动系统中,通常需要多个器件或芯片以快速、低抖动、低延迟和同步的方式相互通信。典型的示例应用是使用标准接口(如串行外设接口)或物理层中的自定义协议(如 8b-10b 线路编码)进行驱动器内通信。
可编程实时单元 (PRU) 的独特之处在于,它可以使用 960 位宽的数据总线执行单周期功能,从而使用户在实时执行通信和控制应用时不会出现抖动。TI Sitara™ 处理器提供两种类型的 PRU 子系统:PRU-ICSS 和 PRU_ICSSG。PRU-ICSS 可用于 AM335x、AM437x 和 AM57x 系列。AM243x、AM65x 和 AM64x 上具有 PRU_ICSSG。
本应用手册介绍了如何使用 PRU 实现 8b-10b 线路编码,以实现 100Mbps 数据速率的驱动器内通信。本文档还介绍了用于高速信号传输的低电压差分信令 (LVDS) 接口和多点低电压差分信令 (M-LVDS) 接口。
Sitara™ and LaunchPad™are TMs ofTI corporate name.
Arm®is a reg TM ofArm Limited.
Other TMs
顾名思义,8b-10b 表示将 8 位数据作为 10 位符号发送,以实现直流平衡和有界差异。数据的五个低位被编码为一个 6 位组(5b 和 6b 段),三个高位被编码为一个 4 位组(3b 和 4b 段)。这些代码组连接在一起形成 10 位符号,该符号通过线路发送和接收,然后反向解码。该算法由 IBM 公司发明并获得专利。
为了平衡高频数据接收时的直流信号,插入的两个控制位有助于使至少 20 位的串中的 0 和 1 的计数差不超过 2,并且一行中不超过 5 个 1 或 0。此方案有助于在高频数据接收期间平衡直流信号,并减少对传输信号所需的通道带宽下限的需求。然而,使用 8b-10b 编码算法会给每个字符增加 25% 的开销。这种字符开销不是唯一的开销,但却是最重要的因素。图 1-1 显示了 8b-10b 编码示例。
通常,有四个表预先写入存储器,包括编码 5b-6b 表、编码 3b-4b 表、解码 6b-5b 表和解码 4b-3b 表。数据必须在发送之前使用查找表 (LUT) 进行编码,并在接收之后使用 LUT 进行解码。为了演示编码和解码数据,选择 Sitara™ AM243x LaunchPad™ 开发套件作为验证器件。HW_WR_REG8 函数可用于使用 Arm® 内核项目的 C 代码将四个表放入具有不同偏移地址的 PRU 动态随机存取存储器 (DRAM) 中,另请参阅以下代码。
uint32_t enc_5b6b = CSL_PRU_ICSSG0_DRAM1_SLV_RAM_BASE + ENC_5B6B_OFFS;
uint32_t enc_3b4b = CSL_PRU_ICSSG0_DRAM1_SLV_RAM_BASE + ENC_3B4B_OFFS;
uint32_t dec_5b6b = CSL_PRU_ICSSG0_DRAM0_SLV_RAM_BASE + DEC_5B6B_OFFS;
uint32_t dec_3b4b = CSL_PRU_ICSSG0_DRAM0_SLV_RAM_BASE + DEC_3B4B_OFFS;
//Encoding LUTs (input MSB first, output LSB first)
//LUT 5b/6b encoding
HW_WR_REG8(enc_5b6b + 0x00, 0x18);
...
//LUT 3b/4b encoding
HW_WR_REG8(enc_3b4b + 0x00, 0x04);
...
//Decoding LUTs (input LSB first, output MSB first)
//LUT 6b/5b decoding
HW_WR_REG8(dec_5b6b + 0x00, INVAL);
...
//LUT 4b/3b decoding
HW_WR_REG8(dec_3b4b + 0x00, INVAL);
...
数据可以通过使用加载字节突发 (LBBO) 指令的 PRU 固件项目中的 LUT 进行编码。LBBO 指令用于将内存中的数据块读入寄存器文件。REG_TMP11 寄存器存储 LUT 头地址,REG_ENC 寄存器存储原始数据和编码数据。请参阅以下对 8 位数据 (0x34) 进行编码的代码:
Ldi REG_ENC.b0, 0x14 ;raw data 5b LSB
ldi REG_TMP11, (PDMEM00+LUT_5b6b_ENC) ; TEMP11 for 5b/6b LUT header
lbbo ®_ENC.b3, REG_TMP11, REG_ENC.b0, 1 ; FNC.b0 for original 5 bit -data, ENC.b3 for encoded 6 bit
ldi REG_ENC.b1, 0x01 ; raw data 3b MSB
ldi REG_TMP11, (PDMEM00+LUT_3b4b_ENC) ; TEMP11 for 3b/4b LUT header
lbbo ®_ENC.b2, REG_TMP11, REG_ENC.b1, 1 ; FNC.b1 for original 3 bit -data, ENC.b2 for encoded 4 bit
0x34 的五个低位为 0x14,这些位 会立即加载到 REG_ENC 的字节 0 中。在 LUT 之后,将六个编码位写入 REG_ENC 的字节 3 中。0x34 的三个高位为 0x01,这些位会直接加载 到 REG_ENC 的字节 1 中。在 LUT 之后,将四个编码位写入 REG_ENC 的字节 2 中。
图 2-1 显示了原始数据和编码数据的 REG_ENC 寄存器分布。
解码过程与编码过程几乎相同。解码过程还将 LBBO 指令与 LUT 一起,用于在接收到编码数据之后进行解码。REG_TMP11 寄存器存储 LUT 头地址,REG_DEC 寄存器存储编码数据和解码数据。
将接收六个编码位,并将其移至 REG_DEC 的字节 1 中。在 LUT 之后,将这五个解码位写入 REG_DEC 的字节 2 中。将接收四个高位,并将其移入 REG_DEC 的字节 0 中。在 LUT 之后,将这三个解码位写入 REG_DEC 的字节 3 中。要将寄存器的两个字节中的 10 位数据合并为 8 位数据,REG_DEC 的字节 3 需要左移 5 位,并与 REG_DEC 的字节 2 逻辑相加。最终解码的 8 位数据存储在 REG_DEC 的字节 0 中。以下代码显示了解码过程。
ldi REG_TMP11, (PDMEM00+LUT_5b6b_DEC) ; TEMP11 for 5b/6b LUT header
lbbo ®_DEC.b2, REG_TMP11, REG_DEC.b1, 1 ; decode 6b
ldi REG_TMP11, (PDMEM00+LUT_3b4b_DEC) ; TEMP11 for 3b/4b LUT header
lbbo ®_DEC.b3, REG_TMP11, REG_DEC.b0, 1 ; decode 4b
lsl REG_DEC.b3, REG_DEC.b3, 5 ; shift left 5 bit
add REG_DEC, REG_DEC.b2, REG_DEC.b3 ; combine to 8 bit data
图 2-2 显示了编码数据和解码数据的 REG_DEC 寄存器分布。
PRU 模块接口由 PRU 内部寄存器 30 和 31(R30 和 R31)组成。图 2-3 显示了 PRU 模块接口,以及 R30 和 R31的功能。寄存器 R31 用作专用 PRU 通用输入 (GPI) 引脚与 PRU 中断控制器 (INTC) 之间的接口。读取 R31 可使用 PRU 实时状态接口返回来自 GPI 引脚和 PRU INTC 的状态信息。写入 R31 会通过 PRU 事件接口生成 PRU 系统事件。寄存器 R30 用作与专用 PRU 通用输出 (GPO) 引脚的接口。
PRU 事件接口直接从 PRU 的内部算术和逻辑单元 (ALU) 发送脉冲事件信息。这些事件从 PRU 中导出,需要连接到片上系统 (SoC) 级别的系统中断控制器。固件可使用事件接口创建从 PRU 到 Arm® 内核(主机处理器)的软件中断。例如,当通信帧封装完成向 Arm® 发送中断信号时,可能会生成该事件。
PRU 实现了一个支持以下通用输入模式的增强型通用输入或输出 (GPIO) 模块:直接输入、16 位并行采集、28 位串行移入和 MII_RT(以太网 MAC 接口)。寄存器 R31 用作通用输入的接口。R31 还支持两种通用输出模式:直接输出和移出。寄存器 R30 用作通用输出的接口。
PRU 增强型通用输出 (EGPO) 可配置为以移出模式进行数据传输,数据在 PRU GPO1 (CLOCKOUT) 的每个上升沿移出 PRU GPO0 (DATAOUT)。移位速率由应用于 PRU 内核时钟的两个级联分频器的有效除数控制。为了通过 8b-10b 编码实现 100Mbit 数据速率,必须将 125MHz 时钟与除以 2 的 250MHz 内核时钟结合使用。移出模式支持两种时钟子模式:自由运行时钟模式(默认)和固定时钟计数模式。对于固定模式,数据包长度最多可配置为 255 位,并且在 ICSSG_GPECFG<n>_REG 寄存器的位 17 中设置了一个额外的 PRU_GPO_SHIFT_CLK_DONE 标志。
两个 16 位影子寄存器(GPO_SH0 和 GPO_SH1)用于支持乒乓缓冲器。每个影子寄存器都有独立的负载控制,这些负载控制可通过 PRU R30 寄存器的位 29 和 30 进行编程。请注意,GP_SH0 寄存器需要加载 0x8000 作为起始帧,因为移入 GPI 检测到起始位为第一个 1 或 0,而该起始位不包含在数据帧中。加载起始帧后,可以将更新的数据不受任何限制地加载到 GP_SH0 中。图 2-4 显示了 PRU 移出模式的方框图。
图 2-5 显示了 PRU GPO 移出模式的编程模型。
可为数据接收配置 GPI 移入模式。在 28 位移入模式下,对通用输入引脚 PRU<n>_DATAIN 进行采样,并根据内部时钟脉冲移入一个 28 位移位寄存器。该寄存器填充最低有效位 (LSB) 顺序(从位 0 到位 27),然后溢出到一个位桶中。28 位寄存器映射到 pru<n>_r31_status [0:27]。移位速率由应用于 PRU 内核时钟的两个级联分频器的有效除数控制。与移出模式类似,选择具有 250MHz 内核时钟的 125MHz 采样时钟。由于移位计数器,CNT_16 在接收到起始位后每 16 个移位时钟样片设置并自清零一次,因此只能将 28 位移位寄存器中的 16 位大小用作接收缓冲器。
图 2-6 显示了 PRU GPI 移入模式的方框图,图 2-7 显示了编程模型。
为了验证使用 PRU_GPIO 移位模式发送数据的准确性,由 PRU1 内核的移出 GPO 使用前 16 位 0x8000(数据帧在第一个 1 之后)发送 64 位宽编码数据 (0x8000 0012 0034 0056),并由 PRU0 内核的移入 GPI 接收。然后,数据从 PRU0 寄存器文件移动到从地址 0x00000000 开始的 PRU0 RAM。移出和移入时钟都是 125MHz。图 2-8 显示 PRU1 内核收到正确数据,没有错误。
3 通道外设接口还可以支持类似于 GPIO 移位模式的数据传输。由于本应用手册重点介绍 GPIO 移位模式,因此本节仅简要介绍 3 通道外设接口。可以在 AM62x 处理器器件版本 1.0 德州仪器 (TI) 产品系列技术参考手册中找到有关 3 通道外设模式的详细介绍。
PRU 使用 R30 和 R31 寄存器与外设接口 (I/F) 连接。发送 (TX) 先入先出 (FIFO) 缓冲器是 32 位,并且可以连续模式操作,同时接收具有最大 8 倍过采样的 4 位大小 (RX) FIFO 缓冲器。TX 和 RX 时钟均可由 ICSS_UART_CLK 或 ICSS_CORE_CLK 提供。TX 和 RX 时钟有两个独立的时钟分频器,每个时钟分频器可通过两个级联分频器进行配置。图 2-9 显示了单通道外设 I/F 的方框图,其中其他 2 个通道是相同的。
可在 AM62x 处理器器件版本 1.0 德州仪器 (TI) 产品系列技术参考手册中找到三外设模型的基本编程模型。