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.

[参考译文] LAUNCHTXL-F2.8069万M:F2.8069万 I2C通信,带轮询,不带FIFO

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/619853/launchxl-f28069m-f28069-i2c-communication-with-polling-and-without-fifo

部件号:LAUNCHTXL-F2.8069万M

您好,

我正在尝试将I2C通信从一个F2.8069万传播到另一个F2.8069万。 我看到从属地址为0x7900。

我有一个10千欧电阻器作为上拉。  我已禁用中断和FIFO。

使用下面的代码,我发现一个字节的数据传输正常,但使用逻辑分析器时,我无法看到SCL线路上的任何时钟。 数据传输结束后,SCL时钟是否会停止?

该代码对新手来说是否合适?

这是我的代码-  

#include  "DSP28x_Project.h"

#include  <stdint.h>

UINT16_t  Readi2c();

void  Writei2c();

void  Initi2c();

void  Initial2c (void){

EALLOW;

// gpioCtrlRegs.GPBPUD.bit.GPIO32 = 0x0000; //I正在使用外部上拉电阻器

// GpioCtrlRegs.GPBPUD.bit.GPIO33 = 0x0000;

gpioCtrlRegs.GPBQSEL1.bit.GPIO32  = 0x0003;

gpioCtrlRegs.GPBQSEL1.bit.GPIO33  = 0x0003;

gpioCtrlRegs.GPBMUX1.bit.GPIO32  = 0x0001;

gpioCtrlRegs.GPBMUX1.bit.GPIO33  = 0x0001;

EDIS;

I2caRegs.I2CMDR.All = 0x0000;         //在设置预校准之前保持I2C复位

I2caRegs.I2CSAR  = 0x7900;    // F2.8069万的地址

I2caRegs.I2CPsc.all  = 0x0008;  //表示400kHz

I2caRegs.I2CCLKL  = 20;  

I2caRegs.I2CCLKH  = 10;  

I2caRegs.I2CIER .all = 0x0000; //禁用所有中断

// I2caRegs.I2CFFTX.ALL = 0x6000;//启用FIFO模式和TXFIFO

// I2caRegs.I2CFFRX.ALL = 0x2040;//启用RXFIFO,清除RXFFINT,

I2caRegs.I2CMDR.ALL  = 0x0020; // 1:从重置中取出I2C

// 0:暂停时停止I2C

}

UINT16_t  Readi2c()

uINT16_t 临时数据;

I2caRegs.I2CSAR  = 0x7900;

I2caRegs.I2CCNT  = 0x0001;

I2caRegs.I2CMDR.All  = 0x2020;   //在接收从属模式下启动

while (!I2caRegs.I2CSTR.bit.RRDY);  

I2caRegs.I2CCNT  = 0x0001;

I2caRegs.I2CMDR.All  = 0x2C20;    //主接收。  

I2caRegs.I2CMDR.ALL = 0x2820;   // 其他F2.8069万 (从属)具有0x2820作为从属模式接收

tempddata = I2caRegs.I2CDRR;

return(tempda)

}

void  Writei2c()

// I2caRegs.I2CMDR.All = 0x2620;//发送启动条件

I2caRegs.I2CSAR  = 0x7900;

I2caRegs.I2CCNT  = 0x0001;

I2caRegs.I2CDXR  = 0x05; //在总线上写入一个字节

I2caRegs.I2CMDR.ALL  = 0x2E20; //发送停止位并设置为主发送器

while (!I2caRegs.I2CSTR.Bit.SCD);

I2caRegs.I2CSTR.Bit.SCD  = 1;

}

void  main()

uINT16_t记录数据;

InitSysCtrl();//I2C   时钟在此函数中初始化

初始2c();

Writei2c();    

recvdata = Readi2c();//从F2.8069万读取F2.8069万主控数据的线路

