您好!
我尝试切换到 USCI_B I2C Driverlib、我注意到我无法重现干净的重复启动条件(例如、从从器件读取一个字节)。 如果我用示波器观察波形、我可以看到 SDA 线路在上升和下降、甚至没有达到3V3电平。 也许对于我正在使用的 i2c 从器件来说已经足够了(它可以正常工作、我接收到正确的字节)、但我正在尝试确定这是否代表潜在的错误原因。
以下是代码段(带和不带 driverlib):
//测试 RGB (制造商 ID = 0xE0)
USCI_B_I2C_setSlaveAddress (USCI_B0_BASE、RGBFR_ADDR);
IF (USCI_B_I2C_masterSendSingleByteWithTimeout (USCI_B0_BASE、Manufacturer_ID、20000))
{
IF (USCI_B_I2C_masterReceiveSingleStartWithTimeout (USCI_B0_BASE、20000))
{
receivedMsg = USCI_B_I2C_masterReceiveSingle (USCI_B0_BASE);
}
}
if (receivedMsg=0xE0) peripherals |= RGB_FRECCE;
receivedMsg=0;
这是我在没有 driverlib 的情况下生成的函数、被称为"I2C_Receive_Single_Byte (RGBFR_ADDR、Manufacturer_ID)"
char I2C_Receive_Single_Byte (char Slave_Address、char RegAddr)
{
char received_data=0x00;
UCB0I2CSA = Slave_Address; //地址分配
UCB0IFG &=~ UCTXIFG; //标志清零
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、启动条件
while (!(UCB0IFG&UCTXIFG)); // while Flag=0 (UCTXIFG=1当生成 START 时、可以写入数据)
UCB0IFG &=~ UCTXIFG; //标志清零
UCB0TXBUF = RegAddr; //数据(要读取的寄存器)加载
while (((UCB0CTL1&UCTXSTT) )// while start not ack'ed
{
if (UCB0IFG&UCNACKIFG) // if NACK,发出 STOP 和 EXIT
{
UCB0IFG &=~ UCNACKIFG;
UCB0CTL1 |= UCTXSTP;
返回1;
}
}
UCB0CTL1 &=~ UCTR; //准备接收
UCB0IFG &=~(UCTXIFG+UCRXIFG); //标志清零
UCB0CTL1 |= UCTXSTT; //发出重复起始
while (UCB0CTL1&UCTXSTT) // while start not ack'ed
{
if (UCB0IFG&UCNACKIFG) // if NACK,发出 STOP 和 EXIT
{
UCB0CTL1 |= UCTXSTP;
返回1;
}
}
UCB0CTL1 |= UCTXSTP;
while (!(UCB0IFG&UCRXIFG)); //未接收字节
Received_data = UCB0RXBUF; //读取并保存
_delay_cycles (10000);
返回 Received_data; //自描述
}
我是否应该在 driverlib 中引入某种额外的轮询? 我什么都不担心?
谢谢!