程序代码如下:按照此程序输出的传感器(HP03)内存的几个常数不对,不知道为什么?调试了一周了,郁闷<br />//Function:模拟IIC与MCU通信,压力传感器的MCLK接MCU的ACLK(32768Hz输出)<br />// Vss--> GND<br />// VDD-->VCC<br />// MCLK(32768HZ)-->P2.0<br />// XCLK-->P6.1 <br />// SDA-->P6.0<br />// SCL-->P6.2 <br />//*******************head files**********************************<br />#include<msp430x14x.h><br />//#include"io430.h"<br />#include<math.h><br />//*********************symbol define*****************************<br />#define SDA_STATE P6IN & BIT0 //读入SDA状态<br /><br />unsigned int C1=0;<br />unsigned int C2=0;<br />unsigned int C3=0;<br />unsigned int C4=0;<br />unsigned int C5=0;<br />unsigned int C6=0;<br />unsigned int C7=0;<br />unsigned char AA=0;<br />unsigned char BB=0;<br />unsigned char CC=0;<br />unsigned char DD=0;<br /><br />unsigned int D1=0;<br />unsigned int D2=0;<br />long float DUT=0;<br />long float OFF=0;<br />long float SENS=0;<br />long float X=0;<br />long float Press=0;<br />long float Temp=0;<br />//*******************function declaration************************<br />void IIC_start(void);<br />void IIC_stop(void);<br />void IIC_SDA_HIGH(void);<br />void IIC_SDA_LOW(void);<br />void IIC_SCL_HIGH(void);<br />void IIC_SCL_LOW(void);<br />void IIC_ACK(void);<br />void IIC_NOACK(void);<br />void MCLKON(void);<br />void MCLKOFF(void);<br />void XCLR_LOW(void);<br />void XCLR_HIGH(void);<br />void IIC_ReadCalDate(void);<br />unsigned char IIC_readbyte(void);<br />void IIC_writebyte(unsigned char);<br />void ReadTemperaturePressureAD(void);<br />void CalculatepressTemp(void);<br />unsigned int ReadPressureAD();<br />unsigned int ReadTemperatureAD();<br />void SysDelay1ms(unsigned int);<br />void Delay16us(void);<br />void CPU_Init(void); //初始化时钟<br />void Port_Init(void); //初始化I/O<br />//********************************************************<br />//function:read calcute data and pressure,temp data<br />//********************************************************<br />void main( void )<br />{<br /> //SysDelay1ms(100);<br /> CPU_Init();<br /> Port_Init();<br /> //SysDelay2ms(50);<br /> IIC_ReadCalDate();<br /> while(1)<br /> {<br /> ReadTemperaturePressureAD();<br /> CalculatepressTemp();<br /> SysDelay1ms(100);<br /> }<br />}<br />//********************************************************<br />void CPU_Init(void)<br />{<br /> unsigned char i;<br /> WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset <br /> // Configure internal clocks<br /> DCOCTL = DCO1 + DCO2; // Set digitally controlled oscillator to ~1MHz<br /> BCSCTL1 = XT2OFF + RSEL2;<br /> BCSCTL2 = SELM0; // MCLK and SMCLK use this oscillator<br /> do<br /> {<br /> IFG1 &= ~OFIFG; //clear OSCFault flag_breathe<br /> for(i=0xFF; i>0; i--); //delay wait<br /> } <br /> while((IFG1&OFIFG)!=0); <br /><br />}<br />//******************** Port Initialization****************<br />// Vss GND<br />// //P6.3 VDD<br />// P2.0 MCLK(32768HZ)<br />// P6.1 XCLK<br />// P6.0 SDA<br />// P6.2 SCL <br />//********************************************************<br />void Port_Init(void) <br />{<br /> //P6SEL &= ~0x08; //P6.3普通IO<br /> //P6DIR |= 0x08; //P6.3输出1<br /> //P6OUT |= 0x08; <br /> <br /> P2DIR |= 0x01;<br /> P2SEL |= 0x01; //P2.0输出ACLK<br /> <br /> P6SEL &= ~0x02; //P6.1普通IO<br /> P6DIR |= 0x02; //P6.1输出<br /> <br /> P6SEL &= ~0x01; //P6.0普通IO<br /> <br /> P6SEL &= ~0x04; //P6.2普通IO<br /> P6DIR |= 0x04; //P6.2输出<br /> }<br />//*********************************************************<br />void IIC_ReadCalDate(void)<br />{<br /> unsigned int ucValue=0;<br />// P6OUT &= ~0x02; //P6.1输出0<br /> IIC_start();<br /> IIC_writebyte(0xa0); //contain stop signal<br /> IIC_writebyte(16);<br /> IIC_start();<br /> IIC_writebyte(0xa1);<br /> <br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C1=ucValue;<br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C1<<=8;<br /> C1|=ucValue;<br /> <br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C2=ucValue;<br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C2<<=8;<br /> C2|=ucValue;<br /> <br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C3=ucValue;<br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C3<<=8;<br /> C3|=ucValue;<br /> <br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C4=ucValue;<br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C4<<=8;<br /> C4|=ucValue;<br /> <br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C5=ucValue;<br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C5<<=8;<br /> C5|=ucValue;<br /> <br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C6=ucValue;<br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C6<<=8;<br /> C6|=ucValue;<br /> <br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C7=ucValue;<br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> C7<<=8;<br /> C7|=ucValue;<br /> <br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> AA=ucValue;<br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> BB=ucValue;<br /> //UartSend(AA);<br /> //UartSend(BB);<br /><br /> ucValue=IIC_readbyte();<br /> IIC_ACK();<br /> CC=ucValue;<br /> ucValue=IIC_readbyte();<br /> IIC_NOACK();<br /> IIC_stop();<br /> DD=ucValue;<br /> }<br />//*********************************************************<br />void ReadTemperaturePressureAD(void)<br />{<br /> long sumADvalue=0;<br /> XCLR_HIGH();<br /> MCLKON();<br /> SysDelay1ms(2);<br /> <br /> D1=ReadPressureAD();<br /> sumADvalue+=D1;<br /> D1=ReadPressureAD();<br /> sumADvalue+=D1;<br /> D1=ReadPressureAD();<br /> sumADvalue+=D1;<br /> D1=ReadPressureAD();<br /> sumADvalue+=D1;<br /> D1=sumADvalue>>2;<br /> <br /> D2=ReadTemperatureAD();<br /> <br /> P6SEL &= ~0x01; //P6.0普通IO<br /> P6DIR |= 0x01; //P6.0输出<br /> P6OUT &= ~0x01; <br /> <br /> P6SEL &= ~0x04; //P6.2普通IO<br /> P6DIR |= 0x04; //P6.2输出<br /> P6OUT &= ~0x04;<br /> <br /> MCLKOFF();<br /> XCLR_LOW();<br /> }<br />//*********************************************************<br />unsigned int ReadTemperatureAD(void)<br />{<br /> unsigned char ucData=0;<br /> unsigned int ADT=0;<br /> <br /> IIC_start();<br /> IIC_writebyte(0xee);<br /> IIC_writebyte(0xff);<br /> IIC_writebyte(0xe8);<br /> IIC_stop();<br /> SysDelay1ms(40);<br /> <br /> IIC_start();<br /> IIC_writebyte(0xee);<br /> IIC_writebyte(0xfd);<br /> IIC_start();<br /> IIC_writebyte(0xef);<br /> <br /> ucData=IIC_readbyte();<br /> IIC_ACK();<br />//UartSend(CC);<br /> ADT=ucData;<br /> ADT<<=8;<br /> <br /> ucData=IIC_readbyte();<br /> IIC_NOACK();<br /> IIC_stop();<br /> ADT|=ucData;<br />//UartSend(DD); <br /> return (unsigned int)(ADT); <br />}<br />unsigned int ReadPressureAD(void)<br />{<br /> unsigned char ucData=0;<br /> unsigned int ADP=0;<br /> <br /> IIC_start();<br /> IIC_writebyte(0xee);<br /> IIC_writebyte(0xff);<br /> IIC_writebyte(0xf0);<br /> IIC_stop();<br /> SysDelay1ms(40);<br /> <br /> IIC_start();<br /> IIC_writebyte(0xee);<br /> IIC_writebyte(0xfd);<br /> IIC_start();<br /> IIC_writebyte(0xef);<br /> <br /> ucData=IIC_readbyte();<br /> IIC_ACK();<br /> ADP=ucData;<br /> ADP<<=8;<br /> <br /> ucData=IIC_readbyte();<br /> IIC_NOACK();<br /> IIC_stop();<br /> ADP|=ucData;<br />//UartSend(BB);<br /> return (unsigned int)(ADP); <br />}<br />//*************Calculate press and temp*******************<br />void CalculatepressTemp(void)<br />{<br /> if (D2 >= C5)<br /> {<br /> DUT = D2 - C5 - (D2 - C5) * (D2 - C5) * AA / 16384 / (1 << CC);<br /> } <br /> else // (D2 < C5)<br /> {<br /> DUT = D2 - C5 - (D2 - C5) * (D2 - C5) * BB / 16384 / (1 << CC);<br /> }<br /> OFF = (C2 * 4) + ((C4 - 1024) * DUT * 4 / 16384);<br /> SENS = (C1 * 1024 + C3 * DUT) / 1024;<br /> X = (SENS * (D1 - 7168) - OFF * 16384) / 16384;<br /> Press = (X * 10 + C7 * 32) / 32; // Final pressure value (in millibars)<br /> Temp = 250 + ( DUT * C6 / 256 * (1 << DD) - DUT * 256) / (1 << DD) / 256; // Final temperature value<br /> Press = Press * 98312 / 131072; // Convert to mmHg<br /> }<br /><br />//********************1ms定时程序************************<br />void SysDelay1ms(unsigned int ms)<br />{<br /> int i,j;<br /> for(i=0;i<ms;i++)<br /> {<br /> for(j=0;j<200;j++); <br /> }<br />}<br />//********************// 20us定时程序***********************<br />//void Delay20us(void)<br />//{ <br />// _NOP();<br />// _NOP();<br />// _NOP();<br />// _NOP();<br />// _NOP();<br />// _NOP();<br />//}<br />//**********************// 16us定时程序********************<br />void Delay16us(void)<br />{ <br /> _NOP();<br />}<br />//*********************************************************<br />void IIC_writebyte(unsigned char ucData)<br />{<br /> unsigned char i;<br /> for(i=0;i<8;i++)<br /> {<br /> IIC_SCL_LOW();<br /> Delay16us();<br /> <br /> if((ucData & 0x80)==0x80)<br /> {<br /> IIC_SDA_HIGH();<br /> Delay16us();<br /> }<br /> else<br /> {<br /> IIC_SDA_LOW();<br /> Delay16us();<br /> }<br /> <br /> IIC_SCL_HIGH();<br /> Delay16us();<br /> ucData<<=1;<br /> IIC_SCL_LOW();<br /> } <br /> //stop signal<br /> IIC_SDA_HIGH();<br /> Delay16us();<br /> IIC_SCL_LOW();<br /> Delay16us();<br /> IIC_SCL_HIGH(); <br /> Delay16us();<br /> IIC_SCL_LOW();<br /> Delay16us(); <br /> }<br />unsigned char IIC_readbyte(void)<br />{<br /> unsigned char ucValue=0;<br /> unsigned char ucindex=0;<br /> <br /> IIC_SDA_HIGH(); //output high level,get ready for accept<br /> Delay16us();<br /> for(ucindex=0;ucindex<8;ucindex++)<br /> {<br /> ucValue<<=1;<br /> <br /> IIC_SCL_LOW();<br /> Delay16us();<br /> <br /> IIC_SCL_HIGH();<br /> Delay16us();<br /> <br /> P6SEL &= ~0x01; //P6.0普通IO<br /> P6DIR &= ~0x01;<br /> if(SDA_STATE)<br /> ucValue|=1;<br /> <br /> Delay16us();<br /> IIC_SCL_LOW();<br /> Delay16us();<br /> }<br /> return (unsigned int)(ucValue);<br />}<br />//*********************************************************<br />void IIC_start(void)<br />{<br />IIC_SDA_HIGH();<br />Delay16us();<br /><br />IIC_SCL_HIGH();<br />Delay16us();<br /><br />IIC_SDA_LOW();<br />Delay16us();<br /><br />IIC_SCL_LOW();<br />Delay16us();<br />}<br />void IIC_stop(void)<br />{<br />IIC_SCL_LOW();<br />Delay16us();<br /><br />IIC_SDA_LOW();<br />Delay16us();<br /><br />IIC_SCL_HIGH();<br />Delay16us();<br /><br />IIC_SDA_HIGH();<br />Delay16us();<br />}<br />//*********************************************************<br />void IIC_ACK(void)<br />{<br /> IIC_SDA_LOW();<br /> Delay16us();<br /> <br /> IIC_SCL_HIGH();<br /> Delay16us();<br /> <br /> IIC_SCL_LOW();<br /> Delay16us();<br />}<br />void IIC_NOACK(void)<br />{<br /> IIC_SDA_HIGH();<br /> Delay16us();<br /> <br /> IIC_SCL_HIGH();<br /> Delay16us();<br /> <br /> IIC_SCL_LOW();<br /> Delay16us();<br />}<br />//*********************************************************<br />void MCLKON(void)<br />{<br /> P2SEL |= 0x01; // set p2.0 as ACLK Output for sensor MCLK<br /> P2DIR |= 0x01; //P2.0输出<br /> <br />}<br />void MCLKOFF(void) // shutdown p2.0 as ACLK Output <br />{<br /> P2SEL &= 0x00; <br /> P2DIR |= 0x01; //P2.0输出<br /> P2OUT &= ~0x01; //P2.0 = 0<br />}<br />void XCLR_LOW(void)<br />{<br /> P6SEL &= ~0x02; //P6.1普通IO<br /> P6DIR |= 0x02; //P6.1输出0<br /> P6OUT &= ~0x02; <br />}<br />void XCLR_HIGH(void)<br />{<br /> P6SEL &= ~0x02; //P6.1普通IO<br /> P6DIR |= 0x02; //P6.1输出1<br /> P6OUT |= 0x02; <br />}<br />//*********************************************************<br />void IIC_SDA_HIGH(void)<br />{<br /> <br /> P6SEL &= ~0x01; //P6.0普通IO<br /> P6DIR |= 0x01; //P6.0输出<br /> P6OUT |= 0x01; //P6.0输出1<br /> <br />}<br /><br />void IIC_SDA_LOW(void)<br />{<br /> P6SEL &= ~0x01; //P6.0普通IO<br /> P6DIR |= 0x01; //P6.0输出<br /> P6OUT &= ~0x01; //P6.0输出0<br /><br />}<br />//*********************************************************<br />void IIC_SCL_HIGH(void)<br />{<br /> P6SEL &= ~0x04; //P6.2普通IO<br /> P6DIR |= 0x04; <br /> P6OUT |= 0x04; //P6.2输出1<br />}<br />void IIC_SCL_LOW(void)<br />{<br /> P6SEL &= ~0x04; //P6.2普通IO<br /> P6DIR |= 0x04; <br /> P6OUT &= ~0x04; //P6.2输出0<br />}<br /> |
|