同时(1)

 {

   }

}

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

    我对您的代码进行了一些研究,大部分情况下似乎都可以。 需要注意的一点是,我不认为0x7900是F2.8069万从属地址,而实际上是I2COAR的注册地址。 此寄存器的值在启动时默认为零,因此您需要自己设置设备的从属地址,如下所示...

    I2caRegs.I2COAR.ALL = 0x0060;//将设备从属地址设置为0x0060或任何您想要的地址

    我建议将您设置的地址保留为一个字节,并使用较低的7位,因为I2C模块只处理7位和10位寻址。

    SCL时钟将在传输过程中和接收(读/写)时脉冲。 它不会始终发出脉冲,可以保持高/低。

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

    谢谢,SCL时钟部分现在已经清楚了。
    是的,你说得对,0x7900是F280.1969万自己的地址。
    我的设置现在是->
    Initial2c()函数中的I2caRegs.I2COAR.ALL = 0x0060。
    Readi2c ()函数中的I2caRegs.I2CSAL.ALL = 0x0060。

    我在发送多个字节时遇到了问题。 我只能将一个字节读入我的从属设备。

    我希望在while (!I2caRegs.I2CSTR.Bit.RRDY)上进行轮询;是正确的方法。 我没有明确设定任何固定点。

    此线程表示我们需要轮询SCD位,然后逐个从DDR读取字节。 这是正确的方法,而不是RRDY标志吗?

    e2e.ti.com/.../416428 20i2c

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

    如果代码中包含I2caRegs.I2COAR.ALL = 0x0060,则会将当前F2.8069万的从属地址设置为0x60 (运行I2COAR行的设备)(如果这样做有意义)。

    由于您需要在两个F2.8069万s之间进行I2C通信,我认为您需要做的是在Initial2c函数中为每个设备设置不同的从属地址。 主设备在对其进行读/写操作时,将要将I2caRegs.I2CSAR设置为等于其他设备的从属地址。 每个从属设备都有不同的地址,因为您可以在一条线路上有多个I2C从属设备,它会让特定从属设备知道它正在写入主设备或正在由主设备读取。

    例如,假设您要将master f2806"slave address"设置为0x05,将slave f2806"slave address"设置为0x60。

    主设备的Initial2c函数中将出现I2caRegs.I2COAR.ALL = 0x0005

    您将在从属设备的Initial2c函数中获得I2caRegs.I2COAR.ALL = 0x0060

    如果主设备要读取或写入从属设备,它将在读取/写入功能开始时设置I2caRegs.I2CSAR = 0x0060,即它要与之通话的从属设备的地址。

    这是对这个过程如何运作的一个快速解释,我希望它有意义!

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

    谢谢,这是合理的。

    在您发送回复时,我刚刚对我的问题进行了编辑。 可以看看吗? 它与接收多个字节有关。

    我有一个非常简单的应用程序,所以不喜欢使用任何中断或FIFO。  

    任何快速的帮助都很棒!

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

    您好,Sowmya,

    是的,这看起来不错。

    关于发送/接收多个字节,您需要查看I2caRegs.I2CCNT寄存器。 这将设置您期望读取或写入的字节数量。 下面是I2C手册的链接,它很好地解释了这一概念(对于启动器,请查看第35页),它适用于X2802x和X2803x,但适用于f2806x。

    www.ti.com/.../sprufz9d.pdf

    您可能还想稍微了解一下停止条件,nack,启动条件,甚至可能是重复启动条件。 我尚未测试以下代码,但可能类似的代码可以用于您的读取功能。

    UINT16_t data1,data2,data3;//也可以使用此
    
    I2caRegs.I2CSAR = 0x0060;
    
    I2caRegs.I2CCNT = 0x0001;
    
    I2caRegs.I2CMDR.All = 0x2020;//在接收从属模式下启动
    
    ,同时(!CSI2mcaRegs.I2CCNT
    
    = X.I2IX.0X.I2IX.I3)
    
    =接收I2CARS.I2RX.0X20;I2R= I2I2I2RX.I2I2RX.I2RX.I2R= 0。
    
    // I2caRegs.I2CMDR.ALL = 0x2820;//其他F2.8069万 (从属)具有0x2820的从属模式接收
    
    //此处可能需要某种启动条件...
    
    while (!I2caRegs.I2CSTR.bit.RDY);
    data1 = I2caRegs.I2CDRR;
    while (!I2caRegs.I2Rrrrrc.rrrrrrrrrrrrrrrrrrrrrrc.2rrrrrrv
    
    )
    


    希望这能有所帮助,
    Kevin