#include <msp430g2553.h> //宏定义 #define Slave_Add 0x42 //定义从机地址PCF8574 A2- A1- A0+地址:0100 001 0 unsigned char TXData; //声明 void I2C_Init(); void Signal_LED(); int main(void) { WDTCTL = WDTPW + WDTHOLD;// Stop WDT I2C_Init(); // IE2 |= UCB0TXIE; __delay_cycles(100000);//给予从机准备时间 //1 TXData = Slave_Add;// 使能发送中断 UCB0TXBUF = TXData; UCB0CTL1|=UCTR; //发送模式 UCB0CTL1 |= UCTR + UCTXSTT; while (UCB0CTL1 & UCTXSTT);//保证起始条件响应成功 //2 TXData = 0x00; UCB0TXBUF = TXData; UCB0CTL1|=UCTR; UCB0CTL1 |= UCTR + UCTXSTT; while (UCB0CTL1 & UCTXSTT); UCB0CTL1 |= UCTXSTP; //stop while(UCB0CTL1&UCTXSTP); //发送完成 Signal_LED(); while (1) { __bis_SR_register(CPUOFF + GIE);// 低功耗模式0 } } void I2C_Init() {P1SEL |= BIT6 + BIT7;P1SEL2|= BIT6 + BIT7;UCB0CTL1 |= UCSWRST;//使能 SWUCB0CTL0 = UCMST + UCMODE_3 + UCSYNC;//主机模式UCB0CTL1 = UCSSEL_2 + UCSWRST;//时钟 SMCLK保持 SW resetUCB0BR0 = 12;//通信频率fSCL = SMCLK/12 = ~100kHzUCB0BR1 = 0;UCB0I2CSA = Slave_Add;//从机地址UCB0CTL1 &= ~UCSWRST;//清除 SW reset, resume operation } void Signal_LED() {P1DIR = BIT0;P1OUT |= BIT0;_delay_cycles(100000);P1OUT ^= BIT0;_delay_cycles(100000); }
kqian0327:
你好,
请问下,IIC的波形有问题吗?
你拿示波器钩一下波形,看IO扩展芯片有没有正确的被操作吧。
而且我只看到你初始化了IIC,没有进行后续操作呀。
灰小子:
回复 kqian0327:
我觉得可能是时序的问题,建议用示波器或者逻辑分析仪看看时序
duoze sun:
回复 kqian0327:
我已经解决,问题在PCF8574 A 和PCF8574 不一样,地址搞混了
shanglin long:
回复 duoze sun:
。。。新手想请教一下,这个代码为什么我想用的时候,会卡在 while (UCB0CTL1 & UCTXSTT);//保证起始条件响应成功 这一句这里。芯片是PCD8574P,用的MSP430G2553。A0,A1,A2我接的低,所以把Slave_Add改成了0x40.可是还是不行。。
灰小子:
回复 shanglin long:
建议先确认一下你的PCD8574P是否和楼主的器件一样