打印

传感器模拟IIC与msp430F133通信输出结果不对

[复制链接]
2386|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cumtgirl|  楼主 | 2008-3-9 09:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序代码如下:按照此程序输出的传感器(HP03)内存的几个常数不对,不知道为什么?调试了一周了,郁闷
//Function:模拟IIC与MCU通信,压力传感器的MCLK接MCU的ACLK(32768Hz输出)
//                      Vss--> GND
//                      VDD-->VCC
//                      MCLK(32768HZ)-->P2.0
//                      XCLK-->P6.1 
//                      SDA-->P6.0
//                      SCL-->P6.2 
//*******************head files**********************************
#include<msp430x14x.h>
//#include"io430.h"
#include<math.h>
//*********************symbol define*****************************
#define SDA_STATE P6IN & BIT0   //读入SDA状态

unsigned int C1=0;
unsigned int C2=0;
unsigned int C3=0;
unsigned int C4=0;
unsigned int C5=0;
unsigned int C6=0;
unsigned int C7=0;
unsigned char AA=0;
unsigned char BB=0;
unsigned char CC=0;
unsigned char DD=0;

unsigned int D1=0;
unsigned int D2=0;
long float DUT=0;
long float OFF=0;
long float SENS=0;
long float X=0;
long float Press=0;
long float Temp=0;
//*******************function declaration************************
void IIC_start(void);
void IIC_stop(void);
void IIC_SDA_HIGH(void);
void IIC_SDA_LOW(void);
void IIC_SCL_HIGH(void);
void IIC_SCL_LOW(void);
void IIC_ACK(void);
void IIC_NOACK(void);
void MCLKON(void);
void MCLKOFF(void);
void XCLR_LOW(void);
void XCLR_HIGH(void);
void IIC_ReadCalDate(void);
unsigned char IIC_readbyte(void);
void IIC_writebyte(unsigned char);
void ReadTemperaturePressureAD(void);
void CalculatepressTemp(void);
unsigned int ReadPressureAD();
unsigned int ReadTemperatureAD();
void SysDelay1ms(unsigned int);
void Delay16us(void);
void CPU_Init(void);                                     //初始化时钟
void Port_Init(void);                                    //初始化I/O
//********************************************************
//function:read calcute data and pressure,temp data
//********************************************************
void main( void )
{
  //SysDelay1ms(100);
  CPU_Init();
  Port_Init();
  //SysDelay2ms(50);
  IIC_ReadCalDate();
  while(1)
  {
  ReadTemperaturePressureAD();
  CalculatepressTemp();
  SysDelay1ms(100);
  }
}
//********************************************************
void CPU_Init(void)
{
  unsigned char i;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer to prevent time out reset    
    // Configure internal clocks
  DCOCTL  = DCO1 + DCO2;                   // Set digitally controlled oscillator to ~1MHz
  BCSCTL1 = XT2OFF + RSEL2;
  BCSCTL2 = SELM0;                         // MCLK and SMCLK use this oscillator
  do
  {
    IFG1 &= ~OFIFG;                         //clear OSCFault flag_breathe
    for(i=0xFF; i>0; i--);                  //delay wait
  }   
  while((IFG1&OFIFG)!=0); 

}
//******************** Port Initialization****************
//                      Vss GND
//                      //P6.3 VDD
//                      P2.0 MCLK(32768HZ)
//                      P6.1 XCLK
//                      P6.0 SDA
//                      P6.2 SCL                    
//********************************************************
void Port_Init(void)     
{
  //P6SEL &= ~0x08;       //P6.3普通IO
  //P6DIR |= 0x08;        //P6.3输出1
  //P6OUT |= 0x08;  
  
  P2DIR |= 0x01;
  P2SEL |= 0x01;        //P2.0输出ACLK
           
  P6SEL &= ~0x02;       //P6.1普通IO
  P6DIR |= 0x02;        //P6.1输出
    
  P6SEL &= ~0x01;       //P6.0普通IO
  
  P6SEL &= ~0x04;       //P6.2普通IO
  P6DIR |= 0x04;        //P6.2输出
 }
