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.

[参考译文] TMS320F2.8386万D:接收nack后发送停止序列(主写入)

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

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1098581/tms320f28386d-sending-a-stop-sequence-after-receiving-nack-master-write

部件号:TMS320F2.8386万D
主题中讨论的其他部件: C2000WARE

您好,

  我正在与 TMS320F2.8386万D进行I2C通信,我正在尝试实现 以下行为。

我希望I2C模块在出现nack'ed.消息后发送停止序列  目前我的代码只发送

停止成功写出所有字节的消息序列。  这对我所处的从属设备很重要  

正在写入,每条消息后都会出现停止序列,以便它识别我的重试。

  在TRM中,它对I2CMDR.STP寄存器进行了如下说明:"... 设备已将STP设置为生成停止  

I2C模块的内部数据计数器倒计数到0英寸时的情况。  在TRM中,它还提到了  

I2CNT寄存器,"The value written to I2CCNT is copied to an internal data counter.  内部数据计数 器将递减

每个传输的字节由1 ... 如果在主模式(I2CMDR上的STP)中请求停止条件,I2C模块将终止

倒计时完成时的停止条件下的传输..."  我尝试利用这些点在我的中生成停止条件  

在一个nack后对机器进行状态。  非常感谢您的任何帮助,谢谢。 我在下面附上了我的代码片段。

switch(Substate)
{
	case -1:
	{      //NACK Detected

		EALLOW;
		I2caRegs->I2CSTR.bit.SCD = 1;
		I2caRegs->I2CMDR.bit.STP = 1; //Enabling the Stop condition upon CNT = 0;
		I2caRegs->I2CCNT = 0; //Trying to trick the I2C module that I have sent all of its bytes
		EDIS;

	
		if(masterWriteRetryCtr < masterWriteRetryLim)
		{
			//Code For Retry
			...
			//End Code For Retry
		}
		else
		{ 
			Substate = 0;
		}
		break;
	}
	 case 0:
	 {   // Master write complete.
		masterWriteRetryCtr = 0;
		break;
	 }
		
	 case 1:
	 {   // Transmit the next byte in Buffer, or end the master write process.
		 if ((I2caRegs->I2CSTR.bit.XRDY) || (I2caRegs->I2CSTR.bit.ARDY))
		 { //If its ready to send
			 if(I2caRegs->I2CSTR.bit.NACK)
			 {Substate = -1;}
			 else
			 {
				 I2caRegs->I2CDXR.all = Buffer[Ptr]; //Put next byte into transmit register
				 Ptr++;
			}
		 }
				 
		 if (I2caRegs->I2CSTR.bit.SCD == 1)
		 { //If Stop Condition
			 Substate = 0;
			 EALLOW;
			 I2caRegs->I2CSTR.bit.SCD = 1;
			 EDIS;}
			 break;
	 }
	 
	  case 2:
	  {   // Configure to be Master.
		  EALLOW;
		  Ptr = 0;
		  Substate = 1; 
		  I2caRegs->I2CCNT = ByteCount;       //NUMBER OF BYTES TRANSMITTING
		  I2caRegs->I2CMDR.bit.MST = 1;    	  //Master
		  I2caRegs->I2CMDR.bit.TRX = 1;       //Transmitting
		  I2caRegs->I2CMDR.bit.STP = 1;       //Send I2C STOP Sequence when CNT == 0
		  I2caRegs->I2CSTR.bit.SCD = 1;       // Clear any Detected Stops
		  I2caRegs->I2CMDR.bit.STT = 1;
		  EDIS;
		  break;
		  }
}

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

    您好,  

    您可以在代码中执行以下操作。  

    如果收到nack, 发送停止并清除nack位。  

    以下代码片段来自C2000Ware中包含的其中一个示例。 这使用driverlib API,您可以使用bitfield执行相同的操作。   

    uINT16_t手柄NACK (UINT32_t底座)

    IF (I2C_getStatus (BASE)和I2C_STS_NO_ACK)

    I2C_clearStatus (BASE,I2C_STS_NO_ACK);
    I2C_sendStopCondition (base);

    返回error_nack_received;
    }

    返回成功;
    }

    此致

    Siddharth

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

    你好Siddharth:

    感谢你的帮助。

    我想跟进一下您的回答。

    我正在尝试将您的示例转换为其位字段实现。

    对于"  I2C_clearStatus (base,I2C_STS_NO_ACK ",我使用了"I2CaRegs.I2CSTR.bit.nack = 1";

    但对于 “I2C_sendStopCondition (base)”,我应该只使用“I2CaRegs.I2CMDR.Bit.STP =1;”吗?

    再次感谢您的帮助,

    Daniel Brescia

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

    Daniel,  

    可以,您可以使用 I2caRegs.I2CMDR.bit.stp = 0x1;发送停止条件。

    此致

    Siddharth
     

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

    谢谢Siddharth,我现在能够生成停止条件。

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

    Daniel,  

    很高兴您能解决这个问题。 将关闭此线程。

    此致

    Siddharth