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.

[参考译文] TMS320F28069:IO 扩展器 PCA9536D 上的 I2C 读取/写入问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1032996/tms320f28069-problem-with-i2c-read-write-on-io-expander-pca9536d

器件型号:TMS320F28069
主题中讨论的其他器件:PCA9536

您好!

我在自己的电路板上使用了 I2C 总线、并通过 F28069驱动 EEPROM 24EE256和 PCA9536。 地址正常:一个为0x50 (EEPROM),另一个为0x41 (用于 PCA)。

使用 EEPROM 时、一切都正常、与代码完美配合、但 IO 扩展器永远不会应答写入或读取请求。

我每20ms 发送一次写入命令。 我没有任何错误。 我加入了示波器打印屏幕和源代码。

我使用 " UINT16 I2C_Write_Data (UINT16 Slave_address、UINT16寄存器、UINT16 Data)" 、例如

I2C_Write_Data (0x41、0x0001、0x0000);//每20ms 执行一次

我请求向寄存器0x1写入0x0到器件地址0x41、但在示波器上、我只能看到地址0x41、没有数据?! 为什么?

如果您有任何想法、请告诉我。 感谢你的帮助

OL

//##################### I2C_Write_Data #################################################################################
// Function Name: void I2C_Write_Data
// Return Type: Uint16
// Arguments: Uint16 Slave_address, Uint16 Register, Uint16 Data
// Description: I2C_Write_Data
//#################################################################################################################
Uint16 I2C_Write_Data(Uint16 Slave_address, Uint16 Register, Uint16 Data)//
{
	Uint16 ii = 0;
	Uint16 TimeOutI2C = 0;

		I2caRegs.I2CMDR.bit.IRS = 1; 				// reset I2C

		__asm(" RPT #10 || NOP");

		// Make sure I2C is not busy and has stopped
		while (I2caRegs.I2CSTR.bit.BB == 1) //;		// busy loop
		{
				TimeOutI2C++;
				if(TimeOutI2C > 20000)
					return 0;
		}
		TimeOutI2C = 0;

		// Clear the SCD bit (stop condition bit)
		I2caRegs.I2CSTR.bit.SCD = 1;				// Clear the SCD bit (stop condition bit)

		while(I2caRegs.I2CMDR.bit.STP == 1) //;		// stop bit loop
		{
				TimeOutI2C++;
				if(TimeOutI2C > 20000)
					return 0;
		}
		TimeOutI2C = 0;

		// code d'origine
		//##################################################
		I2caRegs.I2CSAR = Slave_address;

		//still busy?
		while(I2caRegs.I2CMDR.bit.STP != 0){
			TimeOutI2C++;
			if(TimeOutI2C > 20000)
				return 0;
		}
		TimeOutI2C = 0;

		// Start bit, write mode, Higher 16 address bits, Master, Repeat mode.
		I2caRegs.I2CMDR.bit.TRX = 1; //TRANSMIT_MESSAGE;

		I2caRegs.I2CDXR = Register; // Register

		//##################################################//
		I2caRegs.I2CMDR.all = 0x26A0; //01 00 11 01 01 00 000
		//I2caRegs.I2CMDR.all = 0x27A0; //01 00 11 01 01 00 000
	/*	I2caRegs.I2CMDR.bit.NACKMOD = 0;		// NACK mode bit
		I2caRegs.I2CMDR.bit.FREE 	= 1;		// Stop I2C when suspended
		I2caRegs.I2CMDR.bit.STT 	= 0;		// START condition bit
		I2caRegs.I2CMDR.bit.STP 	= 0;		// STOP condition bit
		I2caRegs.I2CMDR.bit.MST 	= 1;		// Master mode
		I2caRegs.I2CMDR.bit.TRX 	= 1;		// Transmitter mode
		I2caRegs.I2CMDR.bit.XA 		= 0;		// 7-bit addressing mode
		I2caRegs.I2CMDR.bit.RM 		= 1;		// Repeat Mode
		I2caRegs.I2CMDR.bit.DLB 	= 0;		// Digital loopback mode is disabled
		I2caRegs.I2CMDR.bit.IRS 	= 1;		// The I2C module is enabled
		I2caRegs.I2CMDR.bit.STB 	= 0;		// The I2C module is not in the START byte mode
		I2caRegs.I2CMDR.bit.FDF 	= 0;		// Free data format mode is disabled
		I2caRegs.I2CMDR.bit.BC 		= 000;		// 8 bits per data byte
		*/

		//(Lower 16) address bits
		while(I2caRegs.I2CSTR.bit.ARDY != 1){
			TimeOutI2C++;
			if(TimeOutI2C > 20000)
				return 0;
		}
		TimeOutI2C = 0;

		I2caRegs.I2CDXR = Data;  //

		while (I2caRegs.I2CSTR.bit.NACK == 1) // Clear if NACK received
		{
			I2caRegs.I2CSTR.bit.NACK = 1;

			TimeOutI2C++;
			if(TimeOutI2C > 20000)
				return 0;
		}
		TimeOutI2C = 0;

		I2caRegs.I2CMDR.all = 0x0EA0;
	/*	I2caRegs.I2CMDR.bit.NACKMOD = 0;		// NACK mode bit
		I2caRegs.I2CMDR.bit.FREE 	= 1;		// Stop I2C when suspended
		I2caRegs.I2CMDR.bit.STT 	= 0;		// START condition bit
		I2caRegs.I2CMDR.bit.STP 	= 1;		// STOP condition bit
		I2caRegs.I2CMDR.bit.MST 	= 1;		// Master mode
		I2caRegs.I2CMDR.bit.TRX 	= 0;		// Transmitter mode
		I2caRegs.I2CMDR.bit.XA 		= 0;		// 7-bit addressing mode
		I2caRegs.I2CMDR.bit.RM 		= 0;		// Nonrepeat mode
		I2caRegs.I2CMDR.bit.DLB 	= 0;		// Digital loopback mode is disabled
		I2caRegs.I2CMDR.bit.IRS 	= 1;		// The I2C module is enabled
		I2caRegs.I2CMDR.bit.STB 	= 0;		// The I2C module is not in the START byte mode
		I2caRegs.I2CMDR.bit.FDF 	= 0;		// Free data format mode is disabled
		I2caRegs.I2CMDR.bit.BC 		= 000;		// 8 bits per data byte
	*/

		while(I2caRegs.I2CSTR.bit.SCD != 1){
			TimeOutI2C++;
			if(TimeOutI2C > 20000)
				return 0;
		}
		TimeOutI2C = 0;

		I2caRegs.I2CSTR.bit.SCD = 1; // Clear stop condition

		return 1;
	}

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

    您好、OL、

    看起来 PCA9536从器件没有响应0x41地址、并且 F28069正在接收 NACK。 如果您检查第9个时钟周期、则波形中的 ACK/NACK 位为1。 您的 PCA9536从器件应将 SDA 线(绿色)拉至低电平以确认从器件地址。

    最棒的

    Kevin

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

    大家好、Kevin

    感谢您的回复。 对于小袋来说还可以,但为什么呢? 我没有找到原因。 你有什么想法吗?

    此致、

    OL

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

    您好、OL、

    检查 PCA9536数据表0x41是要使用的正确从器件地址。 这可能是一个与硬件相关的问题、这是我们首先想到的问题。

    • 您能否确认 PCA9536器件的电路和连接是否正确? 请随时在此处分享原理图的部分供我查看。
    • PCA9536器件可能已因某种原因损坏。 您是否能够将此组件替换为新组件?
    • 您可以尝试的另一件事是使用较慢的 I2C 频率、如100KHz、然后查看它是否起作用

    最棒的

    Kevin

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

    尊敬的 Kevin:

    感谢您的回答和帮助。 我有一个工作良好的 EEPROM 24AA256。 因此连接应该正常。

    我尝试了@125kHz、它是相同的。

    这是原理图

    周一,我将尝试另一个主板或更改 PCA。

    不管怎样,如果你有其他想法,我会采纳他们!

    周末愉快

    此致

    Olivier

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

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

    Olivier、您好!

    原理图看起来不错、没有发现任何问题。

    对于您捕获并提供的波形、您是否在靠近 PCA9536器件的位置进行物理探测? 我假设您是、但只是检查一下。 似乎问题可能是 PCA9536部件损坏。

    另一个我想检查的是 F2806x 器件的内部上拉电阻是否被启用。 默认情况下启用它们、您必须通过将相应的 GPAPUD/GPBPUD 寄存器位设置为1来禁用它们。 内部上拉电阻可能会影响 PCA9536将 SDA 线路拉至低电平的能力。

    最棒的

    Kevin