This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/TMS320C6748:GPIO 读/写代码

Guru**** 2535750 points
Other Parts Discussed in Thread: TMS320C6748

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/613403/ccs-tms320c6748-gpio-read-write-code

器件型号:TMS320C6748

工具/软件:Code Composer Studio

我们正在尝试从 TMS320C6748开发板上的 GPIO 引脚读取数据、因此我们当前将电源连接到 J14上的引脚3、下面的代码在 CCS 7中以调试模式运行。 它不会感应电压的变化。 我们的 GPIO 引脚代码配置是否有问题? 在该板上、我们可以在哪里访问 GPIO 引脚? 此外、我们知道开关5、6、7、8也以某种方式连接到 GPIO、是否有人可以详细说明这一点?

提前感谢您的回答!

/**

* main.c
*

//#include "hw_emifa2.h"
//#include "hw_types.h"
//#include "SoC_C6748.h"
//#include "uartStdio.h"
//#include "interrupt.h"
//#include "EMIFA.h"
//#include "evmC6748.h"
#include "hw_gpio.h"
#include "gpio.h"
#include
#include "SoC_C6748.h"
#include "lcdkC6748.h"

#define _SOC_C6748_H_


//#define EMIFA_READ_SETUP_RESETVAL (0x00)
//#define EMIFA_READ_STROBE_RESETVAL (0x00)
//#define EMIFA_READ_HOLD_RESETVAL (0x00)
//#define EMIFA_TA_RESETVAL (0x00)


int main (空)

printf ("hello world\n");
while (1){
printf ("%d\n"、GPIOPinRead (SOC_GPIO_0_regs、0x03));


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    假设 LCDK、硬件组件映射到这些信号。
    SW1:5 -> ARX9/MCBSP1_DX1/GPIO0[1]
    SW1:6 -> ARX10/MCBSP1_DR1/GPIO0[2]
    SW1:7 -> ARX11/MCBSP1_FSX1/GPIO0[3]
    SW1:8 -> ARX12/MCBSP1_FSR1/GPIO0[4]
    J14:3 -> EMA_D_0/GPIO4[8]

    您需要根据以下条件对其进行多路复用:
    SPRUH79C
    TMS320C6748 DSP
    技术参考手册
    10.5.10.2引脚复用控制1寄存器(PINMUX1)
    10.5.10.10引脚复用控制9寄存器(PINMUX9)

    StarterWare GPIO 多路复用器配置贯穿整个代码、但以下是一些:
    platform\lcdkC6748\gpio.c
    platform\evmC6748\gpio.c
    examples\evmC6748\gpioCardDetect.c

    以下是使用 StarterWare 相当长的可能代码定义:

    #include "hw_syscfg0_C6748.h"
    
    unsigned int savePinmux = 0;
    
    savePinmux = HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (1));
    
    savePinmux &&=~(SYSCFG_PINMUX1_PINMUX1_27_24);
    savePinmux ||(SYSCFG_PINMUX1_PINX1_PINMUX1_24<GPSCFG_PINMUX1_24_1_24_GPIO24_<_24_IPX1_24)
    SYSCFG_PINMUX1_PINMUX1_27_24_SHIFT);
    
    savePinmux &=~(SYSCFG_PINMUX1_PINMUX1_23_20);
    savePinmux ||(SYSCFG_PINMUX1_PINMUX1_23_20_GPIO0_2 <<
    SYSCFG_PINMUX1_PINMUX1_23_20_SHIFT);
    
    savePinmux &=~(SYSCFG_PINMUX1_PINMUX1_19_16);
    savePinmux ||(SYSCFG_PINMUX1_PINMUX1_19_16_GPIO0_3 <<
    SYSCFG_PINMUX1_PINMUX1_19_16_SHIFT);
    
    savePinmux &=~(SYSCFG_PINMUX1_PINMUX1_15_12);
    savePinmux ||(SYSCFG_PINMUX1_PINMUX1_15_12_GPIO0_4 <<<
    SYSCFG_PINMUX1_PINMUX1_15_12_SHIFT);
    
    HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (1)= savePinmux;
    
    savePinmux = HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (1))= SYSCXINMUX 9
    
    (
    9)+ SYSCMUX8_INMUX 9 (9)= SYSCMUX 9 (9 ~ INMUX);SYSCMUX IN9 INMUX IN9 (9)= SYSCMUX IN9 (9)+ SYSCMUX IN9 (9)_INMUX 9)
    SYSCFG_PINMUX9_PINMUX9_31_28_SHIFT);
    
    HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (9)= savePinmux;
    
    // StarterWare GPIO 使用基于1的编号。
    GPIOPinRead (SOC_GPIO_0_regs、2);//GPIOPinRead
    (SOC_GPIO_0_regs、3);//GPIOPinRead
    (SOC_GPIO_0_regs、3) 4);/GP0[3]
    GPIOPinRead (SOC_GPIO_0_regs、5);/GP0[4]
    GPIOPinRead (SOC_GPIO_0_regs、73); //GP4[8]-> 4X16+8+1
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    忘记提到您可能也需要这样做
    -启用 GPIO 控制器的电源和时钟、例如
    PSCModuleControl (SOC_PSC_1_regs、HW_PSC_GPIO、
    PSC_POWERDOMAIN_AUSE_ON、
    PSC_MDCTL_NEW_ENABLE);
    -将 GPIO 配置为输入,例如
    GPIODirModeSet (SOC_GPIO_0_regs、2、GPIO_DIR_INPUT);
    GPIODirModeSet (SOC_GPIO_0_regs、3、GPIO_DIR_INPUT);

    GPIODirModeSet (SOC_GPIO_0_regs、4、GPIO_DIR_INPUT);
    GPIODirModeSet (SOC_GPIO_0_regs、5、GPIO_DIR_INPUT);

    GPIODirModeSet (SOC_GPIO_0_regs、73、GPIO_DIR_INPUT);
    默认情况下、GEL 脚本和加电可能不需要执行此类初始化。 但在您独立运行时需要它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这真的很有帮助! 谢谢! 您能否解释一下多路复用代码是如何工作的、以及我将如何对其进行调整以使其适用于 EMA 引脚而不是 GPIO 引脚?

    再次感谢你们!

    Melissa
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    多路复用代码只是对 PINMUX 寄存器的读-修改-写操作。

    savePinmux = HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (1));//读取

    savePinmux &=~(SYSCFG_PINMUX1_PINMUX1_23_20);//清除位字段

    //设置位字段。
    savePinmux ||(SYSCFG_PINMUX1_PINMUX1_23_20_GPIO0_2 <<
    SYSCFG_PINMUX1_PINMUX1_23_20_SHIFT);

    HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (1))= savePinmux;//写入

    读取-修改-写入是为了保留其他引脚的现有设置。 没有任何东西阻止您只向 PINMIX 寄存器写入一个常数。

    例如、EMA 引脚众多、占用了整个 PINMUX 寄存器。 EMA 的函数代码通常为1。 例如、EMA_D[0]至 EMA_D[7]的多路复用。

    HWREG (SOC_SYSCFG_0_regs + SYSCFG0_PINMUX (9))= 0x11111111;// EMA_D[0]- EMA_D[7]

    在手册中查看其他寄存器以了解 EMA_D 和 EMA_A 引脚。

    编辑:更正代码片段。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们如何在不使用 EIMFA 连接 SDRAM 等外部设备的情况下从 EMA 数据引脚读取数据? 我们只需将数据线连接到电路板背面的 EMA 引脚。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我还对该 DSP 板的 GPIO 配置有一些问题、这些问题与 Melissa 先前的一些问题有关。 是否可以同时从多个 GPIO 引脚读取数据? 我看到 StarterWare 文件夹中的某个 C 文件中有一种方法、但是我无法使其正常工作。 我的开发板只有在具有 AM33xx SoC 时才能执行此操作?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Joseph P、

    由于您有另外两个线程在运行、并且您的问题与此线程不完全相同、请期望其他线程上有响应、以便此线程可以继续专注于 Melissa。

    此致、
    RandyP
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    梅丽莎

    请参阅数据表以查找引脚复用选项。 然后、您必须使用 Norman 解释的代码将 EMA_D0引脚设置为 GPIO、而不是 EMIFA 函数。 您的 GPIO 外设需要配置为该引脚作为输入,然后您应该能够使用 GPIOPinRead()函数读取该引脚。

    此致、
    RandyP
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    @Melissa Groenewold
    EMIF_A 控制器可配置为寻址 NOR 或 SRAM 等简单异步存储器器件。 SDRAM 和 NAND 是一个更复杂的选择。 您的异步存储器件必须处理存储器映射器件的所有信号、例如。 地址、数据、读取、写入、使能、 等等 理论上、除芯片选择和数据线外、大多数信号都可以保持未使用状态。 我认为 EMIF_A 有4个? 映射到4个存储器范围的芯片选择。 则可以直接按地址寻址您的器件。 DMA 可以实现最快的传输速度。

    您可能最好将引脚用作 GPIO 引脚组、而不是 EMIF 引脚。 请参阅 Joseph P 主题、了解通过 EMIF 使用 GPIO 的原因。 使用一组 GPIO 意味着您可以通过读取 GPIO 组输入寄存器来读取数据线路。 GPIO 的优势在于它们非常简单、易于配置和编程。 缺点是 GPIO 比 EMIF 慢得多。 我不认为使用 GPIO 可以实现 DMA。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    @Joseph P
    在适当尊重 Randy P 的情况下、我将在这里回答您的一个问题。 我很快就会看到所有这些相关帖子的模式、我喜欢参与另一个看起来是类项目的主题。

    与 GPIO 组操作相关的 StarterWare 代码不完整。 它具有组写入、但不具有组读取。 您已经注意到、AM33xx GPIO_v2.c 代码不是要参考的代码。 使用 gpio.c 作为基准。 您需要编写自己的组访问函数。 这非常简单。 只需查看《技术参考手册》即可。 为了保持简单、请将其编码到特定组、而不是通用参数化版本。

    如上所述、如果您需要吞吐量、EMIF 可能是更好的选择。 也就是说、如果您可以正确配置 EMIF、