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/TMS320F28027:TMS320F28027-C2000 Launchpad

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/744936/ccs-tms320f28027-tms320f28027-c2000-launchpad

器件型号:TMS320F28027

工具/软件:Code Composer Studio

大家好、我一直在使用 TMS320F28027的 I2C 模块。 我已经了解了很多现有的代码、我的代码看起来是一样的、但仍然不起作用。 我在中断中放置了一个断点,我使用 USB/I2C 模块向 C2000 Launchpad 发送命令,但仍然没有任何作用。 非常感谢您的帮助。

代码:  

/**
* main.c
*
#include "DSP28x_Project.h"
#include "F2802x_common/include/clk.h"//时钟的标头
#include "f2802x_common/include/gpio.h"// GPIO 接头
#include "F2802x_common/include/PLL.h"// PLL 的标头
#include "F2802x_common/include/wdog.h"//看门狗头
#include "F2802x_common/include/i2c.h"//看门狗头
#include "F2802x_headers/include/F2802x_PieVect.h"// PIE 的标头
#include "F2802x_headers/include/F2802x_I2C.h"
#include "F2802x_common/include/F2802x_I2C_defins.h"
#include "myI2C.h"


void ioinit();
GPIO_Handle myGpio;
_interrupt void i2c_int1a_isr (void);
void I2CA_Init();

易失性 UINT16 I2CSTR_snapshot1;
易失性 UINT16 I2CSTR_snapshot2;
易失性 UINT16 I2CSTR_snapshot3;

void main()

//#ifdef _flash
// memcpy (&RamfuncsRunStart、&RamfuncsLoadStart、(size_t)&RamfuncsLoadSize);
//#endif

InitSysCtrl();

initI2CGpio();

//步骤3. 清除所有中断并初始化 PIE 矢量表:
//禁用 CPU 中断
Dint;
InitPieCtrl();

IER = 0x0000;
IFR = 0x0000;

InitPieVectTable();

EALLOW;//这是写入 EALLOW 受保护寄存器所必需的
PieVectTable.I2CINT1A =&i2c_int1a_ISR;
EDIS;//这是禁止写入 EALLOW 受保护寄存器所必需的
I2CA_Init();
PieCtrlRegs.PIEIER8.bit.INTx1 = 1;

//[???] 启用连接到 PIE 组8 (I2C)的 CPU INT8
IER |= M_INT8;

//启用全局中断和更高优先级的实时调试事件:
EINT;//启用全局中断 INTM

while (1)//此操作将无限期运行

DELAY_US (1000000);

#define ALT_B_SDA 0x00000001
#define ALT_B_SCL 0x00000004
#define GPAMUX1_CFG 0x00000000
#define GPAMUX2_CFG 0x00000000
#define GPBMUX1_CFG (ALT_B_SDA + ALT_B_SCL)
#define AIOMUX1_CFG (0x00003330)// AIO10-12-14为 AIO、其他为默认禁用
//方向寄存器对配置为外设功能的引脚没有影响。
#define GPIOA_DIR 0x00000000 //
#define GPIOB_DIR 0x00000000 //
#define AIO_DIR 0x00005400 // MUX_ADDR2-0仅用作 GPIO 输出
#define GPIOB_QSEL1 0xF000000F //异步输入 GPIO32 (SDA)和 GPIO33 (SCL)
空 initI2CGpio (空)

EALLOW;
GpioCtrlRegs.GPAMUX1.ALL = 0x0000;// GPIO 功能 GPIO0-GPIO15
GpioCtrlRegs.GPAMUX2.ALL = 0x0000;// GPIO 功能 GPIO16-GPIO31
GpioCtrlRegs.GPBMUX1.ALL = 0x0000;// GPIO 功能 GPIO32-GPIO34

GpioCtrlRegs.AIOMUX1.ALL = 0x0000;

GpioCtrlRegs.GPADIR.ALL = 0x0000;// GPIO0-GPIO31是 GP 输入
GpioCtrlRegs.GPBDIR.ALL = 0x0000;// GPIO32-GPIO34是输入
GpioCtrlRegs.AIODIR.ALL = 0x0000;// AIO2、4、6、19、12、14是数字输入
//
GpioCtrlRegs.GPAQSEL1.ALL = 0x0000;// GPIO0-GPIO15同步到 SYSCLKOUT
GpioCtrlRegs.GPAQSEL2.ALL = 0x0000;// GPIO16-GPIO31同步到 SYSCLKOUT
GpioCtrlRegs.GPBQSEL1.ALL = 0x0000;// GPIO32-GPIO34同步到 SYSCLKOUT

//
//可以启用或禁用上拉
//
GpioCtrlRegs.GPAPUD.ALL = 0x0000;//上拉使能 GPIO0-GPIO31
GpioCtrlRegs.GPBPUD.ALL = 0x0000;//上拉使能 GPIO32-GPIO34
EDIS;

int myxdy = 20;
空 I2CA_Init()

I2caRegs.I2COAR = 0x60;//自有地址
I2caRegs.I2CPSC.all = 5;//预分频器-模块时需要7-12MHz (F2809:9)
I2caRegs.I2CCLKL = 10;//注意:必须为非零
I2caRegs.I2CCLKH = 5;//注意:必须为非零
I2caRegs.I2CCNT = 1;//获得1个字节
I2caRegs.I2CIER.ALL = 0x18;//清除中断(之前为0)
I2caRegs.I2CSTR.bit.RRDY = 1;//清除标志

I2caRegs.I2CIER.bit.RRDY = 1;//接收数据就绪中断
I2caRegs.I2CIER.bit.AAS = 0;//[2011-05-13、PP、v2.50]寻址为从器件现已禁用
I2caRegs.I2CIER.bit.XRDY = 1;//发送数据就绪中断
I2caRegs.I2CIER.bit.SCD = 1;//停止条件检测

I2caRegs.I2CMDR.ALL = 0x08A0;//使 I2C 退出复位
//挂起时停止 I2C
// A VOOOOOOOOOOOOOIR ********
// I2caRegs.rsvd1 &=~0x1;//[2018-04-26]清除 BCM 位(否则会导致 I2C 通信出现故障)
I2caRegs.I2CEMDR.bit.BCM =0;
I2caRegs.I2CMDR.bit.FREE = 1;
//启用此示例所需的中断
//在 PIE:组8中断1中启用 I2C 中断1
//PieCtrlRegs.PIEIER8.bit.INTx1 = 1;
I2caRegs.I2CFFRX.ALL = 0x2040;//启用 RXFIFO、清除 RXFFINT、
//[2011-05-10、PP、v2.??] 在使用新的 i2c_ISR 时非常重要
RxIndex = 0;
TxIndex = 0;

返回;


uint16_t myabc = 10;
_interrupt void
I2C_int1a_ISR (void)// I2C-A

char Flush;
flush = I2caRegs.I2CDRR;
myabc =myabc+2;
uint16_t IntSource;
IntSource = I2caRegs.I2CSTR.all;

//读取中断源
//IntSource = I2caRegs.I2CISRC.bit.INTCODE & 0x7;

//I2CSTR_snapshot2 = I2caRegs.I2CSTR.all;

switch (IntSource)

案例 I2C_NO_ISRC://=0

中断;

案例 I2C_ARB_ISRC://=1

中断;

案例 I2C_Nack_ISRC://=2

中断;

案例 I2C_ARDY_ISRC://=3

I2caRegs.I2CSTR.bit.ARDY = 0;
中断;

案例 I2C_AAS_ISRC://=7

中断;

案例 I2C_RX_ISRC://=4

中断;


案例 I2C_TX_ISRC://=5

中断;

案例 I2C_SCD_ISRC://=6

中断;


默认值:
asm (" ESTOP0");//在无效数字上停止。

I2CSTR_Snapshot3 = I2cRegs.I2CSTR.ALL;

//通过确认这个来启用进一步的 I2C (PIE 组8)中断。
PieCtrlRegs.PIEACX.ALL = PIEACK_group8;

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

    请详细说明您面临的问题。 我们很难通过您的代码来猜测您的问题。

    1) 1) I2C 中断在预期时是否未触发?
    2) 2)您是否探测了 I2C 信号? 如果是、您是否观察到 I2C 信号?
    3) 3)您的 I2C 总线是否总是忙?
    4) 4)您是否未从从器件接收 ACK 信号?
    5) 5)您是否尝试将 I2C 用作从接收器?

    以下是我对您的代码的观察结果:-
    a) I2C GPIO 配置不正确? 除非正确配置 GPIO、否则不能期望观察 I2C 总线上的任何内容。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、感谢您的回复。
    1) 1) I2C 中断在预期时是否未触发?
    不会实际触发中断
    2) 2)您是否探测了 I2C 信号? 如果是、您是否观察到 I2C 信号?
    是的、我确实这么做了、一切看起来都很好、从器件(我的 C2000)从未回复
    3) 3)您的 I2C 总线是否总是忙?
    不、总线都可以
    4) 4)您是否未从从器件接收 ACK 信号?
    否,我没有收到任何 ACK:(
    5) 5)您是否尝试将 I2C 用作从接收器?
    很抱歉、是的、我将 C2000 TMS320F28027用作从器件。


    我更正了 GPIO,这里是新的:
    EALLOW;
    //配置每个 GPIO 引脚(通用 IO 或功能)
    GpioCtrlRegs.GPAMUX1.ALL = 0x00000000; // GPIO0 - GPIO15
    GpioCtrlRegs.GPAMUX2.ALL = 0x00000000; // GPIO16 - GPIO31
    GpioCtrlRegs.GPBMUX1.ALL =(ALT_B_SDA + ALT_B_SCL); //#define ALT_B_SDA 0x00000001和#define ALT_B_SCL 0x00000004

    //配置每个 AIO 引脚(AIO 或 ADC 功能)
    GpioCtrlRegs.AIOMUX1.ALL =(0x00003330); // AIO 功能
    //
    //方向
    GpioCtrlRegs.GPADIR.ALL = 0x00000000; // GPIO0 - GPIO31方向
    GpioCtrlRegs.GPBDIR.ALL = 0x00000000; // GPIO32 - GPIO38方向
    GpioCtrlRegs.AIODIR.ALL = 0x00005400; // AIO 方向
    GpioCtrlRegs.GPBQSEL1.ALL = GPIOB_QSEL1;// GPIO32 - GPIO38同步到 SYSCLKOUT
    GpioCtrlRegs.GPAPUD.ALL = 0xF000000F;//端口 A 上的上拉
    GpioCtrlRegs.GPBPUD.ALL = 0x00000000;//端口 B 上的上拉
    EDIS;


    ——但仍然没有什么工作…… 感谢你的帮助
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    艾米、

    从 GPIO 配置的角度来看、需要检查的事项如下:-

    例如、如果您尝试将 GPIO32、GPIO33配置为 I2C 引脚、您需要执行以下步骤。 请检查您的代码中的 GPIO 配置是否正确。

    1) 1)启用 I2C GPIO 引脚上的上拉电阻

    GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0;
    GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0;

    2) 2)将 GPIO 引脚配置为异步 GPIO 输入限定

    GpioCtrlRegs.GPBQSEL1.bit.GPIO32=0;
    GpioCtrlRegs.GPBQSEL1.bit.GPIO33=0;

    3) 3)配置 I2C 引脚

    GpioCtrlRegs.GPBMUX1.GPIO32 = 1;
    GpioCtrlRegs.GPBMUX1.GPIO33 = 1;

    当您使用 I2C 作为从设备时、需要配置"添加为从设备条件(AAS)"中断。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    再次感谢您的回答。
    因此、我将您提供的 GPIO 配置置位、并将(AAS)位设置为1、但仍然没有任何内容、中断永远不会触发...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否检查 I2CSTR.AAS 位是否已设置? 如果该位未置位、则 I2C 模块未意识到它作为从器件被寻址。

    确保您的 I2C 主设备在 I2C 总线上发送正确的从设备地址。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、该位被置位。
    我确信我的主器件会发送到正确的地址、我在I2caRegs.I2COAR 中将其定义为0x60 = 0x60; //自己的地址
    这就是我给我的主设备写的内容。
    什么都没有... 从不触发中断..
    我尝试使用第二个板只是为了确保这不是硬件问题、但也没有什么。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如何将两个板连接在一起? 您是否确保短接两个板上的接地引脚?

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

    两者都通过 USB 连接到我的 PC、这意味着它们具有相同的电源。

    艾米

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

    我并不是100%、这是否会有帮助。 无论如何、我使用一根导线将接地端短接在一起。

    此致、
    曼诺伊
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    一段时间后、我没有听到您的反馈。 此问题是否已解决? 我可以关闭此主题吗?