?? iic.c
字號:
#include <msp430x14x.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define SCL_H P1OUT |= BIT2
#define SCL_L P1OUT &= ~BIT2
#define SDA_H P1OUT |= BIT3
#define SDA_L P1OUT &= ~BIT3
#define SDA_in P1DIR &= ~BIT3 //SDA改成輸入模式
#define SDA_out P1DIR |= BIT3 //SDA變回輸出模式
#define SDA_val P1IN&BIT3 //SDA的位值
#define TRUE 1
#define FALSE 0
/*******************************************
函數(shù)名稱:delay
功 能:延時約15us的時間
參 數(shù):無
返回值 :無
********************************************/
void delay(void)
{
uchar i;
for(i = 0;i < 15;i++)
_NOP();
}
/*******************************************
函數(shù)名稱:start
功 能:完成IIC的起始條件操作
參 數(shù):無
返回值 :無
********************************************/
void start(void)
{
SCL_H;
SDA_H;
delay();
SDA_L;
delay();
SCL_L;
delay();
}
/*******************************************
函數(shù)名稱:stop
功 能:完成IIC的終止條件操作
參 數(shù):無
返回值 :無
********************************************/
void stop(void)
{
SDA_L;
delay();
SCL_H;
delay();
SDA_H;
delay();
}
/*******************************************
函數(shù)名稱:mack
功 能:完成IIC的主機(jī)應(yīng)答操作
參 數(shù):無
返回值 :無
********************************************/
void mack(void)
{
SDA_L;
_NOP(); _NOP();
SCL_H;
delay();
SCL_L;
_NOP();_NOP();
SDA_H;
delay();
}
/*******************************************
函數(shù)名稱:mnack
功 能:完成IIC的主機(jī)無應(yīng)答操作
參 數(shù):無
返回值 :無
********************************************/
void mnack(void)
{
SDA_H;
_NOP(); _NOP();
SCL_H;
delay();
SCL_L;
_NOP(); _NOP();
SDA_L;
delay();
}
/**********檢查應(yīng)答信號函數(shù)******************/
/*如果返回值為1則證明有應(yīng)答信號,反之沒有*/
/*******************************************
函數(shù)名稱:check
功 能:檢查從機(jī)的應(yīng)答操作
參 數(shù):無
返回值 :從機(jī)是否有應(yīng)答:1--有,0--無
********************************************/
uchar check(void)
{
uchar slaveack;
SDA_H;
_NOP(); _NOP();
SCL_H;
_NOP(); _NOP();
SDA_in;
_NOP(); _NOP();
slaveack = SDA_val; //讀入SDA數(shù)值
SCL_L;
delay();
SDA_out;
if(slaveack) return FALSE;
else return TRUE;
}
/*******************************************
函數(shù)名稱:write1
功 能:向IIC總線發(fā)送一個1
參 數(shù):無
返回值 :無
********************************************/
void write1(void)
{
SDA_H;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/*******************************************
函數(shù)名稱:write0
功 能:向IIC總線發(fā)送一個0
參 數(shù):無
返回值 :無
********************************************/
void write0(void)
{
SDA_L;
delay();
SCL_H;
delay();
SCL_L;
delay();
}
/*******************************************
函數(shù)名稱:write1byte
功 能:向IIC總線發(fā)送一個字節(jié)的數(shù)據(jù)
參 數(shù):wdata--發(fā)送的數(shù)據(jù)
返回值 :無
********************************************/
void write1byte(uchar wdata)
{
uchar i;
for(i = 8;i > 0;i--)
{
if(wdata & 0x80) write1();
else write0();
wdata <<= 1;
}
SDA_H;
_NOP();
}
/*******************************************
函數(shù)名稱:writeNbyte
功 能:向IIC總線發(fā)送N個字節(jié)的數(shù)據(jù)
參 數(shù):outbuffer--指向發(fā)送數(shù)據(jù)存放首地址
的指針
n--數(shù)據(jù)的個數(shù)
返回值 :發(fā)送是否成功的標(biāo)志:1--成功,0--失敗
********************************************/
uchar writeNbyte(uchar * outbuffer,uchar n)
{
uchar i;
for(i = 0;i < n;i++)
{
write1byte(* outbuffer);
if(check())
{
outbuffer++;
}
else
{
stop();
return FALSE;
}
}
stop();
return TRUE;
}
/*******************************************
函數(shù)名稱:read1byte
功 能:從IIC總線讀取一個字節(jié)
參 數(shù):無
返回值 :讀取的數(shù)據(jù)
********************************************/
uchar read1byte(void)
{
uchar rdata = 0x00,i;
uchar flag;
for(i = 0;i < 8;i++)
{
SDA_H;
delay();
SCL_H;
SDA_in;
delay();
flag = SDA_val;
rdata <<= 1;
if(flag) rdata |= 0x01;
SDA_out;
SCL_L;
delay();
}
return rdata;
}
/*******************************************
函數(shù)名稱:readNbyte
功 能:從IIC總線讀取N個字節(jié)的數(shù)據(jù)
參 數(shù):inbuffer--讀取后數(shù)據(jù)存放的首地址
n--數(shù)據(jù)的個數(shù)
返回值 :無
********************************************/
void readNbyte(uchar * inbuffer,uchar n)
{
uchar i;
for(i = 0;i < n;i++)
{
inbuffer[i] = read1byte();
if(i < (n-1)) mack();
else mnack();
}
stop();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -