主题中讨论的其他器件: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
}



