I2C驱动文件.
|
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; } |
主程序:
|
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(); } } |
经常卡在标志位的查询上.