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.

[参考译文] TMS320F28388D:OE、WEN、CS 的 EMIF 配置

Guru**** 1831610 points
Other Parts Discussed in Thread: TMS320F28388D, ADS8686S
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1309747/tms320f28388d-emif-configuration-of-the-oe-wen-cs

器件型号:TMS320F28388D
主题中讨论的其他器件: ADS8686S

早上好!

我正在使用扩展坞中的 TMS320F28388D 的 EMIF 实现并行通信、以及  具有并行总线的16位外部 ADC ADS8686S、以写入其寄存器、读取转换等...

有趣的是、我不使用地址总线、而是异步通信、并且我要写入的 ADC 寄存器的方向直接位于数据总线中。  

由于扩展卡的配置、无法使用16位数据总线通信、因为 EMIF1的 D9在扩展卡中没有外部引脚、因此我必须使用 D0-D7中的数据位。 ADC 提供字节并行接口通信(8位并行通信)、因此这是可能的。

我觉得奇怪的是以下问题:当我使用 EMIF 接口与 ADC 通信时、这款16位 ADC 具有以下字节并行通信的时间原理图

如第一张图片所示、当使用8位并行通信时、由于 ADC 为16位、因此我必须读取两倍的 ADC 以读取整个 (这看起来是4条读取通道、因为它是双通道 ADC 并且有2个通道是同时采样的)。 与在 ADC 中写入寄存器相同、我必须写入两次8位才能生成16位帧。  

问题在于、在这个时间原理图中、相同读数或输入间的芯片选择保持较低水平。 当我需要读取另一个通道的转换时、我上升、然后在第一幅图片中变为低电平。  

当我读取 EMIF 接口的操作时、它具有3个相位:设置、选通和保持。 在保持周期结束时、CS 上升(非活动)。

它以橙色显示以下内容:  

但是、我需要的是、芯片选择在第一个8位读取后保持低电平、然后再读取另一个8位读取以读取 ADC 的整个16位帧。 EMIF 和 ADC 的写入也是如此。 我想知道在选通周期或保持周期(OE 为高电平-未激活)之后、是否可以选择保持 CS 低电平有效、并将 OE 置于低电平有效状态以执行双读数、而不会将 CS 置于两个读数之间。

我希望您能理解我想了解的内容。 如果您能帮助我,我将不胜感激。

提前感谢您、祝您愉快。

