a4516987 发表于 2012-9-13 07:47:28

MSP430 iic问题 读取

/*----------------------------------------------------------------------------*/
/*
    File Name        :I2C.C

    Description        :

    Author        :Jones Lee
    Copyright_&Date_&Version : Jones_Studio _&<2012.8.26>_&<V1.0>
    Connector Fuction :
    Notes        :
*/
/*----------------------------------------------------------------------------*/
/*----------------------------------------------------------------------------*/

    /*---Head Files---*/
    #include "I2C.h"
    /*---Variable Definition--*/


    /*---Function Definiton---*/
    void I2C_Init(void);

    unsigned char I2C_Send_Ctrl(unsigned char CtrlAndAddr);

    void I2C_Read_Byte(unsigned char byAD,unsigned char byRA,unsigned char *rxbuffer) ;

    void I2C_Write_Byte(unsigned char byAD,unsigned char byRA,unsigned char *txbuffer) ;

    void I2C_delay(unsigned char ms);

    /*---Macro Definition-----*/

/*----------------------------------------------------------------------------*/

/*----------------------------------------------------------------------------*/
/*
Fuction Name      :
Description       :
Input parameter   :
Output parameter:
Date            :
Author            :
Notes             :
*/
/*----------------------------------------------------------------------------*/
void I2C_Init(void)
{

    P1OUT = 0XFF;

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

    P1SEL |= BIT6 + BIT7;

    P1SEL2|= BIT6 + BIT7;

//P1REN |= BIT6 + BIT7;

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

    UCB0CTL1 |= UCSWRST;

    /*配置为主机方式*/

    UCB0CTL0 |=UCMST;

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

    UCB0CTL0 |= UCMODE_3 + UCSYNC;

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

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

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

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

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

**Disable寄存器UCSWRST

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

UCB0CTL1 |= UCSSEL_2+UCSWRST;

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

UCB0BR1 = 0;

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

UCB0CTL1 &= ~UCSWRST;
}
/*----------------------------------------------------------------------------*/
/*
Fuction Name      :
Description       :
Input parameter   :
Output parameter:
Date            :
Author            :
Notes             :
*/
/*----------------------------------------------------------------------------*/
void I2C_Read_Byte(unsigned char byAD,unsigned char byRA,unsigned char *rxbuffer)
{

    UCB0I2CSA = byAD;

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

    while(UCB0CTL1 & UCTXSTT);

    UCB0TXBUF = byRA;

   while(!(IFG2 & UCB0TXIFG));                                                         在这里不行 ,为什么??????????????????????????????????????

    IFG2 &= ~UCB0TXIFG;

    while(UCB0CTL1 & UCTXSTP);

    UCB0CTL1 |=UCTXSTT;



    *rxbuffer = UCB0RXBUF;

    UCB0CTL1&=~UCTXNACK;
    UCB0CTL1 |= UCTXSTP;   //这里放就不可以了
}
/*----------------------------------------------------------------------------*/
/*
Fuction Name      :
Description       :
Input parameter   :
Output parameter:
Date            :
Author            :
Notes             :
*/
/*----------------------------------------------------------------------------*/
void I2C_Write_Byte(unsigned char byAD,unsigned char byRA,unsigned char *txbuffer)
{

    UCB0I2CSA = byAD;                         //地址

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

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

    //__bis_SR_register(GIE);

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

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


    UCB0TXBUF = byRA;                //数据地址

    while(!(IFG2 & UCB0TXIFG));      //等待发送完成

    I2C_delay(0x10);

    UCB0TXBUF=*txbuffer;             // 发送数据

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

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

    UCB0CTL1 |= UCTXSTP;                  // I2C stop condition
    I2C_delay(0x10);

    UCB0CTL1 &= ~UCSWRST;
}



各位大神 。请求问下,就是我的程序上面的问号那个地方,

IFG2 & UCB0TXIFG在 UCB0TXBUF 清空时候置位。
我写入时候 自动运送到移位寄存器,但是
这里没反应,貌似没有移动,而且 IFG2 的UCB0TXIFG不置位


跪求呀~~~~弄了好几天了。

yang_2010 发表于 2012-9-13 18:16:44

你I2C总线上挂的设备是什么?就是从设备地址

a4516987 发表于 2012-9-13 19:15:03

yang_2010 发表于 2012-9-13 18:16 static/image/common/back.gif
你I2C总线上挂的设备是什么?就是从设备地址

加速度计, 这个我写了 是他的地址,但是过不去。 那个byRA 局部变量调用时候写得是加速度的地址。

通信是好的, 证明 就是那个start的 信号接收到 并把相应位置的SST清零了。

反过来说 就是 即使现在刚发完START 掉线了 那个地址和数据也能发出去吧 ??

qq逆水舟 发表于 2012-9-17 21:55:21

{:huffy:}{:smile:}

a4516987 发表于 2012-9-25 16:52:28

qq逆水舟 发表于 2012-9-17 21:55 static/image/common/back.gif


?????????????????

LY1208798815 发表于 2012-9-28 14:44:42

有用。。。
页: [1]
查看完整版本: MSP430 iic问题 读取