//*********************************************************
void IIC_ReadCalDate(void)
{
 unsigned int ucValue=0;
// P6OUT &= ~0x02;                  //P6.1输出0
 IIC_start();
 IIC_writebyte(0xa0);            //contain stop signal
 IIC_writebyte(16);
 IIC_start();
 IIC_writebyte(0xa1);
 
 ucValue=IIC_readbyte();
 IIC_ACK();
 C1=ucValue;
 ucValue=IIC_readbyte();
 IIC_ACK();
 C1<<=8;
 C1|=ucValue;
 
 ucValue=IIC_readbyte();
 IIC_ACK();
 C2=ucValue;
 ucValue=IIC_readbyte();
 IIC_ACK();
 C2<<=8;
 C2|=ucValue;
 
 ucValue=IIC_readbyte();
 IIC_ACK();
 C3=ucValue;
 ucValue=IIC_readbyte();
 IIC_ACK();
 C3<<=8;
 C3|=ucValue;
 
 ucValue=IIC_readbyte();
 IIC_ACK();
 C4=ucValue;
 ucValue=IIC_readbyte();
 IIC_ACK();
 C4<<=8;
 C4|=ucValue;
 
 ucValue=IIC_readbyte();
 IIC_ACK();
 C5=ucValue;
 ucValue=IIC_readbyte();
 IIC_ACK();
 C5<<=8;
 C5|=ucValue;
 
 ucValue=IIC_readbyte();
 IIC_ACK();
 C6=ucValue;
 ucValue=IIC_readbyte();
 IIC_ACK();
 C6<<=8;
 C6|=ucValue;
 
 ucValue=IIC_readbyte();
 IIC_ACK();
 C7=ucValue;
 ucValue=IIC_readbyte();
 IIC_ACK();
 C7<<=8;
 C7|=ucValue;
 
 ucValue=IIC_readbyte();
 IIC_ACK();
 AA=ucValue;
 ucValue=IIC_readbyte();
 IIC_ACK();
 BB=ucValue;
 //UartSend(AA);
 //UartSend(BB);

 ucValue=IIC_readbyte();
 IIC_ACK();
 CC=ucValue;
 ucValue=IIC_readbyte();
 IIC_NOACK();
 IIC_stop();
 DD=ucValue;
 }
//*********************************************************
void ReadTemperaturePressureAD(void)
{
 long sumADvalue=0;
 XCLR_HIGH();
 MCLKON();
 SysDelay1ms(2);
 
 D1=ReadPressureAD();
 sumADvalue+=D1;
 D1=ReadPressureAD();
 sumADvalue+=D1;
 D1=ReadPressureAD();
 sumADvalue+=D1;
 D1=ReadPressureAD();
 sumADvalue+=D1;
 D1=sumADvalue>>2;
 
 D2=ReadTemperatureAD();
 
 P6SEL &= ~0x01;       //P6.0普通IO
 P6DIR |=  0x01;       //P6.0输出
 P6OUT &= ~0x01;  
 
 P6SEL &= ~0x04;       //P6.2普通IO
 P6DIR |= 0x04;        //P6.2输出
 P6OUT &= ~0x04;
 
 MCLKOFF();
 XCLR_LOW();
 }
