|
我用的是USCI 模块的 I2C模式
I/o设置应该是跟单片机的发送/接收模式一起设置的吧?
用示波器看的MCU发出的波形是跟程序要求一样,就是LM75A无应答回来.
下面是我写的程序:
#include <msp430x22x4.h>
#define sub_addr 0x00
unsigned char RxWordH;
unsigned char RxWordL;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P3SEL |= 0x06; // P3.1,P3.2选为I2C功能,p3.1为UCB0SDA,P3.2为UCB0SCL
UCB0CTL1 |= UCSWRST; // 软件复位
UCB0CTL0 = UCMST+UCMODE_3+UCSYNC; // I2C主,模式3为I2C,同步模式
UCB0CTL1 = UCSSEL_2+UCSWRST; // 时钟源选择SMCLK, 保持软件复位
UCB0BR0 = 12; // fSCL = SMCLK/12 = ~100kHz
UCB0BR1 = 0;
UCB0I2CSA = 0x48; // 设定从机地址为0x90<<1
UCB0CTL1 &= ~UCSWRST; // 进入I2C工作模式
UCB0CTL1 |= UCTR + UCTXSTT; // 发送状态,发送从机地址
if((IFG2 & UCB0TXIFG) == UCB0TXIFG)
{
UCB0TXBUF = sub_addr & 0xFF; //器件子地址写入发送缓冲
}
while((UCB0CTL1 & UCTXSTT) == UCTXSTT); // 等待器件应答
if(UCB0STAT & UCNACKIFG) //如果没收到确认就停止总线
{
UCB0CTL1 |= UCTXSTP;
IFG2 &= ~UCB0TXIFG;
}
while(!(IFG2 & UCB0TXIFG)); //从机地址发送完,子地址开始发送
UCB0CTL1 &= ~UCTR; // 接收状态
UCB0CTL1 |= UCTXSTT; // 重启总线,发送器件地址,开始接收数据
IFG2 &= ~UCB0TXIFG;
while (UCB0CTL1 & UCTXSTT); // 等待器件应答
RxWordH |= UCB0RXBUF; //接收温度信息
while(!(IFG2 & UCB0RXIFG)); // 接收完高字节数据,准备接收低字节
UCB0CTL1 |= UCTXSTP; // 发送停止信号,停止总线
RxWordL |= UCB0RXBUF; //接收低字节温度信息
} |
|