我将MSP430F5529作为主接收器件,ADT7420温度传感器作为从发送器件,连接在P4.1以及P4.2。在SDA以及scl上都加了上拉电阻10K。程序是例程里的,就改了一个从器件地址。问题是程序执行之后示波器根本没有SCL时钟线的波形,因为从器件也没有响应,Start位也没有变为0。求各位大牛能不能帮我解惑。
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.
我将MSP430F5529作为主接收器件,ADT7420温度传感器作为从发送器件,连接在P4.1以及P4.2。在SDA以及scl上都加了上拉电阻10K。程序是例程里的,就改了一个从器件地址。问题是程序执行之后示波器根本没有SCL时钟线的波形,因为从器件也没有响应,Start位也没有变为0。求各位大牛能不能帮我解惑。
#include <msp430.h>
unsigned char *PRxData; // Pointer to RX data
unsigned char RXByteCtr;
volatile unsigned char RxBuffer[128]; // Allocate 128 byte of RAM
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P4SEL|=BIT1+BIT2; // Assign I2C pins to USCI_B1
UCB1CTL1 |= UCSWRST; // Enable SW reset
UCB1CTL0 = UCMST + UCMODE_3 + UCSYNC; // I2C Master, synchronous mode
UCB1CTL1 = UCSSEL_2 + UCSWRST; // Use SMCLK, keep SW reset
UCB1BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB1BR1 = 0;
UCB1I2CSA = 0x49; // Slave Address is 048h
UCB1CTL1 &= ~UCSWRST; // Clear SW reset, resume operation
UCB1IE |= UCRXIE; // Enable RX interrupt
while (1)
{
PRxData = (unsigned char *)RxBuffer; // Start of RX buffer
RXByteCtr = 5; // Load RX byte counter
while (UCB1CTL1 & UCTXSTP); // Ensure stop condition got sent
UCB1CTL1 |= UCTXSTT; // I2C start condition
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0, enable interrupts
// Remain in LPM0 until all data
// is RX'd
__no_operation(); // Set breakpoint >>here<< and
} // read out the RxBuffer buffer
}
//-------------------------------------------------------------------------------
// The USCI_B0 data ISR is used to move received data from the I2C slave
// to the MSP430 memory. It is structured such that it can be used to receive
// any 2+ number of bytes by pre-loading RXByteCtr with the byte count.
//-------------------------------------------------------------------------------
#pragma vector = USCI_B1_VECTOR
__interrupt void USCI_B1_ISR(void)
{
switch(__even_in_range(UCB0IV,12))
{
case 0: break; // Vector 0: No interrupts
case 2: break; // Vector 2: ALIFG
case 4: break; // Vector 4: NACKIFG
case 6: break; // Vector 6: STTIFG
case 8: break; // Vector 8: STPIFG
case 10: // Vector 10: RXIFG
RXByteCtr--; // Decrement RX byte counter
if (RXByteCtr)
{
*PRxData++ = UCB1RXBUF; // Move RX data to address PRxData
if (RXByteCtr == 1) // Only one byte left?
UCB1CTL1 |= UCTXSTP; // Generate I2C stop condition
}
else
{
*PRxData = UCB1RXBUF; // Move
}
}
}
这问题我也遇到过,你是不是上拉的电压太高或者不够?看看器件规格书,有的器件上拉电压不能高于VDDIO以上一定电压。
还有有可能干扰问题?买个协议分析仪吧,记得买贵点的,否则杂波很多。
1 SCL没有波形的话,那么电平是多少?正常应该是高,如果是低电平,由于SCL一定是Master控制的,很有可能是因为没有ACK等原因导致MCU一直在等待。
你可以应DriverLib里面的I2C write with timeout函数在长时间没ACK的情况下释放总线,或者在发送start条件后自己价格time out检测呢?另外看一下你I2C 的NACK位有没有?
2 你这个I2C地址有问题哦
UCB1I2CSA = 0x49; // Slave Address is 048
UCB1I2CSA定义的是7bit 的I2C 地址哦,简单来说8bit 的0x48 的I2C地址应该是0x24 ,最低一位是读写位。 确认一下你要控制的Slave地址对不对哦?
3
__interrupt void USCI_B1_ISR(void) { switch(__even_in_range(UCB0IV,12))