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.
如标题所示。 我正在尝试让 I2C 在 MSP430F2272上工作、并且在脱离接地时遇到一些问题。 从本质上重新格式化的示例代码开始、我只是尝试在主模式下发送一条消息。 微控制器正在发送某些数据、但数据远未达到 I2C 标准(请参阅屏幕截图)。 我怀疑我缺少一些简单的东西。 请提供任何帮助。
谢谢!
Jason
void Initialize( void )(空)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器
P3SEL |= 0x06; //将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST; //启用 SW 复位
UCB0CTL0 = UCMST+UCMODE_3+UCSYNC; // I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2+UCSWRST; //使用 SMCLK、保持软件复位
UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
}//初始化
void SetSector (void)(空)
{
UCB0I2CSA = 0x70; //将从器件地址设置为多路复用器
UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复运行
IE2 |= UCB0TXIE; //启用 TX 中断 //我们是否需要这种情况发送????
UCB0CTL1 |= UCTXSTT; // I2C TX、启动条件 //3.
UCB0TXBUF = 0x01; //写入 DAC 控制字节
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
IFG2 &=~UCB0TXIFG; //清除 USCI_B0 TX 内部标志
UCB0CTL1 |= UCSWRST; //启用 SW 复位
}//SetSector
您好 Jason、
您在这里似乎既不使用中断驱动型 I2C、也不应用正确的轮询 I2C 方法。
如果您不想使用带有 ISR 的中断驱动方法来发送字节、则无需启用 TX 中断或清除标志。
对于 I2C、如果您想使用轮询方法、为了确保在发送数据字节后正确发送停止条件、您应该轮询 TX 标志并等待该标志被触发、然后再发出 I2C 停止条件:
while (!(IFG2 & UCB0TXIFG));
UCB0CTL1 |= UCTXSTP;// I2C 停止条件
您似乎也缺少 UCTR 标志来启动传输、除了 UCTXSTT 标志之外、还应使用该标志:
UCB0CTL1 |= UCTR + UCTXSTT;// I2C TX、启动条件
查看这些修复是否有助于解决您的问题。
您好、Ralph、
这让我有了一个很好的开始字节(还有一个激动人心的客户,谢谢!) 但数据字节似乎仍在损坏。 我尝试过:
-更早加载 Tx 缓冲器
-在加载 Tx 缓冲器之前添加 Tx 标志延迟(请参阅注释掉的行)
最新代码:
void Initialize( void )(空)
{
int StartupLoop = 0;
WDTCTL = WDTPW + WDTHOLD; //停止看门狗计时器
for (StartupLoop = 10000;StartupLoop > 1;StartupLoop -)
{
_nop();
}
P3DIR |= 0x80; //set ~COMM_RESET 作为输出
P3OUT |= P3_COMM_RESET_N;
P3SEL |= 0x06; //将 I2C 引脚分配给 USCI_B0
UCB0CTL1 |= UCSWRST; //启用 SW 复位
UCB0CTL0 = UCMST+UCMODE_3+UCSYNC; // I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2+UCSWRST; //使用 SMCLK、保持软件复位
UCB0BR0 = 12; // fSCL = SMCLK/12 =~100kHz
UCB0BR1 = 0;
}
void SetSector (void)(空)
{
UCB0I2CSA = 0x70; //将从器件地址设置为多路复用器
UCB0CTL1 &=~UCSWRST; //清除 SW 复位,恢复运行
UCB0CTL1 |= UCTR + UCTXSTT; // I2C TX、启动条件 //3.
// while (!(IFG2 & UCB0TXIFG)); //等待 Tx 标志。 这是需要的吗?
UCB0TXBUF = 0x01; //写入控制字节
while (!(IFG2 & UCB0TXIFG)); //等待 Tx 标志。
UCB0CTL1 |= UCTXSTP; // I2C 停止条件
UCB0CTL1 |= UCSWRST; //启用 SW 复位
}