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.

[参考译文] HALCOGEN:使用 HALCoGen API 的具有重复起始条件的 I2C 示例

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/776419/halcogen-i2c-example-with-repeated-start-condition-using-halcogen-api

器件型号:HALCOGEN

我有一个需要重新启动条件的 I2C 器件

下面是 I2C 对话的预期开始。

为了执行此重新启动、HALCoGen I2C API 调用的顺序是什么(避免生成 STOP)?
要获得此行为、我必须使用 i2cSetCount、i2cSetStop、i2cSetStart 和 i2cClearSCD 的组合?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Jan、
    请按照此主题操作,并告诉我它是否对您有所帮助: e2e.ti.com/.../520353

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

    在我记录此主题之前、我已经关注过它。

    它不会导致 有效的 i2c 交换。

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

    这是我从 RTC 读取/写入数据的代码。

    /*从从属设备读取*/
    int I2C_READ_M (短从器件添加、短读添加、短计数、uint8 *缓冲区)

    int i、error、dummy;
    误差= 0;

    if ((i2cREG1->STR & I2C_BUSBUSY)=0)//测试忙线是否占线

    /*清除停止位*/
    i2cREG1->MDR &=~(I2C_STOP_COND);
    /*清除起始位*/
    i2cREG1->MDR &=~(I2C_START_COND);
    /*清除重复模式位*/
    i2cREG1->MDR &=~(I2C_REPEATMODE);

    /*将方向设置为发送器*/
    i2cSetDirection (i2cREG1、I2C_transmitter);
    /*将模式设置为主设备*/
    i2cSetMode (i2cREG1、I2C_MASTER);
    /*配置数据计数*/
    i2cSetCount (i2cREG1、0x01);//表示1字节读取地址

    /*配置要与*/通话的从机地址
    i2cSetSlaveAdd (i2cREG1、Slave_Add);

    /*发送读取地址*/
    i2cSendByte (i2cREG1、Read_Add);

    /*开始发送*/
    i2cSetStart (i2cREG1);//开始传输:
    //I2C 总线:起始地址-从地址-读取地址

    while (((i2cREG1->STR & I2C_NACK)=0)&&((i2cREG1->STR & I2C_ARDY)=0));

    if ((i2cREG1->STR & I2C_NACK)==0)//检查 Acknoledge 是否为正
    { //应用程序可以继续
    /*将模式设置为主模式,并将接收器设置为*/
    i2cSetMode (i2cREG1、I2C_MASTER); //切换到主接收器
    i2cSetDirection (i2cREG1、I2C_RECEIVER);
    /*设置重复启动模式*/
    i2cREG1->MDR |= I2C_REPEATMODE;

    /*开始发送*/
    i2cSetStart (i2cREG1);//I2C 总线:start--Slave Addr

    (i=0;<Count; i++)

    buff [i]= i2cReceiveByte (i2cREG1);//读取传入数据并存储在数组中
    if (i ==Count-2){
    i2cSetStop (i2cREG1);//生成停止



    其他

    虚拟= i2cREG1->IVR;//清除 NACK 标志
    i2cSetStop (i2cREG1);//生成停止
    error=-2; //将错误设置为 NoAck


    否则{
    错误=-1;//将错误设置为总线忙


    while ((i2cREG1->MDR & I2C_STOP_COND)==1);

    返回错误;



    /*写入从设备*/
    int I2C_Write_M (短从器件添加、短写入添加、短计数、uint8 *缓冲区)

    Int 错误、伪; //返回代码
    错误= 0x00; //默认,无错误

    if ((i2cREG1->STR & I2C_BUSBUSY)=0)//测试忙线是否占线

    /*将方向设置为发送器*/
    i2cSetDirection (i2cREG1、I2C_transmitter);
    /*将模式设置为主设备*/
    i2cSetMode (i2cREG1、I2C_MASTER);

    /*清除起始位*/
    i2cREG1->MDR &=~(I2C_START_COND);
    /*设置编程计数后停止*/
    i2cSetStop (i2cREG1);

    /*清除 RM 位*/
    i2cREG1->MDR &=~(I2C_REPEATMODE);//不处于重复模式

    /*配置数据计数*/
    i2cSetCount (i2cREG1、Count+1);

    /*配置要与*/通话的从机地址
    i2cSetSlaveAdd (i2cREG1、Slave_Add);

    /*发送开始条件*/
    i2cSetStart (i2cREG1); //I2C 总线:启动-从器件地址

    /*发送写入地址*/
    i2cSendByte (i2cREG1、Write_Add);//发送数据到选择目标寄存器

    if ((i2cREG1->STR & I2C_NACK)==0)//检查 Acknoledge 是否为正

    /*轮询模式下的 Transmit data_count 数据数量*/
    i2cSend (i2cREG1、计数、缓冲器);

    否则{
    虚拟= i2cREG1->IVR;//清除 NACK 标志
    i2cSetStop (i2cREG1);//生成停止
    error=-2; //将错误设置为 NoAck


    否则{
    错误=-1;//将错误设置为总线忙


    while ((i2cREG1->MDR & I2C_STOP_COND)==1);

    返回错误;


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

    我会尝试。 什么指令可以在不执行 STOP 的情况下重新启动(请参阅第5行的开始表)?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Jan、
    您是否尝试过该代码?
    当模块处于重复模式时(I2CMDR 寄存器的 RM 位- i2cREG1->MDR |= I2C_REPEATMODE;)、当 STP 位为1时、将产生停止条件。 当 RM=0时、根据 I2CCNT 寄存器生成 STOP 条件。

    此致、
    米罗
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    还没有-商务旅行。 我将尽早检查。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    注意:我现在正在测试这个。 目前正在根据上述示例修改我的代码。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    哇,很棒!

    这是 TMS570LC03与从器件之间对话的截屏。

    重新启动恰好在我需要的位置发生。 不先停止:

    老实说、我还不完全理解示例代码。 我将更深入地学习、了解这是我希望它能做的事情的原因-以及我自己的代码为什么不能这么做。
    感谢您的支持、Hercules 团队!