ZHCAC41 February   2023 TMS320F280025C

 

  1.   摘要
  2.   商标
  3. 1引言
  4. 2串行端口设计方法
    1. 2.1 步骤 1:了解设计要求
    2. 2.2 步骤 2:识别至 CLB 逻辑块的所需输入
      1. 2.2.1 GPIO 输入限定
      2. 2.2.2 CLB 输入设置
    3. 2.3 步骤 3:识别来自 CLB 逻辑的所需输出
      1. 2.3.1 同步输出信号
      2. 2.3.2 输出信号调节
    4. 2.4 步骤 4:设计 CLB 逻辑
      1. 2.4.1 资源分配
      2. 2.4.2 在 CLB FIFO 和 MCU RAM 之间交换数据
      3. 2.4.3 CLB 逻辑状态和触发标志
        1. 2.4.3.1 状态/标志位
        2. 2.4.3.2 触发位
    5. 2.5 步骤 5 :仿真逻辑设计
    6. 2.6 步骤 6 :测试 CLB 逻辑
  5. 3示例 A:在音频应用中使用 CLB 输入和输出 TDM 流
    1. 3.1 示例概述
    2. 3.2 步骤 1:了解设计要求
    3. 3.3 步骤 2:识别至 CLB 逻辑块的所需输入
    4. 3.4 步骤 3:识别来自 CLB 逻辑的所需输出
    5. 3.5 步骤 4:设计 CLB 逻辑
      1. 3.5.1 资源分配
      2. 3.5.2 TDM 字计数器
      3. 3.5.3 FSYNC 和 DATA1 输出同步
    6. 3.6 步骤 5 :仿真逻辑设计
    7. 3.7 步骤 6 :测试 CLB 逻辑
      1. 3.7.1 硬件设置和连接
      2. 3.7.2 软件设置
      3. 3.7.3 测试输出建立时间和保持时间
      4. 3.7.4 测试数据完整性
  6. 4示例 B:在照明应用中使用 CLB 为 LED 驱动器实施定制通信总线
    1. 4.1 示例概述
    2. 4.2 步骤 1:了解设计要求
    3. 4.3 步骤 2:识别至 CLB 逻辑块的所需输入
    4. 4.4 步骤 3:识别来自 CLB 逻辑的所需输出
    5. 4.5 步骤 4:设计 CLB 逻辑
      1. 4.5.1 TX 逻辑块逻辑
      2. 4.5.2 RX 逻辑块逻辑
      3. 4.5.3 数据时钟
    6. 4.6 步骤 5 :仿真逻辑设计
    7. 4.7 步骤 6 :测试 CLB 逻辑
      1. 4.7.1 硬件设置和连接
      2. 4.7.2 软件设置
      3. 4.7.3 测试输出建立时间和保持时间
  7. 5参考文献

状态/标志位

状态/标志位让 CPU 可以轮询 CLB 逻辑的状态。例如,在 CLB 中断之后,CPU 可以轮询标志位以确定中断是由数据接收中断还是接收错误中断引起。

可以使用 HLC 寄存器来实施这些状态/标志位。但是,每个标志必须使用一个 HLC 寄存器,因为 HLC 不支持按位与和或指令。例如,HLC R0 寄存器中的非零值可用于指示接收中断,而 R1 中的非零值可用于指示接收错误。

注: HLC“INTR <tag>”指令和 CLB_INTR_TAG_REG 不能用于标志,因为此指令的后续使用会覆盖任何先前的标志值。

也可以通过直接读取不同 CLB 逻辑块的状态来确定 CLB 逻辑状态。例如,如果 FSM 配置为定义多个状态(例如 IDLE 和 ACTIVE),CPU 可以读取 S0 和 S1 的状态来判断 CLB 逻辑状态。

CPU 可以使用 CLB 存储器映射调试寄存器 CLB_DBG_Rn、CLB_DBG_Cn 和 CLB_DBG_OUT 来确定 CLB 内不同块的状态。以下代码块中显示了使用 HLC 寄存器作为状态位的示例。代码块使用 C2000ware driverlib 函数。

uint32_t chkIntFlag = CLB_getRegister(CCSI2_RX_TILE_BASE, CLB_REG_HLC_R1);
uint32_t rcvIntFlag = CLB_getRegister(CCSI2_RX_TILE_BASE, CLB_REG_HLC_R2);
uint32_t endIntFlag = CLB_getRegister(CCSI2_RX_TILE_BASE, CLB_REG_HLC_R3);

    ...

    // Receive interrupt
    if (rcvIntFlag & 0x1)
    {
        ...
        // Clear the receive interrupt flag register
        CLB_writeInterface(CCSI2_RX_TILE_BASE, CLB_ADDR_HLC_R2, 0x0);
    }

    // End interrupt
    if (endIntFlag & 0x1)
    {
        ...
        // Clear the end interrupt flag register
        CLB_writeInterface(CCSI2_RX_TILE_BASE, CLB_ADDR_HLC_R3, 0x0);
    }

    // Check error interrupt
    if (chkIntFlag & 0x1)
    {
        ...
        // Clear the check error interrupt flag register
        CLB_writeInterface(CCSI2_RX_TILE_BASE, CLB_ADDR_HLC_R1, 0x0);
    }