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.

求助430I2C问题

Other Parts Discussed in Thread: MSP430F5438

最近在弄430的硬件I2C,用的是MSP430F5438

碰到的问题是:一直读不到EEPROM的数据(24C02),上拉电阻什么的都已经加了

下面是关键代码:

void IIC_init(unsigned char addr)
{
P3SEL &= ~BIT2; // P3.2@UCB0SCL
P3DIR |= BIT2;
P3OUT |= BIT2;
// 输出9个时钟以恢复I2C总线状态
for( unsigned char i = 0 ; i < 9 ; i++ )
{
P3OUT |= BIT2;
__delay_cycles(8000);
P3OUT &= ~BIT2;
__delay_cycles(8000);
}

P3SEL |= (BIT1 + BIT2); // P3.1@UCB0SDAP3.2@UCB0SCL
// P3.1@ISP.1 P3.2@ISP.5

UCB0CTL1 |= UCSWRST;
UCB0CTL0 = UCMST + UCMODE_3 + UCSYNC ; // I2C主机模式
UCB0CTL1 |= UCSSEL_2; // 选择SMCLK
UCB0BR0 = 40;
UCB0BR1 = 0;
UCB0CTL0 &= ~UCSLA10; // 7位地址模式
UCB0I2CSA = addr; // EEPROM地址
UCB0CTL1 &= ~UCSWRST;

}

unsigned char eeprom_writebyte( unsigned char word_addr , unsigned char word_value )
{
while( UCB0CTL1 & UCTXSTP );
UCB0CTL1 |= UCTR; // 写模式
UCB0CTL1 |= UCTXSTT; // 发送启动位

UCB0TXBUF = word_addr; // 发送字节地址
// 等待UCTXIFG=1 与UCTXSTT=0 同时变化等待一个标志位即可
while(!(UCB0IFG & UCTXIFG))
{
if( UCB0IFG & UCNACKIFG ) // 若无应答 UCNACKIFG=1
{
return 1;
}
}

UCB0TXBUF = word_value; // 发送字节内容
while(!(UCB0IFG & UCTXIFG)); // 等待UCTXIFG=1

UCB0CTL1 |= UCTXSTP;
while(UCB0CTL1 & UCTXSTP); // 等待发送完成

return 0;
}
unsigned char eeprom_readbyte( unsigned char word_addr , unsigned char *pword_value )
{
UCB0CTL1 |= UCTR; // 写模式
UCB0CTL1 |= UCTXSTT; // 发送启动位和写控制字节

UCB0TXBUF = word_addr ; // 发送字节地址,必须要先填充TXBUF
// 等待UCTXIFG=1 与UCTXSTT=0 同时变化等待一个标志位即可
while(!(UCB0IFG & UCTXIFG))
{
if( UCB0IFG & UCNACKIFG ) // 若无应答 UCNACKIFG=1
{
return 1;
}
}

UCB0CTL1 &= ~UCTR; // 读模式
UCB0CTL1 |= UCTXSTT; // 发送启动位和读控制字节

while(UCB0CTL1 & UCTXSTT); // 等待UCTXSTT=0
// 若无应答 UCNACKIFG = 1
UCB0CTL1 |= UCTXSTP; // 先发送停止位

while(!(UCB0IFG & UCRXIFG)); // 读取字节内容
//*pword_value = UCB0RXBUF; // 读取BUF寄存器在发送停止位之后
P10OUT= UCB0RXBUF;
while( UCB0CTL1 & UCTXSTP );

return 0;
}