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 不工作

Guru**** 2482225 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/614098/ccs-tms320f28377s-i2c-was-not-working

器件型号:TMS320F28377S

工具/软件:Code Composer Studio

尊敬的先生:

我正在尝试在 tms320f28377、GPIO91和 GPIO92 (I2C A)上使用 I2C。 但这不起作用。 这是我的代码。 此引脚上没有时钟或输出、因此请帮助我找出问题所在。

/* 初始化,我采用  控制套件中提供的示例代码*/

空 I2CA_Init (空)

GpioCtrlRegs.GPCMUX2.bit.GPIO91=6;
GpioCtrlRegs.GPCMUX2.bit.GPIO92=6;

//GPIO_SetupPinMux (91、GPIO_MUX_CPU2、6);
//GPIO_SetupPinMux (92、GPIO_MUX_CPU2、6);

I2caRegs.I2CSAR.ALL = 0x00A0;//从器件地址-写入模式中的 EEPROM

I2caRegs.I2CPSC.all = 6;//预分频器-模块时需要7-12MHz
I2caRegs.I2CCLKL = 10;//注意:必须为非零
I2caRegs.I2CCLKH = 5;//注意:必须为非零
I2caRegs.I2CIER.ALL = 0x24;//启用 SCD 和 ARDY __interrupts

I2caRegs.I2CMDR.ALL = 0x0020;//使 I2C 退出复位
//挂起时停止 I2C

I2caRegs.I2CFFTX.ALL = 0x6000;//启用 FIFO 模式和 TXFIFO
I2caRegs.I2CFFRX.ALL = 0x2040;//启用 RXFIFO、清除 RXFFINT、

返回;

空 I2CA_WriteData (空)

unsigned char i;

//
//等待直到 STP 位从任何先前的主设备通信中清零。
//模块清除该位的操作被延迟到 SCD 位之后
//设置。 如果在启动新消息之前未选中此位
// I2C 可能会被混淆。
//

检查1:

if (I2caRegs.I2CMDR.bit.STP==1)

转至校验1;
//返回 I2C_STP_NOT _READY_ERROR;

//
//设置从地址
//
I2caRegs.I2CSAR.ALL = 0xA0;  //EEPROM 地址。   

//
//检查总线是否占线
//

if (I2cRegs.I2CSTR.bit.BB = 1)

//返回 I2C_BUS_BUS_BUSY_ERROR;
转至校验1;

//
//设置要发送的字节数
// MsgBuffer +地址
//
I2caRegs.I2CCNT = 2;

//
//设置要发送的数据
//
// I2caRegs.I2CDXR.all = 0x00;
I2caRegs.I2CDXR.ALL = 0xAA;

//
//将 START 作为主发送器发送
//
I2caRegs.I2CMDR.ALL = 0x6E20;