佩德罗

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

    我们会在下周早些时候与您联系。

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

    Okey Vivek、

    我将等待您的回答。 谢谢!

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

    尊敬的 Pedro:

    众所周知、C28x 是16位接口、这意味着最小存取大小为16位。 关于以下查询-

    但是、我需要的是、首先读取8位后、芯片选择在读取另外8位读数以读取 ADC 的整个16位帧之前保持低电平。

    如果将 EMIF 接口配置为8位(ASIZE = 0)并从 C28x 执行16位读取/写入、则它应执行两次背对背访问、而不会切换 CS。 请查看这是否适用于此用例。

    此致、

    维维克·辛格

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

    您好、Vivek、

    非常感谢您的回答! 按照您所说的内容、我对 TMS320F28388D 的 EMIF 进行了一些测试。  

        Uint16 lectura16bits;
        Uint32 lectura32bits;
        //                                                                 configurarADC(tramaConfADC_NOSEQEN, 10, tramaFiltroPasoBajo, 8);
    
        EMIF_setAsyncDataBusWidth(EMIF1_BASE, EMIF_ASYNC_CS3_OFFSET,
                                      EMIF_ASYNC_DATA_WIDTH_16);
        pruebavariable16bits=0xF2F1;
        pruebavariable32bits=0xF2F11F2F;
    
        GPIO_writePin(GPIO_CS_EXT, 0);
        *punteroCS= pruebavariable16bits;
        GPIO_writePin(GPIO_CS_EXT, 1);
    
      GPIO_writePin(GPIO_CS_EXT, 0);
        lectura16bits=*punteroCS;
        GPIO_writePin(GPIO_CS_EXT, 1);
    
        GPIO_writePin(GPIO_CS_EXT, 0);
        *punteroCS= pruebavariable32bits;
        GPIO_writePin(GPIO_CS_EXT, 1);
    
        GPIO_writePin(GPIO_CS_EXT, 0);
        lectura32bits=*punteroCS;
        GPIO_writePin(GPIO_CS_EXT, 1);
    
        //LECTURA REGISTROS CONF. ADC
        //ConfADC=leerRegADC(lect_ConfADC, 8);
        //ConfADC=leerRegADC(lect_ConfADC, 16);
                                                                        /*  filtroADC=leerRegADC(lect_FPBADC,tamanobusdatos);
                                                                            rangoADCA=leerRegADC(lect_RangoADC_0_3_A,tamanobusdatos);
                                                                            rangoADCB=leerRegADC(lect_RangoADC_0_3_B,tamanobusdatos);*/
        EMIF_setAsyncDataBusWidth(EMIF1_BASE, EMIF_ASYNC_CS3_OFFSET,
                                  EMIF_ASYNC_DATA_WIDTH_8);                                //O PONER A 8 AUNQUE LUEGO PONER A 16 PARA EVITAR EL TURN-AROUND TIME
    
        GPIO_writePin(GPIO_CS_EXT, 0);
        *punteroCS= pruebavariable16bits;
        GPIO_writePin(GPIO_CS_EXT, 1);
    
        GPIO_writePin(GPIO_CS_EXT, 0);
        lectura16bits=*punteroCS;
        GPIO_writePin(GPIO_CS_EXT, 1);
    
        GPIO_writePin(GPIO_CS_EXT, 0);
        *punteroCS= pruebavariable32bits;
        GPIO_writePin(GPIO_CS_EXT, 1);
    
        GPIO_writePin(GPIO_CS_EXT, 0);
        lectura32bits=*punteroCS;
        GPIO_writePin(GPIO_CS_EXT, 1);
    

    从代码中可以看出、我将使用 EMIF 的 CS3 (异步)、并在接下来的图片中向您展示以下信号:

    -外部 CS:作为 GPIO 管理的外部芯片选择。 绿色

    - EMIF CS3 :这是微控制器 EMIF 接口的芯片选择。 红色

    - EMIF Wen:EMIF 的写使能。 蓝色

    - EMIF OEEN: EMIF 的输出使能。  黄色

    我要显示的引脚如下:

    如您所见、我使用 DB[0-7]并行使用 ADC 字节进行通信、就像我在最后一条消息中所说的那样

    我在代码中使用"EMIF_setAsyncDataBusWidth"函数更改了 ASIZE 参数。 此代码主要是写入2个16位和32位变量、读取时采用16位 ASIZE 和8位 ASIZE。

    在第一张图片中、我使用16位的 ASIZE。

    • 如果我写入16位("pruebavariable16位")、Wen (蓝色)将下降2次。 为什么? 我猜我写的是一个16位的字内存,它将只有一个周期。 然后、如果你在下一个操作中看到、在 EMIF 对一个16位变量("lectura16bits")的读取中、它显示 OEN 只下降了一次。
    • 如果我写入 32位("pruebavariable32bits ")、则 WEn (蓝色)下降2次、 和16位变量一样!!! 。 然后、如果你在下一个操作中看到、在 EMIF 对一个 32位变量("lectura32bits ")的读取中、它显示 OEN 下降了 两次。

    在第二张图片中、ASIZE 为8位(计划的一个位与8条数据总线与 ADC 并行使用)。

    • 如果我写入16位("pruebavariable16位")、Wen (蓝色)将下降 4次!! 与 ASIZE 的16位写入相同、但重复、因为 ASIZE 是一半。 如果你在下一个操作中看到、在 EMIF 读取到一个16位变量("lectura16bits")时、它显示 OEN 下降了两次。 这是对的,两个读周期来完成16位变量与两个读片
    • 如果我写入 32 位("pruebavariable32bits ")、则 WEn (蓝色)下降2次、  和16位变量一样!!! 。  如果你在下一个操作中看到、在 EMIF 对一个 32 位变量("lectura32bits ")的读取中、它显示 OEN 下降了四倍、这是逻辑值。

    我想知道的是、 为什么在写操作中 Wen 的值是16位变量读操作中 oen 值的2倍。  

    我想知道为什么32位变量的写操作与16位变量的写操作具有相同的 Wen 周期。

    如您所知、Vivak 我想通过简单配置与 ADC 进行通信、这意味着使用 ADC 进行2次读取操作和2次写入操作、从而通过8条数据总线写入16位寄存器。  

    如果您能帮助我解决这个问题、我将非常高兴。

    提前感谢您、

    佩德罗

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

    您是否可以共享 *punteroCS 指针的定义。

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

    您好、Vivek。

    我为该指针指定 TMS320F28388D 数据表中所示的 CS3的方向  

    方向为0x0030 0000。

    现在我无法向您发送确切的代码、因为我的计算机在工作中、并且我已经完成了一天的工作。 然而、这就是我看到的方式。在 CCS 的 EMIF 的一些示例中、它使用了写入和读取操作、使用了指向芯片选择方向的指针。

    更新:

    我写与指针相关的代码:

    #define CS3_DIRECCION  0x00300000
    Uint32 *punteroCS;
    
    punteroCS=(uint32_t*)CS3_DIRECCION;

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

    您已将指针定义为32位。 我想这就是它执行32位写入的原因。 请将其更改为16位。

    维维克·辛格

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

    你是对的 Vivek ,非常感谢你!!!