工具/软件:Code Composer Studio
大家好
我有一个与传感器通信的板、但我想使用 MSP430F5529而不是该板。 我正在 MSP430 (主器件)和传感器(从器件)之间通过 I2C 进行通信。 我已经为主器件编写了代码、但无法完全正常工作。
这就是处理事务之间的延迟时的工作方式。 第一个延迟约为15us 、第二个延迟约为60us。 SMCLK 为200kHz。
主器件首先发送一个开始条件、然后发送寄存器地址(0)。 之后、他进行重启、从机发送数据(15)。
这就是它目前的情况。 问题是事务之间没有延迟、因此从站无法传输数据。 主器件始终接收"0"而不是"15"。
以下是我的代码:
int main (空)
{
WDTCTL = WDTPW + WDTHOLD;//停止 WDT
P3SEL |= 0x03;//将 I2C 引脚分配给 USCI_B0
P8DIR |= BIT1;//将 P8.1设置为输出方向
P8OUT |= BIT1;
for (x=100;x>0;x--);
UCB0CTL1 |= UCSWRST;//启用 SW 复位
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;// I2C 主器件、同步模式
UCB0CTL1 = UCSSEL_2 + UCSWRST;//使用 SMCLK
UCB0BR0 = 6;// fSCL = SMCLK/6 =~200kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x55;//从器件地址为055h
UCB0CTL1 &=~UCSWRST;//清除 SW 复位,恢复运行
UCB0IE |= UCRXIE;//启用 RX 中断
UCB0CTL1 |= UCTR+UCTXSTT;// I2C 开始条件、写入
while (!(UCB0CTL1 & UCTXSTT));//确保发送了 START 条件
while (!(UCB0IFG & UCTXIFG));//等待数据可以被写入
UCB0IFG &=~UCTXIFG;//复位 Tx 中断标志
UCB0TXBUF = 0x00;//发送数据
while (!(UCB0IFG & UCTXIFG));//等待数据可以被写入
UCB0IFG &=~UCTXIFG;//复位 Tx 中断标志
UCB0CTL1 &=~UCTR;//设置接收器模式
UCB0CTL1 |= UCTXSTT;//发送重启
while (UCB0CTL1 & UCTXSTT);//等待直到 START 条件复位
UCB0IFG &=~UCRXIFG;//复位 Rx 中断标志
while (!(UCB0IFG & UCRXIFG));//等待接收标志被复位
__no_operation();//用于调试器
}
// USCI_B0数据 ISR
#if defined (__TI_Compiler_version__)|| Defined (__IAR_systems_ICC__)
#pragma vector = USCI_B0_vector
_interrupt void USCI_B0_ISR (void)
#Elif defined (_GNU_)
void __attribute__((中断(USCI_B0_vector)) USCI_B0_ISR (void)
其他
错误编译器不受支持!
#endif
{
switch (__evo_in_range (UCB0IV、12))
{
情况0:中断;//向量0:无中断
情况2:中断;//向量2:ALIFG
情况4:中断;//向量4:NACKIFG
情况6:中断;//向量6:STTIFG
情况8:中断;//向量8:STPIFG
情况10://向量10:RXIFG
RXData = UCB0RXBUF;//获取 RX 数据
中断;
情况12:中断;//向量12:TXIFG
默认值:break;
}
}
有人知道我做了什么错误、或者我如何 解决这个问题吗?
感谢你的帮助
Fabian