//*********************************************************
unsigned int ReadTemperatureAD(void)
{
  unsigned char ucData=0;
  unsigned int ADT=0;
  
  IIC_start();
  IIC_writebyte(0xee);
  IIC_writebyte(0xff);
  IIC_writebyte(0xe8);
  IIC_stop();
  SysDelay1ms(40);
  
  IIC_start();
  IIC_writebyte(0xee);
  IIC_writebyte(0xfd);
  IIC_start();
  IIC_writebyte(0xef);
  
  ucData=IIC_readbyte();
  IIC_ACK();
//UartSend(CC);
  ADT=ucData;
  ADT<<=8;
  
  ucData=IIC_readbyte();
  IIC_NOACK();
  IIC_stop();
  ADT|=ucData;
//UartSend(DD); 
  return (unsigned int)(ADT);  
}
unsigned int ReadPressureAD(void)
{
  unsigned char ucData=0;
  unsigned int ADP=0;
  
  IIC_start();
  IIC_writebyte(0xee);
  IIC_writebyte(0xff);
  IIC_writebyte(0xf0);
  IIC_stop();
  SysDelay1ms(40);
  
  IIC_start();
  IIC_writebyte(0xee);
  IIC_writebyte(0xfd);
  IIC_start();
  IIC_writebyte(0xef);
  
  ucData=IIC_readbyte();
  IIC_ACK();
  ADP=ucData;
  ADP<<=8;
  
  ucData=IIC_readbyte();
  IIC_NOACK();
  IIC_stop();
  ADP|=ucData;
//UartSend(BB);
  return (unsigned int)(ADP);  
}
//*************Calculate  press and temp*******************
void CalculatepressTemp(void)
{
   if (D2 >= C5)
  {
    DUT = D2 - C5 - (D2 - C5) * (D2 - C5) * AA / 16384 / (1 << CC);
  } 
  else                                // (D2 < C5)
  {
    DUT = D2 - C5 - (D2 - C5) * (D2 - C5) * BB / 16384 / (1 << CC);
  }
  OFF = (C2 * 4) + ((C4 - 1024) *  DUT * 4 / 16384);
  SENS =  (C1 * 1024 + C3 *  DUT) / 1024;
  X =  (SENS * (D1 - 7168) - OFF * 16384) / 16384;
  Press = (X * 10 + C7 * 32) / 32;                                           // Final pressure value (in millibars)
  Temp = 250 + ( DUT * C6 / 256 * (1 << DD) -  DUT * 256) / (1 << DD) / 256; // Final temperature value
  Press = Press * 98312 / 131072;                                           // Convert to mmHg
 }

//********************1ms定时程序************************
void SysDelay1ms(unsigned int ms)
{
   int i,j;
   for(i=0;i<ms;i++)
   {
     for(j=0;j<200;j++);    
   }
}
//********************// 20us定时程序***********************
//void Delay20us(void)
//{    
//   _NOP();
//   _NOP();
//   _NOP();
//  _NOP();
//   _NOP();
//   _NOP();
//}
//**********************// 16us定时程序********************
void Delay16us(void)
{    
   _NOP();
}
//*********************************************************
void IIC_writebyte(unsigned char ucData)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
   IIC_SCL_LOW();
   Delay16us();
   
   if((ucData & 0x80)==0x80)
   {
     IIC_SDA_HIGH();
     Delay16us();
   }
   else
   {
    IIC_SDA_LOW();
    Delay16us();
   }
     
   IIC_SCL_HIGH();
   Delay16us();
   ucData<<=1;
   IIC_SCL_LOW();
   }  
  //stop signal
  IIC_SDA_HIGH();
  Delay16us();
  IIC_SCL_LOW();
  Delay16us();
  IIC_SCL_HIGH();  
  Delay16us();
  IIC_SCL_LOW();
  Delay16us();      
 }
unsigned char IIC_readbyte(void)
{
 unsigned char ucValue=0;
 unsigned char ucindex=0;
 
 IIC_SDA_HIGH();                          //output high level,get ready for accept
 Delay16us();
 for(ucindex=0;ucindex<8;ucindex++)
  {
    ucValue<<=1;
    
    IIC_SCL_LOW();
    Delay16us();
    
    IIC_SCL_HIGH();
    Delay16us();
    
    P6SEL &= ~0x01;       //P6.0普通IO
    P6DIR &= ~0x01;
    if(SDA_STATE)
     ucValue|=1;
    
    Delay16us();
    IIC_SCL_LOW();
    Delay16us();
  }
 return (unsigned int)(ucValue);
}
//*********************************************************
void IIC_start(void)
{
IIC_SDA_HIGH();
Delay16us();

IIC_SCL_HIGH();
Delay16us();

IIC_SDA_LOW();
Delay16us();

IIC_SCL_LOW();
Delay16us();
}
void IIC_stop(void)
{
IIC_SCL_LOW();
Delay16us();

IIC_SDA_LOW();
Delay16us();

IIC_SCL_HIGH();
Delay16us();

IIC_SDA_HIGH();
Delay16us();
}
//*********************************************************
void IIC_ACK(void)
{
 IIC_SDA_LOW();
 Delay16us();
 
 IIC_SCL_HIGH();
 Delay16us();
 
 IIC_SCL_LOW();
 Delay16us();
}
void IIC_NOACK(void)
{
 IIC_SDA_HIGH();
 Delay16us();
 
 IIC_SCL_HIGH();
 Delay16us();
 
 IIC_SCL_LOW();
 Delay16us();
}
//*********************************************************
void MCLKON(void)
{
  P2SEL |= 0x01;                 // set p2.0 as ACLK Output for sensor MCLK
  P2DIR |= 0x01;                 //P2.0输出
   
}
void MCLKOFF(void)               // shutdown p2.0 as ACLK Output 
{
  P2SEL &= 0x00;               
  P2DIR |= 0x01;                  //P2.0输出
  P2OUT &= ~0x01;                 //P2.0 = 0
}
void XCLR_LOW(void)
{
 P6SEL &= ~0x02;                  //P6.1普通IO
 P6DIR |= 0x02;                   //P6.1输出0
 P6OUT &= ~0x02;     
}
void XCLR_HIGH(void)
{
 P6SEL &= ~0x02;               //P6.1普通IO
 P6DIR |= 0x02;                //P6.1输出1
 P6OUT |= 0x02;       
}
//*********************************************************
void IIC_SDA_HIGH(void)
{
  
  P6SEL &= ~0x01;            //P6.0普通IO
  P6DIR |= 0x01;             //P6.0输出
  P6OUT |= 0x01;             //P6.0输出1
 
}

