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.

MSP430G2553的IIC的问题

主机模式初始化:

/******************************************************

** 函数名:void IIC_MasterInit(void)

** 描述  :从机初始化

** 输入  : 无

** 输出  :无

** 返回  :无

******************************************************/

void IIC_MasterInit(void)

{

 P1OUT = 0XFF;

 /*  选择P1.6 P1.7的第二功能  */

 P1SEL |= BIT6 + BIT7;                    

 P1SEL2|= BIT6 + BIT7;

 /*  初始化之前置为UCSWRST,然后开始所有的寄存器的初始化 */

 UCB0CTL1 |= UCSWRST;

 /*  配置为主机方式  */

 UCB0CTL0 =UCMST;

 /*  配置从机模式为异步通信方式,IIC模式 */

 UCB0CTL0 = UCMODE_3 + UCSYNC+ UCA10;

 /*********************************

 **  设置对应的时钟,同时置为UCSWRST

 **  设置IIC速度寄存器UCB0BR0 UCB0BR1的值

 **  设置从机地址寄存器 UCB0I2CSA的值

 **  设置自身地址寄存器 UCB0I2COA的值

 **  Disable寄存器UCSWRST

 *********************************/

 UCB0CTL1 = UCSSEL_2+UCSWRST;            

 UCB0BR0 = 12;                      //设置IIC的时钟速度              

 UCB0BR1 = 0;

 UCB0I2CSA = 0XA0;                  //配置从机地址      

 UCB0CTL1 &= ~UCSWRST;  

}

写字节函数:

/******************************************************

** 函数名:void WriteByte(unsigned char addr,unsigned char data)

** 描述  :硬件IIC写入单个数据data操作

** 输入  : addr从机地址,data待写入的数据

** 输出  :无

** 返回  :无

******************************************************/

void WriteByte(unsigned char addr,unsigned char data)

{

 /*

 UCB0I2CSA = 0XA0>>1; //slave address

 UCB0CTL1 |= UCTR;//写

 UCB0CTL1 |= UCTXSTT; //start condition,当产生了起始信号后,UCB0TXIFG被自动置一

 while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,为空则UCB0TXIFG为1.

 UCB0TXBUF = 0x00;

 while((UCB0CTL1 & UCTXSTT) == UCTXSTT);//检测从机ACK信号,有ACK信号,则UCTXSTT自动清零

 //以上顺序不能改变

 while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//检测UCB0TXBUF是否为空,

 UCB0TXBUF = 0x01;

 while((IFG2 & UCB0TXIFG) != UCB0TXIFG);//记住操作符号必须打括号,要不然会出现不可预测的错误,比如这个(IFG2 & UCB0TXIFG) != UCB0TXIFG,括号不能省略

 UCB0CTL1 |= UCTXSTP;

 */

 UCB0I2CSA=0XA0;                   // Slave Address is 38h

 while(UCB0CTL1 & UCTXSTT);             // Ensure stop condition got sent                

 UCB0CTL1 |=UCTXSTT + UCTR;               // I2C TX, start conditio

 while(!(IFG2 & UCB0TXIFG));            // Wait USCI_B0 TX  flag    Flag reset automaticall

 while(UCB0CTL1 & UCTXSTT);             //检测从机ACK信号,有ACK信号,则UCTXSTT自动清零

 UCB0TXBUF=addr;                        // Load TX buffer  

                                        //以上顺序不能改变

 while(!(IFG2 & UCB0TXIFG));

 __delay_cycles(10);

 UCB0TXBUF=data;

 while(!(IFG2 & UCB0TXIFG));

 __delay_cycles(10);

 UCB0CTL1 |=UCTXSTP;                    // I2C stop condition

 IFG2 &=UCB0TXIFG;                      // Clear USCI_B0 TX int flag

 delay_ms(10);

}

读自己函数:

/*******************************************************************************************

**  函数名称:void Readpage(unsigned char *RamAddress,unsigned char addr,unsigned char bytes)

**  功能描述:连续写数据

**  入口参数:  *RamAddress读取的数据     addr 从机的数据地址位    bytes读取数据的个数

**  出口参数:无

*******************************************************************************************/

void Readpage(unsigned char *RamAddress,unsigned char addr,unsigned char bytes)

{

 UCB0I2CSA =WRITEADDR;                    // Slave Address is 38h

 //while(UCB0CTL1 & UCTXSTP);               // Ensure stop condition got sent

 UCB0CTL1 |=UCTXSTT;               // I2C TX, start condition

 UCB0CTL1 |=UCTR;

 while(UCB0CTL1 & UCTXSTT);

 //while(!(IFG2 & UCB0TXIFG));              // Wait USCI_B0 TX  flag    Flag reset automatically

 UCB0TXBUF =addr;                         // Load TX buffer

 //while(!(IFG2 & UCB0TXIFG));

 IFG2 &= ~UCB0TXIFG;

 UCB0CTL1 &=~UCTR;

 while(UCB0CTL1 & UCTXSTP);

 UCB0CTL1 |=UCTXSTT;

 while(UCB0CTL1 & UCTXSTT);

 while(bytes!=1)

 {

   //while(! (IFG2 & UCB0RXIFG));

   *RamAddress=UCB0RXBUF;

   UCB0CTL1&=~UCTXNACK;

   RamAddress++;

   bytes--;

 }

 UCB0CTL1 |= UCTXSTP+UCTXNACK;     //发送停止信号必须再读取最后一个数据之前

 //while(!(IFG2 & UCB0RXIFG));      

 *RamAddress=UCB0RXBUF;

 UCB0CTL1 |= UCTXSTP+UCTXNACK;   //这里放就不可以了

 while(UCB0CTL1 & UCTXSTP);

 delay_ms(10);

}

void delay_ms(unsigned int ms)    

{

 unsigned int i,j;

 for( i = 0; i < ms; i++ )

 {

   for( j = 0; j < 1141; j++ );

 }

}