搜索
bottom↓
回复: 5

MSP430 iic问题 读取

[复制链接]

出0入0汤圆

发表于 2012-9-13 07:47:28 | 显示全部楼层 |阅读模式
/*----------------------------------------------------------------------------*/
/*
    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  不置位


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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-9-13 18:16:44 | 显示全部楼层
你I2C总线上挂的设备是什么?就是从设备地址

出0入0汤圆

 楼主| 发表于 2012-9-13 19:15:03 | 显示全部楼层
yang_2010 发表于 2012-9-13 18:16
你I2C总线上挂的设备是什么?就是从设备地址

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

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

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

出0入0汤圆

发表于 2012-9-17 21:55:21 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2012-9-25 16:52:28 | 显示全部楼层
qq逆水舟 发表于 2012-9-17 21:55

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

出0入0汤圆

发表于 2012-9-28 14:44:42 | 显示全部楼层
有用。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-2 12:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表