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:是否可以在中断之外控制i2c ack或i2c TX延迟

Guru**** 2540720 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/620951/ccs-is-it-possible-to-control-i2c-ack-or-i2c-tx-latency-outside-of-interrupt

主题:USB-TO-GPIO中讨论的其他部件

工具/软件:Code Composer Studio

我正在使用连接到2.8035万 EVM板的TI USB适配器接口。

是否可以在中断之外控制i2c ack或i2c TX延迟。
我想收集中断内部的数据并在中断外部进行一些操作。
这样在处理数据时就不需要阻止中断。
我认为我可以忽略TX中断,直到处理完成。
对于较小的延迟,似乎工作正常,但延迟更长...
我想知道我是否可以控制主设备的应答或响应时间,以便我有足够的时间
解析数据。

unsigned char InBuffer[BUFSIZ];
unsigned char OutBuffer[BUFSIZ];
int InBufIndex =0;
int
OutBufIndex =0;
int OutBufPos =0;

void main(void)
{
	InitSysINT();
	InitGpio();
	DCtrl;
	InitPieCtrl(); Init; IER=0x0000;
	
	IFR = 0x0000;
	InitPieVectorTable();
	EALLOW;
	PieVectorTable.TINT0 =&CPU_timer0_ISR;
	PieVectorTable.I2CINT1A =&I2CSlaveInt1a;
	InitI2C();
	InitCpuTimers();
	ConfigCpuTimer(&CpuTimer0,6010000);
	CpuTimer0Regs.tcr.all = 0x4001;
	IER || M_INT1;
	IER || M_INT8;
	PieCtrlRegs.PIEIER1.bit.INTx7 = 1;
	PieINTlRegs.PIIEIER8.bit.Ctrlx1 = 1;
	EINT;
	ERTM;

	for (;;){/*
		每隔100ms或500ms */
		I2CDataHandler();
	}


作废InitI2C(void)
{
I2caRegs.I2COAR = 0x50;
I2caRegs.I2CPsc.all = 9;
I2caRegs.I2CCLKL = 10;
I2caRegs.I2CCLKH = 5;
I2caRegs.I2CIER = 0x7f;
I2caRegs.I2CMDR.bit.IRS = 1;
I2caRegs.I2CMDR.bit.rm = 0;
}

中断void I2CSlaveInt1a(void)
{
UINT16 intSrc = I2caRegs.I2CISRC.bit.INTCODE;

开关(intSrc){
案例I2C_NO_ISRC:
中断;

案例I2C_ARB_ISRC:
中断;

案例I2C_Nack_ISRC:
中断;

案例I2C_ARDY_ISRC:
info.ardyCount++;
如果(I2caRegs.I2CSTR.bit.nack ==1){
I2caRegs.I2CMDR.bit.stp = 1;
I2caRegs.I2CSTR.All = I2C_CLR_nack_bit;
}
中断;

案例I2C_RX_ISRC:
		/*接收中断*/中的数据
InBuffer[InBufPos+]= I2caRegs.I2CDRR;
中断;

案例I2C_TX_ISRC:
		/*在中断中传输其余数据*/
如果(OutBufIndex < OutBufPos){
I2caRegs.I2CDXR = OutBuffer[OutBufIndex+];
OutBufIndex &= 0xff;
}
中断;

案例I2C_SCD_ISRC:
中断;

案例I2C_AAS_ISRC:
中断;
}

PieCtrlRegs.PIEACK.ALL = PIEACK_group8;
}

void I2CDataHandler(void)
{
	OutBuffer[0]= 0x22;
	OutBuffer[1]= 0x23;
	OutBufPos =2;
	OutBufIndex =0;
	
	I2caRegs.I2CDXR = OutBuffer[0];
	OutBufIndex+;}

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

    您能否详细介绍一下您的设置? 您是否正在将C2000配置为主发射器/接收器,从属设备等? 您使用的是哪种格式(7位寻址,10位寻址和自由数据模式)? 您希望中断处理的确切内容是什么?您希望在main中执行哪些操作?

    对于所有三种模式,接收器在收到一个字节后生成ACK。 此外,请查看以下用户指南,了解其是否有您要寻找的答案。

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

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

    感谢您的回复。
    我的C2000 (2.8035万)被配置为使用7位寻址模式的从属器件。
    主器件是TI的USB-GPIO (www.ti.com/.../USB-TO-GPIO)。

    如上一篇文章所述,我希望接收中断中的所有数据,然后在主循环中处理这些数据。
    处理完数据后,对主设备(PC)作出响应。
    主要目的不是占用中断。
    处理完数据后,触发发射器中断或向主设备发送一个ACK。

    我想我可以通过摄取第一个TX中断来控制响应时间。 (不向I2CaRegs.I2CDXR发送字节)

    正如您在开关盒I2C_TX_ISRC中看到的那样,如果数据未被处理,则可能会忽略此选项。
    在I2CDataHandler中处理数据后,将一个字节写入I2CaRegs.I2CDXR以继续发送器中断。

    www.ti.com/.../sprufz9d.pdf (第15页,从属发射器模式部分)

    但是,中断似乎不像我预期的那样工作。
    如果响应时间(延迟)更长,I2C可能会出现故障。


    因此,我想知道是否可以在中断之外控制i2c ack或i2c TX延迟,
    或者我必须处理中断中的数据处理?


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

    很抱歉,我花了很长时间才回复您。

    我认为没有办法控制ACK延迟,因为它是由接收器在每个字节之后发送给发送器的。 这符合I2C协议规范。

    我认为您可以在某种程度上控制TX延迟,并设计您的程序以将数据保存到中断内的全局变量,并在中断外处理保存的数据。 您的从属设备可以在处理数据时保持SCL低电平(在I2CSTR中RSFULL =1),然后将其传输回主设备。 参考指南对此进行了更详细的说明。

    希望这能有所帮助,

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

    感谢您的回复。
    我认为控制延迟不是很准确,我的错误。
    我将尝试将RSFULL设置为1,看看这是否可以实现我的目标。
    非常感谢您的回复。


    此致,
    Archer