2458|2

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MSP430F1611内部IIC给跪了!求帮助啊。 [复制链接]

使用1611内部的IIC模块读取ADS1100,读回的数据不对.
调了好久了,也看了好久IIC,1100的文档,实在不知道怎么回事了,
求帮助啊

程序如下:

void main(void)
{
   
    MasterClock_XT2(8000000);
    _DINT();

     //内部DA输出;
      VerefDac12Init();
      DacSetVolate(1.5);

      I2C_Init();//IIC初始化;
      I2C_TxStr(0x90,0x8c);//写配置;1100内部寄存器配置
   
    _EINT();
    for(;;)
    {      
            I2C_RxStr(0x8c);//1100内部寄存器再次配置;
    }
               
}  
void I2C_Init(void)   
{   
   P3SEL |= 0x0a; //Assign I2C pins to module   
   P3DIR &= ~0x0A;//确保IIC总线的初始化
   
   U0CTL |= I2C + SYNC; //Switch USART0 to I2C mode   
   U0CTL &= ~I2CEN; //Recommended I2C init procedure   
   
    I2CTCTL |= I2CSSEL_2 ;//+ I2CWORD; //SMCLK ,8m     
   I2CPSC = 79;
     I2CSCLH = 0x03; //High period of SCL
   I2CSCLL = 0x03; //Low period of SCL
     U0CTL |= MST;   // Master  
    I2CSA= (0x90>>1);//直接初始化从机地址;
   
  U0CTL |= I2CEN;// Enable I2C
  
}  

//I2C发送一字节数据   
void I2C_TxByte(unsigned char cdata)   
{   
  while(!(I2CIFG & TXRDYIFG));//等待发送准备好信号 准备好写了, TXRDYIFG 置位;  
  I2CDRB = cdata;//发送1字节数据   
}   
   
   
//I2C接收一字节数据   
unsigned char I2C_RxByte(void)   
{   
  while(!(I2CIFG & RXRDYIFG));//等待接收准备好信号  准备好读了, XRDYIFG 置位;
  return(I2CDRB);//返回接受到的数据   
}   

void I2C_TxStr(unsigned char SubAddr,unsigned char SetAddr) //I2C_TxStr(0x90)  
{     
  while(I2CTCTL & I2CSTP); // 等待发送停止;发送停止时自动清零;To prevent Arbitration Lost  (防止失去仲裁)
                              
  I2CNDAT = 2;  // 在启动STT后不能轻易改变;发送两个字节后停止;0x90.0x8c.     
           
   I2CTCTL |= I2CTRX; //发送模式   
  I2CTCTL |= I2CSTT + I2CSTP;   
  
  I2C_TxByte(SubAddr);//子地址,0x90写操作;
  I2C_TxByte(SetAddr); //配置1100内部寄存器      
}  
   void I2C_RxStr(unsigned char SlaverAddr,unsigned char SubAddr,unsigned char SetAddr)   
{   
   unsigned char i;

   while (I2CDCTL & I2CBUSY);                                 
  
    I2CNDAT = 1;      // Transmit one byte   

    U0CTL |= MST;//改动这句话对输出值影响很大;
  
   //不清会死在读的那里
   I2CIFG &= ~TXRDYIFG;  //清除发送准备好标志位  ;                          
   I2CIFG &= ~ARDYIFG;   // clear Access ready interrupt flag  
                        
   I2CTCTL |= I2CTRX;    //发送模式;   
   I2CTCTL &= ~I2CSTP;   //清除I2C停止操作位  
  
   I2CTCTL |= I2CSTT;    //启动发送   这里不能写成I2CTCTL |= I2CSTT + I2CSTP;,否则读不出来,不知为什么
   I2C_TxByte(SetAddr);  //0x80,再次配置一下寄存器,如果这里写0x91,出来的数据与之前不同,但也是不对的  
   while (!(I2CIFG & ARDYIFG));  //等待数据发送完成
  
       I2CNDAT = 2;           // recive two byte
   
    //接受数据;
    I2CTCTL &= ~I2CTRX;   //清除发送位,切换到接受模式   
  
    I2CIFG &= ~ARDYIFG;   // clear Access ready interrupt flag
  
    I2CTCTL |= I2CSTT + I2CSTP;//In master mode, transmit and receive operation is controlled with the
       for(i = 0;i<2;i++)
       {
            str=I2C_RxByte();//ADS1100 16位,分两次接收  
        }
      ADS1100Get = (str[1]<<8)+str[0];//(str<<8);// + str;
      ADS1100Val = (ADS1100Get/65535.0)*5.0;
  
}

最新回复

没有太仔细看,后面那句for语句   str=I2C_RxByte();//ADS1100 16位,分两次接收 是不是要改成str。  详情 回复 发表于 2013-7-22 04:26

点评

我也在调试这个,在发送读的时候第一次发送1个地址字节的I2CTCTL是不能加I2CSTP的,你看通讯协议就知道了,加了的话就表示完整的发送一个字节,这与你操作目的不符的。 我目前可以发送一些数据,但是读回来的不对,  详情 回复 发表于 2013-7-21 21:45
 
点赞 关注

回复
举报

114

帖子

0

TA的资源

一粒金砂(高级)

沙发
 

回复 楼主sxk812 的帖子

我也在调试这个,在发送读的时候第一次发送1个地址字节的I2CTCTL是不能加I2CSTP的,你看通讯协议就知道了,加了的话就表示完整的发送一个字节,这与你操作目的不符的。
我目前可以发送一些数据,但是读回来的不对,而且发送的BCD码转换也不知道正确与否,有时间多交流下看看,我Q356926245
 
 

回复

11

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
没有太仔细看,后面那句for语句   str=I2C_RxByte();//ADS1100 16位,分两次接收
是不是要改成str
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表