主题中讨论的其他器件:LP5036、 MSP430F247、 TMS320F28035、 LP5569
最后、我在没有库函数的情况下对 I2C 进行编程-虽然有时会"卡住"、但一切看起来都正常。
这适用于全天候设备-非常简单-主要功能之一是闪烁的 LED。
我检查一下、如果 I2C 超时、I2C 应该被复位。 这在大部分时间都很有帮助-几乎是无法察觉的。
但在运行几个小时后、LED 停止闪烁并持续亮起、即使器件的其余功能正常工作-通过 RS485等进行通信
原因可能是什么? 我如何诊断 LED 是否持续亮起-是否有一个寄存器可以读取、以确保 LED 何时应亮起以及何时应亮起?
bool LP5036_bankColor(BYTE red, BYTE green, BYTE blue) { bool ret = 1; ret = LP5036_write2_Byte( LP5036_BANK_A_COLOR, red, green); if (ret != STATUS_SUCCESS) { Reset_I2C(); } return ret; } bool LP5036_write2_Byte(BYTE reg, BYTE data1, BYTE data2) //, BYTE data3) { WORD timeout = 1000; //Transmit Data to slave // UCB1I2CSA = LED_I2C_SLAVE_ADDR; // don't need - this is default UCB1IFG &= ~(UCTXIFG + UCRXIFG); // Clear any pending interrupts UCB1CTL1 |= UCTR + UCTXSTT; // I2C TX, start condition while(!(UCB1IFG & UCTXIFG) && --timeout); //Poll for transmit interrupt flag. if(timeout == 0) //Check if transfer timed out { return (STATUS_FAIL); } UCB1TXBUF = reg; while(!(UCB1IFG & UCTXIFG) && --timeout); //Poll for transmit interrupt flag. if(timeout == 0) //Check if transfer timed out { return (STATUS_FAIL); } UCB1TXBUF = data1; while(!(UCB1IFG & UCTXIFG) && --timeout); //Poll for transmit interrupt flag. if(timeout == 0) //Check if transfer timed out { return (STATUS_FAIL); } UCB1TXBUF = data2; while(!(UCB1IFG & UCTXIFG) && --timeout); //Poll for transmit interrupt flag. if(timeout == 0) //Check if transfer timed out { return (STATUS_FAIL); } UCB1CTL1 |= UCTXSTP; // Send stop condition return STATUS_SUCCESS; } void Reset_I2C(void) { UCB1CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, Enable SW reset UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode UCB1CTL1 &= ~UCSWRST; // Clear SW reset, resume operation }