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.

[参考译文] TMS320F28379S:F2837xS 外设驱动程序库-需要 I2C 模块示例

Guru**** 2539500 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/648349/tms320f28379s-f2837xs-peripheral-driver-library---i2c-module-example-needed

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

C2000变角、请在下面查找我的客户的消息、并提供一个接近其所需规格的示例。

我使用的是 F28377S 微控制器、

 

我对 i2cn´t 有一些疑问、因为我无法正确配置(用于发送要显示的数据的配置)。

 

我需要:

  • 微控制器必须是主器件。
  • 微控制器必须发送数据/Start–数据(带有从器件地址)–Stop / Bytes 到从器件。
  • I2C 数据必须在函数调用时发送(无中断)。

 

在 C2000或控制套件提供的示例中、不考虑这种情况(中断示例)。

 

在我的示例中,微控制器仅将从地址发送到 i2c 总线(不含数据),我不知道原因。

 

我尝试了许多 i2c 配置、但结果是相同的。

 

 

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

    我还想说的是、您可以查看为您的器件提供的器件引导 ROM 源中的 I2C 引导代码。 它们在 C200ware 中提供、位于以下位置。 查找 I2C_Boot.c、ROM 中的 I2C 引导实现了 I2C 主模式、并从 EEPROM 读取应用程序十六进制文件、而不使用中断。 如果您想进一步了解 I2C 引导、还请参阅 TRM 的器件引导 ROM 一章。

    C:\ti\c2000Ware_1_00_02_00\libraries\boot_rom\f2837xs\RevB\rom_sources\F2837x_bootrom\cpu01-bootrom\source

    I2C 引导是 EEPROM 只读的、不提供对 EEPROM 的写操作。 为此、您必须自行修改示例9C:\ti\c2000\C2000Ware_1_00_02_00\device_support\f2837xs\examples\cpu1\i2c_eeprom)。

    或者、您可以从 C200Ware 中提供的 I2C EEPROM 示例开始(C:\ti\c2000Ware_1_00_02_00\device_support\f2837xs\examples\cpu1\i2c_eeprom)、尝试使其按原样使用使用使用示例启用的中断。

    如果您不想使用中断,您仍然可以从示例开始,但您可以轮询 PIE 标志并逐渐修改代码以轮询 I2C 模块中的中断状态位,而不是在 PIE 级别启用中断。

    希望这对您有所帮助。

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

    您好、Santosh Athuru、

    我修改了 EEPROM 示例、但 i2c 输出错误(仅从设备地址)。

    I2C 输出:

    [0xA0-][0xA0-][0xA0-][0xA0-][0xA0-][0xA0-][0xA0-][0xA0-][0xA0-][0xA0-][0xA0-][0xA0-][0xA0-]

    [=启动

    ]=停止

    -= NACK

     连接了 I2C_ex2_EEPROM.c。

    可以帮帮我吗?

    我只需要向 i2c 总线发送信息。

    e2e.ti.com/.../i2c_5F00_ex2_5F00_eeprom.c

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

    附加调试:  

    此致、  

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

    劳尔
    您是否能够完成任何读取? 在尝试写入之前、还要检查 I2C 从器件引脚上是否启用了任何写入保护。
    您是否能够在不进行任何修改的情况下按原样使用示例、并查看缩进后在 I2C 行上看到的数据?

    虽然我们无法逐行查看用户代码行、从您的快照和消息中查看、但您所说的是消息缓冲区中的数据不会转换为行。 您是否验证了 I2C_putData 功能? 您是否看到消息缓冲器数据正在转换为 I2C 数据发送寄存器? I2C_putData 看起来不像您所想的那样工作、也检查所有 msg 结构初始化、但我会开始从该 I2C_putData 函数进行调试。

    此外、我在 TI 示例中看不到 I2C_putData 函数、但要检查该函数。

    希望这对您有所帮助。

    此致
    Santosh Athuru

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

    我不需要读取数据、只需要发送。
    是的、当示例运行时、结果是相同的(没有数据)。
    否、唯一的问题是、数据不会发送到 i2c 缓冲器(仅限从地址)。
    在中、使用了相同的函数(I2C_putData)-并且该示例无法正常工作。

    I2C_putData:
    静态空 I2C_putData (uint32_t base、uint16_t data)[内联]、[静态]
    "从 I2C 发送一个字节"。
    "此函数将提供的数据放入 I2C 数据发送寄存器"。

    您是否有任何确保正常工作的示例? (具有用于发送 i2c 数据的初始化配置和函数)。

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    最后我可以写入 i2c 总线!!

    感谢大家!

    此致、

    Franco Pagani
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    弗朗哥
    感谢您的更新。 您能告诉我们是什么解决了问题?是什么解决了问题?

    此致
    Santosh Athuru
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、有一些问题、现在我还有另一个问题、您可以帮我解决。

    问题:
    1 -当第一个字节(地址)中的 ACK 未被接收时,软件不会发送数据。
    2 -示例中发送 i2c 数据的序列不足以满足我的项目要求。

    新一期:
    i2c、当要发送的字符串小于16字节正常工作、但当数据主要大于16字节时、微控制器不会将所有字节发送到 i2c 总线。 仅发送16字节+地址字节(总共17个)。

    我的示例代码(问题字符串> 16字节):

    //包含的文件
    //
    #include "driverlib.h"
    #include "device.h"
    //
    //定义
    //
    #define SLAVE_ADDRESS 0x00

    //
    //全局
    //
    uint16_t sData[40]; //发送数据缓冲区
    uint16_t rDataPoint = 0; //跟踪数据流中的位置,以检查接收到的数据
    uint16_t i;
    //
    //函数原型
    //
    void initI2C (void);

    //
    //主函
    //
    void main (void)



    //
    //初始化设备时钟和外设
    //
    device_init();

    //
    //禁用引脚锁定并启用内部上拉。
    //
    DEVICE_initGPIO();
    //
    //初始化 GPIO 42和43分别用作 SDA A 和 SCL A
    //
    GPIO_setPinConfig (GPIO_42_SDAA);
    GPIO_setPadConfig (42、GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (42、GPIO_QUAL_异 步);

    GPIO_setPinConfig (GPIO_43_SCLA);
    GPIO_setPadConfig (43、GPIO_PIN_TYPE_PULLUP);
    GPIO_setQualificationMode (43、GPIO_QUAL_异 步);
    //
    //初始化 PIE 并清除 PIE 寄存器。 禁用 CPU 中断。
    //
    interrupt_initModule();

    //
    //使用指向 shell 中断的指针初始化 PIE 矢量表
    //服务例程(ISR)。
    //
    interrupt_initVectorTable();


    //
    //设置 I2C 使用,将其初始化为 FIFO 模式
    //
    initi2C();

    //
    //启用全局中断(INTM)和实时中断(DBGM)
    //
    EINT;
    ERTM;

    //
    //永久循环。
    //
    while (1)


    I2C_DisableModule (I2CA_BASE);
    I2C_clearInterruptStatus (I2CA_BASE、I2C_INT_RXFF | I2C_INT_TXFF);
    I2C_enableModule (I2CA_BASE);

    sData[0]= 0x01;
    sData[1]= 0x02;
    sData[2]= 0x03;
    sData[3]= 0x04;
    sData[4]= 0x05;
    sData[5]= 0x06;
    sData[6]= 0x07;
    sData[7]= 0x08;
    sData[8]= 0xB1;
    sData[9]= 0xB2;
    sData[10]= 0xB3;
    sData[11]= 0xB4;
    sData[12]= 0xB5;
    sData[13]= 0xB6;
    sData[14]= 0xB7;
    sData[15]= 0xB8;
    sData[16]= 0xC1;
    sData[17]= 0xC2;
    sData[18]= 0xC3;
    sData[19]= 0xC4;
    sData[20]= 0xC5;
    sData[21]= 0xC6;
    sData[22]= 0xC7;
    sData[23]= 0xC8;



    I2C_setSlaveAddress (I2CA_BASE、SLAVE_ADDRESS);
    I2C_setDataCount (I2CA_BASE、24);

    对于(I = 0;I <24;I++)

    I2C_putData (I2CA_BASE、sData[i]);


    //
    //将 START 作为主发送器发送
    //

    I2C_setConfig (I2CA_BASE、I2C_MASTER_SEND_MODE);
    I2C_sendStopCondition (I2CA_BASE);
    I2C_sendStartCondition (I2CA_BASE);

    DEVICE_DELAY_US (100000);







    //
    //函数、用于在 FIFO 模式下配置 I2C A。
    //
    空 initI2C()


    //
    //必须在配置 I2C 之前将其复位
    //
    I2C_DisableModule (I2CA_BASE);

    //
    // I2C 配置。 使用占空比为33%的50kHz I2CCLK。
    //
    I2C_initMaster (I2CA_BASE、DEVICE_SYSCLK_FREQ、50000、I2C_DUTYCYCLE_33);
    I2C_setBitCount (I2CA_BASE、I2C_BITCOUNT_8);
    I2C_setSlaveAddress (I2CA_BASE、SLAVE_ADDRESS);
    I2C_setEmulationMode (I2CA_BASE、I2C_emulation_free_run);

    //
    //启用停止条件和寄存器访问就绪中断
    //
    I2C_enableInterrupt (I2CA_BASE、I2C_INT_STOP_Condition |
    I2C_INT_REG_ACCESS_RDY);

    //
    // FIFO 配置
    //
    I2C_enableFIFO (I2CA_BASE);
    I2C_clearInterruptStatus (I2CA_BASE、I2C_INT_RXFF | I2C_INT_TXFF);

    //
    //配置完成。 启用模块。
    //
    I2C_enableModule (I2CA_BASE);




    //
    //文件结束
    //


    I2C 输出:

    [0x00+0xB1+0xB2+0xB3+0xB4+0xB5+0xB6+0xB7+0xB8+0xC1+0xC3+0xC4+0xC5+0xC6+0xC7+0xC8+
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    弗朗哥

    [引用 user="Franco Pagani">问题:
    1 -当第一个字节(地址)中的 ACK 未被接收时,软件不会发送数据。
    2 -示例中发送 i2c 数据的序列不足以满足我的项目要求。

    是的、在上面、数据应根据需要进行帧或由从器件进行规范。 如果 salve 设备不理解正在接收的数据、则通信将中断。 这是一个很好的进展 、感谢更新。

    [引用 user="Franco Pagani">新问题:
    i2c、当要发送的字符串小于16字节正常工作、但当数据主要大于16字节时、微控制器不会将所有字节发送到 i2c 总线。 仅发送16字节+地址字节(总共17个)。 [/报价]

    在出现新问题时、请查看是否可以使用重复模式。 如果您的要求是在软件发出停止或新的开始重复模式之前一直发送数据字节、则您需要使用该模式。 请参阅 TRM 中的第20.3.3节和表20-2、20-3、了解您可以根据需要使用的不同模式。

    希望这对您有所帮助。

    此致

    Santosh Athuru

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Athuru、如果我使用重复模式、则会感应 Stop、但仅感应16个数据字节(最后16个数据字节)。

    数据到 i2c:

    sData[0]= 0x01;
    sData[1]= 0x02;
    sData[2]= 0x03;
    sData[3]= 0x04;
    sData[4]= 0x05;
    sData[5]= 0x06;
    sData[6]= 0x07;
    sData[7]= 0x08;
    sData[8]= 0xB1;
    sData[9]= 0xB2;
    sData[10]= 0xB3;
    sData[11]= 0xB4;
    sData[12]= 0xB5;
    sData[13]= 0xB6;
    sData[14]= 0xB7;
    sData[15]= 0xB8;
    sData[16]= 0xC1;
    sData[17]= 0xC2;
    sData[18]= 0xC3;
    sData[19]= 0xC4;
    sData[20]= 0xC5;
    sData[21]= 0xC6;
    sData[22]= 0xC7;
    sData[23]= 0xC8;

    I2C 输出:

    [0x00+0xB1+0xB2+0xB3+0xB4+0xB5+0xB6+0xB7+0xB8+0xC1+0xC3+0xC4+0xC5+0xC6+0xC7+0xC8+]

    发送顺序:

    I2C_DisableModule (I2CA_BASE);
    //I2C_clearInterruptStatus (I2CA_BASE、I2C_INT_RXFF | I2C_INT_TXFF);
    I2C_enableModule (I2CA_BASE);

    I2C_setSlaveAddress (I2CA_BASE、SLAVE_ADDRESS);
    I2C_setDataCount (I2CA_BASE、24);

    对于(I = 0;I <24;I++)

    I2C_putData (I2CA_BASE、sData[i]);


    //
    //将 START 作为主发送器发送
    //

    I2C_setConfig (I2CA_BASE、I2C_MASTER_SEND_MODE | I2C_REPEACT_MODE);
    I2C_sendStopCondition (I2CA_BASE);
    I2C_sendStartCondition (I2CA_BASE);

    DEVICE_DELAY_US (100000);

    ----------------------------------------


    有什么想法吗?

    此致、
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    弗朗哥
    我没有尝试过这种方法、但尝试禁用 FIFO 模式、并查看您是否可以在循环中直接将数据写回回 I2C DXR。 您可以使用 ARDY 位查看何时可以放置下一个字节。

    您应该也能够使用 FIFO、但是一旦写入16个字节(FIFO 长度)、您应该查找 ARDY 位以查看 FIFO 是否已准备好接收更多数据。

    我看到、在您的 while (1)循环中、您正在重新初始化 I2C、在24字节循环结束时、您正在发送 STOP 和 START。 您是否正在尝试查看是否所有24个字节都在停止前输出?

    此外、在将数据放入数据寄存器(或 FIFO)之前、应启用发送和重复模式。

    此致
    Santosh Athuru
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    否、我只需要发送所有字节>>开始-所有字节(24个或更多)-停止。

    是的、FIFO 长度为16字节。

    如何在代码中实现此选项?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    以下哪一项是发送的正确顺序和 i2c 配置:start - all bytes (一对一- number bytes >16)- stop?

    此致、

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

    需要 I2C_clearStatus。

    序列:

    uint16_t i;


    initi2C();


    I2C_setConfig (I2CA_BASE、I2C_MASTER_SEND_MODE | I2C_REPEACT_MODE);
    I2C_sendStartCondition (I2CA_BASE);

    对于(I = 0;I <num_bytes; i++)

    I2C_setConfig (I2CA_BASE、I2C_MASTER_SEND_MODE | I2C_REPEACT_MODE);
    I2C_putData (I2CA_BASE、Getdata[i]);
    I2C_clearStatus (I2CA_BASE、I2C_STS_RX_DATA_RDY);
    DEVICE_DELAY_US (10000);


    //
    //将 START 作为主发送器发送
    //

    I2C_sendStopCondition (I2CA_BASE);

    DEVICE_DELAY_US (100000);


    谢谢、

    此致、

    Franco Pagani
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    弗朗哥
    感谢您确认并发布解决方案。 请告诉我我们是否可以关闭帖子。

    此致
    Santosh Athuru
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、您可以关闭帖子。

    感谢大家、

    此致、