最近在弄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;
}