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/TMS320F28377S:I2C - GPIO 引脚42和43上无输出

Guru**** 2482225 points
Other Parts Discussed in Thread: TMS320F28377S, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/665183/ccs-tms320f28377s-i2c---no-output-at-gpio-pins-42-and-43

器件型号:TMS320F28377S
主题中讨论的其他器件: C2000WARE

工具/软件:Code Composer Studio

我已经在使用 LaunchPad F28377S 一段时间了。 我最近有一个 OLED I2C 显示屏可以使用。 在 TMS320F28377S 技术参考指南中、他们提到了用于 I2C-A 的 GPIO 42、43和 GPIO 91、92 但我决定使用 GPIO 42和43。 我无法在这些引脚上获得任何输出(时钟和数据都不是)。 我已经尝试过 GPIO 91、92、但没有成功。 以下是我的代码:

#include "F28x_Project.h"
/**
* main.c
*/

#define OLED_I2C_address 0x3C

//控制字节
#define OLED_CONTRAL_BYTE_CMD_SINGLE 0x0080
#define OLED_CONTRAL_BYTE_CMD_STREAM 0x0000
#define OLED_CONTRAL_BYTE_DATA_STREAM 0x0040

//基本命令(
#define OLED_CONTRAL_CMD_SET) 0x0081 //后面跟随0x7F
#define OLED_CMD_DISPLAY_RAM 0x00A4
#define OLED_CMD_DISPLAY_Allon 0x00A5
#define OLED_CMD_DISPLAY_NORMAL 0x00A6
#define OLED_CMD_DISPLAY_INPTED 0x00A7
#define OLED_CMD_DISPLAY_OFF 0x00AE
#define OLED_CMD_DISPLAY_ON 0x00AF

//寻址命令表(第30页)
#define OLED_CMD_SET_MEMORY_ADDR_MODE 0x0020 //跟随0x00 = HORZ 模式=行为类似于 KS108图形 LCD
#define OLED_CMD_SET_COLUMN_RANGE 0x0021 //只能在 HORZ/垂直模式下使用-之后是0x00和0x7F = COL127
#define OLED_CMD_SET_PAGE_RANGE 0x0022 //只能在 HORZ/垂直模式下使用-遵循0x00和0x07 = page7

//硬件配置(第31页)
#define OLED_CMD_SET_DISPLAY_START_LINE 0x0040
#define OLED_CMD_SET_SECTOR_REMAP 0x00A1
#define OLED_CMD_SET_MUX_RA比 0x00A8 //跟随0x3F = 64 MUX
#define OLED_CMD_SET_COM_SCAN_MODE 0x00C8
#define OLED_CMD_SET_DISPLAY_OFFSET 0x00D3 //后面跟随0x00
#define OLED_CMD_SET_COM_PIN_MAP 0x00DA //跟随0x12
#define OLED_CMD_NOP 0x00E3 // NOP

//时序和驱动方案(第32页)
#define OLED_CMD_SET_DISPLAY_CLK_DIV 0x00D5 //后面跟随0x80
#define OLED_CMD_SET_PREARGE 0x00D9 //遵循0xF1
#define OLED_CMD_SET_VCOMH_DESELCT 0x00DB //跟随0x30

//电荷泵(第62页)
#define OLED_CMD_SET_CHARGE_PUMP 0x008D //跟随0x14

void OLED_init (UINT16 Slave_address);
void I2C_Write (UINT16 Slave_address、UINT16 No_OF_DATABytes、UINT16 Write_Array[]);
void I2C_WriteByte (UINT16 Slave_address、 uint16数据库);
uint16 Pattern1[17]={0x0040、0x000000、0x007E、0x0042、0x0042、0x0042、0x007E、0x000000、0x007E、0x0042、0x0042、0x0042、0x0042、0x007E、0x0000};
iint_i_i_it_invoid (uint_it_it_it_int)


;
InitSysCtrl();
InitGpio();

I2C_A_GPIO_init ();

InitPieCtrl();
InitPieVectTable();
I2CA_Init();
I2caRegs.I2CMDR.bit.IRS = 0;
I2caRegs.I2CPSC.all = 19;// I2C 时钟应该介于7MHz-12MHz 之间
I2caRegs.I2CCLKL = 45; //预分频器设置为100kHz 比特率
I2caRegs.I2CCLKH = 45; //在10MHz I2C 时钟上
I2caRegs.I2CMDR.bit.IRS = 1;

