This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

MSP430G2452 & LM75 如何使用

Other Parts Discussed in Thread: MSP430G2452

I2C驱动文件.

 C Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <msp430.h>
#include "I2C.H"

void I2C_Init(void)
{
    P1SEL = BIT6 + BIT7;
    P1REN = BIT6 + BIT7; 
//上-下拉电阻
    USICTL0 |= USISWRST;
    USICTL0 = USIPE7 + USIPE6 + USIMST + USIOE + USISWRST;
    
//USICTL1 = USII2C + USISTTIE + USIIE + USIIFG;
    USICTL1 = USII2C + USIIE;
    USICKCTL = USIDIV_7 + USISSEL_2 + USICKPL;
    USICTL0 &= ~USISWRST;
}

//开始信号
void I2C_Start(void)
{
    USISRL = 0x00;
    USICTL0 |= USIGE | USIOE;
    USICTL0 &= ~USIGE;
}

//停止信号
void I2C_Stop(void)
{
    USICTL0 |= USIOE;
    USISRL = 0x00;
    USICNT = 
1;
    
while((USICTL1 & USIIFG) != 0x01);
    USISRL = 0xFF;
    USICTL0 |= USIGE;
    USICTL0 &= ~USIOE & ~USIGE ;
}

unsigned char I2C_Write(unsigned char dat)
{
    USICTL0 |= USIOE;
    USISRL = dat;
    USICNT = 
8;
    
while((USICTL1 & USIIFG) != 0x01);
    USICTL0 &= ~USIOE;
    USICNT = 
1;
    
while((USICTL1 & USIIFG) != 0x01);
    
return USISRL;
}

unsigned char I2C_Read(unsigned char ACK)
{
    
unsigned char dat;
    USICTL0 &= ~USIOE;
    USISRL = 0x00;
    USICNT = 
8;
    
while((USICTL1 & USIIFG) != 0x01);
    dat = USISRL;
    USICTL0 |= USIOE;
    USISRL = ACK;
    USICNT = 
1;
    
while((USICTL1 & USIIFG) != 0x01);
    
return dat;
}

主程序:

 C Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <msp430.h>
#include "I2C.H"

#define LM75_CMD_TEMPERATURE 0x00
#define LM75_CMD_CONFIG 0x01
#define LM75_CMD_HYST 0x02
#define LM75_CMD_SET 0x03
#define LM75_ADDR 0x48;

int readData()
{
    
int t;
    I2C_Start();
    I2C_Write(0x48 << 
1  | 1); //地址
    t = I2C_Read(0x0) << 8;
    t |= I2C_Read(0x0);
    t &= ~0x3;
    I2C_Read(0x0);
    I2C_Stop();
    
return t;
}

float getTemperature()
{
    I2C_Start();
    I2C_Write(0x48 << 
1); //地址
    I2C_Write(LM75_CMD_TEMPERATURE);
    I2C_Stop();
    
int t = readData();
    
float tc = -46.85 + 175.72 / 65536.0 * (float) t;
    
return tc;
}


void main(void)
{
    
float temp;
    WDTCTL = WDTPW + WDTHOLD;
    I2C_Init();
    
while(1)
    {
        temp = getTemperature();
    }
}

经常卡在标志位的查询上.