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.

TMS320F28035: 求一个把此芯片作为I2C从机的参考程序

Part Number: TMS320F28035

在这颗芯片的例程中,没有看到作为I2C从机的程序,我想要一个参考程序,满足以下要求:

1. 从机,8位数据。

2. 能中断响应I2C。

3. 对主机而言,这颗芯片在收到地址后能进入中断,在接收和发送一个数据后,也能进入中断。

麻烦提供一个参考程序,谢谢!

  • 你好,非常抱歉,目前官方还没有I2C作为从机的程序,包括其他芯片也没有提供类似要求的例程。

    你可以找一下第三方网页上是否有相关例程

  • 谢谢Green的回复!

    如果没有参考例程,可否帮忙看看以下程序哪里有问题?谢谢!

    初始化代码:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    {
    // Initialize I2C-A:
    EALLOW;
    SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 1; // I2C
    GpioCtrlRegs.GPBPUD.bit.GPIO32 = 0; // Enable pull-up for GPIO32 (SDAA)
    GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0; // Enable pull-up for GPIO33 (SCLA)
    GpioCtrlRegs.GPBQSEL1.bit.GPIO32 = 3; // Asynch input GPIO32 (SDAA)
    GpioCtrlRegs.GPBQSEL1.bit.GPIO33 = 3; // Asynch input GPIO33 (SCLA)
    GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 1; // Configure GPIO32 for SDAA operation
    GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 1; // Configure GPIO33 for SCLA operation
    EDIS;
    I2caRegs.I2CMDR.bit.IRS = 0; //I2C Reset bit.
    I2caRegs.I2CMDR.bit.MST = 0; //@NOTE: 0=slave mode; 1=master mode.
    I2caRegs.I2CMDR.bit.XA = 0; //@NOTE: 0=7bit address; 1=10bit address.
    I2caRegs.I2CMDR.bit.BC = 0x00; //@NOTE: 0=8 bits per data byte
    I2caRegs.I2CMDR.bit.NACKMOD = 0; //I2C Reset bit.
    I2caRegs.I2CEMDR.bit.BCM = 0x00;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    中断处理代码:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    {
    Uint16 u16IntSrcReg;
    // static Uint16 i = 0;
    // static Uint16 j = 0;
    u16IntSrcReg = (Uint16)I2caRegs.I2CISRC.bit.INTCODE;
    switch(u16IntSrcReg)
    {
    case 0x01:
    //Arbitration lost
    break;
    case 0x02:
    //No-acknowledgment condition detected
    break;
    case 0x03:
    //Registers ready to be accessed
    break;
    case 0x04:
    //while(I2caRegs.I2CFFRX.bit.RXFFST < 4) {};
    j= 0;
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    问题:怎样设定,可以让地址中断先发生,而数据发送中断后发生?谢谢!

  • 这个很抱歉,我对I2C模块也不太熟悉。建议你将问题直接发布到英文E2E论坛,英文论坛应该会有对I2C比较熟悉的工程师帮你解决问题:

    e2e.ti.com/.../c2000-microcontrollers-forum