UINT16 Slave_address = 0x003C;
OLED_INIT (Slave_address);
uint16 write_array[7]={OLED_CONTRAL_BYTE_CMD_STREAM、OLED_CMD_SET_COLUMN_RANGE、0x0000.0x007F、OLED_CMD_SET_PAGE_RANGE、0x0000.0x0007};
I2C_Write (Slave_address、7、write_array);
I2C_Write (Slave_address、17、Pattern1);

return 0;
}
void I2C_Write (UINT16 Slave_address、UINT16 No_for_databytes、UINT16 Write_Array[])
{
/*UINT16 I = 0;

I2caRegs.I2CSAR.all = Slave_address;
while (I2I2Write_Array=0=I2I2I2I2I2I2Mspa.r.I2I2I2Mspa.

)

;Id=0X2I2I2I2I2I2I2I2I2I2I2I2I2I2I2R.R
//
待发送的数据字节 while (i < NO_OR_DATABytes)
{
while (I2cRegs.I2CSTR.bit.XRDY!= 1);
DSP28x_usDelay (5000);
if (I2cRegs.I2CSTR.bit.XRDY = 1)
{
I2SCRegs.i+=





1);while (I2CSTR.I2CSTR+.I2CSTR.I2+= 1);+= 1 *.I2CSTr.I2CSTr.I2CSTr.I2CSTr.I2CSTR+.I = 1)

I2caRegs.I2CMDR.bit.IRS = 1; //复位 I2C

//确保 I2C 不忙且已停止
while (I2cRegs.I2CSTR.bit.BB = 1); //忙循环
I2caRegs.I2CSTR.bit.SCD = 1; //清除 SCD 位(停止条件位)
while (I2caRegs.I2CMDR.bit.STP==1); //停止位循环

I2caRegs.I2CSAR.All = Slave_address; // I2C 从地址
while (I2cRegs.I2CSTR.bit.BB = 1); //仍然忙?

I2caRegs.I2CCNT =无数据字节; //假设寄存器地址= 1字节,数据为1字节

//I2caRegs.I2CMDR.ALL = 0x6E20; //开始,停止,无 rm,重置 i2c 01101110 00100000
I2caRegs.I2CMDR.bit.NACKMOD = 0; // NACK 模式位
I2caRegs.I2CMDR.bit.FREE = 1; //挂起时运行空闲 I2C
I2caRegs.I2CMDR.bit.STT = 1; //起始条件位
I2caRegs.I2CMDR.bit.STP= 1; //停止条件位
I2caRegs.I2CMDR.bit.MST = 1; //主模式
I2caRegs.I2CMDR.bit.TRX = 1; //发送器模式
I2caRegs.I2CMDR.bit.XA = 0; // 7位寻址模式
I2caRegs.I2CMDR.bit.RM = 0; //非重复模式
I2caRegs.I2CMDR.bit.DLB = 0; //数字回送模式被禁用
I2caRegs.I2CMDR.bit.IRS = 1; //启用 I2C 模块
I2caRegs.I2CMDR.bit.STB = 0; // I2C 模块不处于起始字节模式
I2caRegs.I2CMDR.bit.FDF = 0; //禁用自由数据格式模式
I2caRegs.I2CMDR.bit.BC = 0; //每个数据字节8位


uint16 i;
for (i=0;i 

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

    您好!

    我不是 I2C 领域的专家、但我确实看到了一个问题。  

    6不是可以放入 GPBMUX1寄存器位的值(它的范围仅为0-3)。  

    相反、您需要使用 GPBGMUX1和 GPBMUX1 (分别为全局和本地多路复用器)的组合。  数据表的"引脚多路复用"部分应帮助您正确配置这些位。


    谢谢、
    Brett

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、
    我也尝试了
    GpioCtrlRegs.GPBGMUX1.bit.GPIO42=1;
    GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 3;
    GpioCtrlRegs.GPBGMUX1.bit.GPIO43 = 1;
    GpioCtrlRegs.GPBMUX1.bit.GPIO43= 3;

    在本论坛上阅读一些其他主题并切换到之前
    GpioCtrlRegs.GPBMUX1.bit.GPIO43= 6;

    这两个代码都不起作用。
    感谢您的回复、Brett。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    根据数据表、GPBMUX1.bit.GPIO42/43应为2 (vs 3)-正确吗?  我认为这将解决您的问题。

    ===

    如前所述、GPBMUX1的范围是0-3。 如果您看一下 F2837xS TRM 中的 GPBMUX1寄存器定义、您会发现我为什么这么说。  
    http://www.ti.com/lit/spruhx5

    为了使用 CCS 证明这一点、如果您将 GPBMUX1置于变量/表达式监视窗口中、并在您的寄存器写入后设置断点、您可能会看到写入6实际上会作为2放入寄存器位[6 modulo 4 = 2]。


    谢谢、
    Brett

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

    大家好、Brett。 感谢您的回复。

    我尝试了您的建议、但我仍然没有得到任何输出。 我在时钟引脚(GPIO 42)上获得恒定正电压、但在 GPIO43上没有任何电压或接地(直接从 GPIO 引脚进行测量时)。

    我还尝试使用和不使用 SCA 和 SDA 的外部上拉连接 OLED 显示屏、但这也不起作用。 (我使用4.7K 电阻器进行上拉)。

    我注意到的另一件事是,当我调试代码并使用 Step Into(F5)时,代码在第一个 I2C_Write()调用结束时的停止条件停止。

    void I2C_Write (UINT16 Slave_address、UINT16 No_of _databytes、UINT16 Write_Array[])
    {
    I2caRegs.I2CMDR.bit.IRS = 1;
    
    //确保 I2C 不忙且已停止
    while (I2cRegs.I2CSTR.bit.BB = 1);
    I2caRegs.I2CSTR.bit.SCD = 1;
    while (I2caRegs.I2CMDR.bit.STP==1);
    
    I2caRegs.I2CSAR.All = Slave_address;
    while (I2cRegs.I2CSTR.bit.BB = 1);
    
    I2caRegs.I2CCNT =无数据字节;
    
    //I2caRegs.I2CMDR.ALL = 0x6E20;
    I2caRegs.I2CMDR.bit.NACKMOD = 0;
    I2caRegs.I2CMDR.bit.FREE = 1;
    I2caRegs.I2CMDR.bit.STT = 1;
    I2caRegs.I2CMDR.bit.STP= 1;
    I2caRegs.I2CMDR.bit.MST = 1;
    I2caRegs.I2CMDR.bit.TRX = 1;
    I2caRegs.I2CMDR.bit.XA = 0;
    I2caRegs.I2CMDR.bit.RM = 0;
    I2caRegs.I2CMDR.bit.DLB = 0;
    I2caRegs.I2CMDR.bit.IRS = 1;
    I2caRegs.I2CMDR.bit.STB = 0;
    I2caRegs.I2CMDR.bit.FDF = 0;
    I2caRegs.I2CMDR.bit.BC = 0;
    
    
    uint16 i;
    for (i=0;i 't="" move="" on.="" 
    

    我还尝试了 GPIO 91和92、但没有使用。 老实说、我不知道这里的问题是什么、但我非常确信我的 DigiLink 模拟发现和 OLED 显示屏能够正常工作。

    从包装箱随附的 launchpad 手册中、我认为我需要一个 BoosterPack 来使代码正常工作、因为 I2CA SCA 和 I2CA SDA 连接到 BoosterPack 的 I2C 芯片(或电路?)。

    P42和 P43分别指 GPIO 42和43。

    再次感谢您的回复!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能解释一下您的硬件设置是什么吗?

    您是使用导线连接到 OLED 显示屏、还是将 OLED 板插入到 LaunchPad 中的 BoosterPack?

    如前所述、GPIO42/GPIO43的 GPIO 配置如下:
    EALLOW;
    GpioCtrlRegs.GPBGMUX1.bit.GPIO42 = 1;//组1
    GpioCtrlRegs.GPBGMUX1.bit.GPIO42 = 2;//多路复用器位置2
    GpioCtrlRegs.GPBGMUX1.bit.GPIO43 = 1;//组1
    GpioCtrlRegs.GPBGMUX1.bit.GPIO43 = 2;//多路复用器位置2
    EDIS;

    查看数据表 的"GPIO 复用引脚"部分:www.ti.com/.../terminal-configuration-and-functions 滚动以查找 GPIO42和 GPIO43。 然后在同一列中向上滚动到表的标题、您可以看到 GPxGMUXy 和 GPxMUXy 寄存器的确切设置。

    GPIO42和 GPIO43分别在插头 J1.10和 J1.9上提供。 GPIO91位于 J6.59、GPIO92位于 J6.52。

    请调整您的 GPIO 多路复用器设置、然后说明您的硬件是如何设置的、我认为我们可以快速获得分辨率。

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

    您好、Mark。

    我已经提到过、我根据 Brett 的建议更改了我的代码。

    下面是我的 i2c_a_GPIO_init()代码更改:

    EALLOW;

    GpioCtrlRegs.GPBGMUX1.bit.GPIO42=1;

    GpioCtrlRegs.GPBMUX1.bit.GPIO42 = 2;

    GpioCtrlRegs.GPBGMUX1.bit.GPIO43 = 1;

    GpioCtrlRegs.GPBMUX1.bit.GPIO43 = 2;

    EDIS;

    和否 我没有使用 OLED BoosterPack。 我将通过导线将 OLED 显示屏连接到 LaunchPad。 我还知道 GPIO 引脚的位置、如我的手册和 launchpad PCB 中所示。我询问是否需要 BoosterPack 板来使 I2C 正常工作。

    我知道显示屏可以正常工作、因为我确保了它能够与 Arduino 配合使用。

    我的硬件设置很简单。

    GPIO 42和43通过两个4.7K 电阻分别连接到5V 上拉电阻。 然后它们被适当地连接至 OLED 显示屏的 SCA 和 SDA。

    感谢您的回复、Mark。

    希望很快解决它!

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 我只是试图重新设定我们所处的基线。

    一个主要问题是 F28377S 无法在 IO 上耐受5V 信号。 如果您在一段时间内静态连接到 GPIO 至5V 电源轨、则很可能会损坏 IO (以及 MCU 本身)、这就是您在 GPIO 上看不到任何信号的原因。

    您不一定需要 BoosterPack 进行评估。 将电路板布线在一起是 LaunchPad 的完美有效用法。 连接其他板时、您需要确保两个板的接地端以及所需的信号已连接。 您还需要确保两个电路板的电压兼容。 F28377S 无法处理5V 信号、因此除非 OLED 板可以在3.3V 下运行或您有用于 I2C 信号的电平转换器、否则我不确定您是否能够使用此配置。

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

    感谢您的即时响应、Mark。

    MCU 和 PCB 工作正常。 我已经确保了它能够正常工作、还完成了我的一些其他项目。 我还在 GPIO 引脚42、43、91和92上尝试了经典的闪烁程序、它们工作正常。 无论如何、我还记得不要再将它们连接到5V 电源轨!

    我使用了 DigiLink 的模拟发现模块来直接测量电路板引脚的输出(当这些引脚连接且未连接到 OLED 显示屏时)。

    OLED 显示屏不适合使用3.3V SDA 和 SCA、但一旦我在 LaunchPad 上的 SCA-A 上获取时钟、我将使用电平转换器。 (谢谢!)

    这可能是我的代码问题、因为我看不到 MCU 或电路板有任何问题。

    正如我已经提到的、程序执行会无限期地停留在 I2C 停止条件检查循环中。 我也不知道为什么会发生这种情况。

    再次感谢、Mark。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    当没有连接到 I2C 的内容并且您发起传输时、您是否在示波器上看到 I2C 时钟和数据切换?

    此外、将 I2CWrite 函数与 I2C 示例进行比较、您在设置数据进行发送之前会先对 I2CMDR 寄存器进行写入。

    请查看示例:
    C:\ti\c2000Ware_1_00_03_00\device_support\f2837xs\examples\cpu1\c2c_EEPROM\cpu01\example_2837xSI2C_EEPROM.c

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

    一段时间以来,我没有听到您的声音,因此我假设您能够解决您的问题。 如果情况并非如此,请拒绝此解决方案或回复此主题。 如果此主题被锁定、请制作一个描述问题当前状态的新主题。

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

    我注意到您没有解决您的问题。 请您提供更多信息、以便我们能够达成解决方案吗?
    您是否了解过 EEPROM 示例代码? 遗憾的是、I2C 是一个有点棘手的模块。 内置的错误检测并不多。 I2C 总线卡滞时是否具有示波器捕获?

    谢谢、
    标记