返回;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    我写信告诉您、C2000团队成员已被分配到此帖子、应该很快回答。

    此致
    Baskaran
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在多路复用器配置之前、您需要具有 EALLOW。

    EALLOW;
    GpioCtrlRegs.GPCMUX2.bit.GPIO91=6;
    GpioCtrlRegs.GPCMUX2.bit.GPIO92=6;
    EDIS;

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

    现在、至少我能够生成一些数据。 但我想编写我自己的库。 我想在 I2C 总线上单独写入地址和数据、并且有两个用于写入数据和地址的独立寄存器。 因此我编写了以下函数、它们无法正常工作。 那么、您能告诉我们如何写入读取、写入、停止、启动和 ACK 的常规函数。 我必须在 I2C 上连接 EEPROM、RTC 和 ADC。 我编写了以下函数

    /******** 写信地址 /

    void write_address (无符号字符地址)

    if (I2caRegs.I2CMDR.bit.STP==1) //等待 i2c 总线结束任何恢复通信

    美国(500);


    I2caRegs.I2CCNT = 1; //要在 i2c 地址+数据上发送的字节数
    I2caRegs.I2CSAR.ALL =地址; //从机地址-写入模式中的 EEPROM

    if (I2cRegs.I2CSTR.bit.BB = 1); //等待总线空闲

    美国(500);


    I2caRegs.I2CMDR.ALL = 0x6E20;

    返回;


    /********* 写入数据 /

    void write_data (无符号字符数据)

    if (I2caRegs.I2CMDR.bit.STP==1) //等待 i2c 总线结束任何恢复通信

    美国(500);

    I2caRegs.I2CCNT = 1;
    I2caRegs.I2CDXR.all =数据; //写入数据

    if (I2cRegs.I2CSTR.bit.BB = 1); //等待总线空闲

    美国(500);


    I2caRegs.I2CMDR.ALL = 0x6E20;

    返回;


    /********* 启动条件 /


    void start_condition (void)

    I2caRegs.I2CMDR.bit.STT=1;//发送起始条件

    if (I2caRegs.I2CSTR.bit.BB = 1);//等待总线空闲

    MS (10);


    返回;


    /********* 停止条件 /

    void stop_condition (void)

    I2caRegs.I2CMDR.bit.STP=1;//发送停止条件

    if (I2caRegs.I2CSTR.bit.BB = 1);//等待总线空闲

    MS (10);


    返回;


    /********* NACK 条件 /

    void nack_condition (void)

    I2caRegs.I2CMDR.bit.NACKMOD=1; //发送 NACK 位

    if (I2cRegs.I2CSTR.bit.BB = 1); //等待总线空闲

    MS (10);



    / /
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很好。 我们将邀请 I2C 专家来研究您的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能否更详细地解释一下您所谓的"不能正常工作"是什么意思? 它们以何种方式发生故障?

    我认为我们的硬件不支持使用 SAR 寄存器单独发送地址、但我确实找到了此论坛帖子、有人在其中使用了 FDF 并将地址发送为数据字节。 这是否符合您的要求?

    e2e.ti.com/.../1720695

    惠特尼
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我只想知道发送停止、启动、NACK、地址和数据的寄存器是什么。 因此我可以开发自己的库。 上述代码无法正常工作。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是调用上述函数的程序。 我想使用 I2C 外设来运行它。

    空 EEPROM_WriteByte (unsigned char EEPROM_Address、unsigned char EEPROM_Data、unsigned char Page_number)

    I2C_Start(); //开始 i2c 通信
    WRITE_ADDRESS (EEPROM_ID|(Page_NUMBER <1)); //通过在 I2C 总线上发送其 ID 来连接到 AT2404
    WRITE_DATA (EEPROM_Address);//选择 AT2404的指定 EEPROM 地址
    WRITE_DATA (EEPROM_Data);//在指定地址写入数据
    I2C_Stop (); //写入数据后停止 i2c 通信
    MS (5); //写入操作最多需要5ms,请参阅 At2404数据表


    unsigned char EEPROM_ReadByte (unsigned char EEPROM_Address、unsigned char Page_number)

    unsigned char EEPROM_Data;

    I2C_Start(); //开始 i2c 通信
    WRITE_ADDRESS (EEPROM_ID|(Page_NUMBER <1)); //通过在 I2C 总线上发送其 ID 来连接到 AT2404 (写入)
    WRITE_DATA (EEPROM_Address);//选择 AT2404的指定 EEPROM 地址
    I2C_Start(); //开始 i2c 通信
    WRITE_ADDRESS (0xA1|(Page_NUMBER <1)); //通过在 I2C 总线上发送其 ID 来连接到 AT2404 (读取)
    EEPROM_Data = I2C_READ ();//从指定地址读取数据
    I2C_NoAck ();
    I2C_Stop (); //读取数据后停止 i2c 通信
    美国(10);
    返回 EEPROM_Data; //返回读取的数据

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

    您是否已查看我们的 i2c_EEPROM 示例项目?

    我怀疑 EEPROM_WriteByte()中发生的情况是,在发送字地址和数据之后,您的 EEPROM 不会期望出现停止条件,但您的 WRITE_DATA()函数会在只有一个字节后(在您的情况下是字地址)才会发出停止条件。

    请阅读 TRM 的 I2C 章节、了解导致停止条件设置的条件。

    www.ti.com/.../spruhx5d

    惠特尼

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

    我已经阅读了给定的链接和示例、并参考这两个链接和示例来编写上述函数。 我想当我们加载 I2C 控制寄存器"I2cRegs.I2CMDR.ALL = 0x6E20"时、会自动生成 START 和 STOP 条件?

    我想知道"I2caRegs.I2CCNT"寄存器的功能是什么。 如果仅发送地址、我加载1、这是正确的?

    I2caRegs.I2CCNT = 1;//no of byte to send on i2c address

    如果我想发送地址+数据,那么 I2caRegs.I2CCNT =2是正确的??

    再想一想,当我连接 EEPROM 时,我必须先发送 EEPROM 地址+Page_Num,这不是问题,但是当我发送内存位置时,使用哪个寄存器??

    因此、我只编写两个用于写入地址的函数、另一个用于写入数据。 这是正确的????

    当我从 EEPROM 读取数据时、我会面临相同的问题。 请说明从 EEPROM 或任何其他设备读取数据的顺序。

    谢谢
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果我正确理解您的 EEPROM、我相信您会希望将 I2CCNT 设置为2。 当您设置 STT 位并且不计入 I2CCNT 值时、您输入 I2CSAR 的从地址将被发送。 存储器地址和数据是影响计数的2个字节。 一旦这两个字节被发送、停止条件将自动生成、硬件将清除 I2CMDR.STP 位以告知它已经被发送。

    惠特尼