void IIC_SDA_LOW(void)
{
  P6SEL &= ~0x01;           //P6.0普通IO
  P6DIR |= 0x01;            //P6.0输出
  P6OUT &= ~0x01;           //P6.0输出0

}
//*********************************************************
void IIC_SCL_HIGH(void)
{
  P6SEL &= ~0x04;             //P6.2普通IO
  P6DIR |= 0x04; 
  P6OUT |= 0x04;              //P6.2输出1
}
void IIC_SCL_LOW(void)
{
  P6SEL &= ~0x04;            //P6.2普通IO
  P6DIR |= 0x04; 
  P6OUT &= ~0x04;           //P6.2输出0
}

相关帖子

沙发
stycx| | 2008-3-9 10:05 | 只看该作者

Delay16us(); 准确吗 加长点时间试下吧


实在不行找个stc12le5410 芯片用厂家的代码试一下

另外请问:
HP03能测量大气压力吗?好买吗

使用特权

评论回复
板凳
cumtgirl|  楼主 | 2008-3-9 10:32 | 只看该作者

RE:

实在不行找个stc12le5410 芯片用厂家的代码试一下
---这个方法现在行不通。
我现在只能从程序看问题了,程序都是仿照他们厂家提供的代码改,只不过用的MCU不同而已

使用特权

评论回复
地板
cumtgirl|  楼主 | 2008-3-9 11:10 | 只看该作者

三八节的郁闷

三八节阿!这两天正好赶周末!
我调了两天程序。那位大虾出来指点下阿,帮我解脱啊

使用特权

评论回复
5
一从陶令| | 2008-3-9 12:15 | 只看该作者

把SDA和SCL的访问波形发上来

你把SDA和SCL的访问波形发上来,肯定可以看出问题的。

使用特权

评论回复
6
cumtgirl|  楼主 | 2008-3-9 13:09 | 只看该作者

回楼上,我现在没有示波器,没法看啊

回楼上,我现在没有示波器,没法看啊

使用特权

评论回复
7
一从陶令| | 2008-3-9 13:32 | 只看该作者

做一次单次IIC访问

能否做一次单次IIC访问(只读一个字节),看读取值是否正确,以确定是否访问时序有问题

使用特权

评论回复
8
cumtgirl|  楼主 | 2008-3-9 14:57 | 只看该作者

单次也不行

单次也不行,读出来的都是F

使用特权

评论回复
9
一从陶令| | 2008-3-9 18:14 | 只看该作者

时序

单次访问都不行,肯定是时序出了问题。IIC的主从之间时钟、建立保持时间都对吗?能否调整软件以改善时序边界?
另外电路设计检查过吗?上拉电阻值、负载电容都考虑过吗?上拉电阻的最小值要满足IIC器件最大输入灌电流的要求,上拉电阻最大值取决于负载电容及访问速度(也就是上升时间),最终选择同时满足这两个要求的值。

使用特权

评论回复
10
cumtgirl|  楼主 | 2008-3-10 22:04 | 只看该作者

问一下:IIC中对SCL的频率有什么要求吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

140

主题

293

帖子

0

粉丝