?? main.c
字號:
#include <msp430x14x.h>
//5.4接a2 a1 a0 and vcc腳 1.7接wp腳,高為寫保護
#define CAT24C256 0xAE //定義cat24c256的寫地址
#define TMP100 0x90 //定義從器件 TMP100 的寫地址
//#define CAT24C256_R 0xAF //定義cat24c256的讀地址
#define IICDIR P2DIR
#define IICOUT P2OUT
#define IICIN P2IN
#define SDA BIT1 //I2C的兩個引腳 帶上拉電阻 2.1
#define SCL BIT0 //2.0
unsigned char ack; //應(yīng)答標(biāo)志
unsigned char IIC_DATA_W[36]; //存儲芯片存放數(shù)據(jù)
unsigned char IIC_DATA_R[36]; //存儲芯片存放數(shù)據(jù)
float Temperature_Sensor;
// 函數(shù)定義
void IIC_Start(void); // start
void IIC_Wait(void); // wait
void IIC_Stop(void); // stop
void Send_Ack(unsigned char ack);
void IIC_Write(unsigned char c);//寫入一字節(jié)數(shù)據(jù)
unsigned char IIC_WriteByte(unsigned char sla,unsigned char c);
unsigned char IIC_WriteNBytes(unsigned char sla,unsigned int suba,unsigned char *s,unsigned char n);
unsigned char IIC_Read(void); // 讀數(shù)據(jù)
unsigned char IIC_ReadByte(unsigned char sla,unsigned char *c);
unsigned char IIC_ReadNBytes(unsigned char sla,unsigned int suba,unsigned char *s,unsigned char n);
//wait function
void IIC_Wait(void)
{
_NOP();
_NOP();
_NOP();
_NOP();
}
//start condidion
//當(dāng)SCL為高時,SDA由高到低,開始,然后SCL到低
void IIC_Start(void)
{
IICDIR |= SDA+SCL;//設(shè)置為輸出
IICOUT |= SDA; //SDA = 1;
IICOUT |= SCL; //SCL = 1;
IIC_Wait();
IICOUT &= ~SDA;//SDA = 0;
IIC_Wait();
IICOUT &= ~SCL;//SCL = 0;
}
//stop condition
//當(dāng)SCL為高時,SDA由低到高
void IIC_Stop(void)
{
IICOUT &= ~SDA;//SDA = 0;
IICOUT |= SCL; //SCL=1;
IIC_Wait();
IICOUT |= SDA; //SDA = 1;
//IIC_Wait();
//IICOUT &= ~SCL;//SCL = 0;
}
//send ack(1 or 0) to slave device:ACK=0.NON-ACK=1
//應(yīng)答信號,ack=0為應(yīng)答,1為非應(yīng)答
void Send_Ack(unsigned char ack)
{
//SDA = ack;
if(ack==1)
IICOUT |= SDA; //SDA = 1;
else
IICOUT &= ~SDA; //SDA = 0;
IICOUT |= SCL; //SCL = 1;
IIC_Wait();
IICOUT &= ~SCL;//SCL = 0;
//SDA=~ack;
if(ack==1)
IICOUT &= ~SDA; //SDA = 0;
else
IICOUT |= SDA; //SDA = 1;
}
//send one byte
//寫入一字節(jié)數(shù)據(jù)
//功能:將數(shù)據(jù)c發(fā)出,可以是地址也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,
//并對此狀態(tài)位進行操作(不應(yīng)答或非應(yīng)答都使ack=0),如果發(fā)送正常
//則ack=1,如果ack=0表明被控器無應(yīng)答或損壞
void IIC_Write(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //傳送一個8位字節(jié)
{
if((c<<BitCnt)&0x80) //判斷發(fā)送位
IICOUT |= SDA; //SDA=1;
else
IICOUT &= ~SDA; //SDA=0;
_NOP();
IICOUT |= SCL; //SCL=1; //置時鐘線高電平,通知從器件開始接收數(shù)據(jù)位
IIC_Wait();
IICOUT &= ~SCL; //SCL=0;
}
_NOP();
_NOP();
IICOUT |= SDA; //SDA=1; //8位數(shù)據(jù)位發(fā)送完,釋放數(shù)據(jù)線,準(zhǔn)備接受應(yīng)答位
_NOP();
_NOP();
IICOUT |= SCL; //SCL=1;
_NOP();
_NOP();
_NOP();
IICDIR &= ~SDA; //SDA置為輸入
//if(SDA==1) ack=0;
if((IICIN&SDA)==SDA)ack=0;
else ack=1; //判斷是否接收到應(yīng)答信號
IICDIR |= SDA; //SDA置為輸出
IICOUT &= ~SCL; //SCL=0;
_NOP();
_NOP();
}
//字節(jié)數(shù)據(jù)接收
//接收從器件傳來的數(shù)據(jù)并判斷總線錯誤(不發(fā)應(yīng)答信號)
//發(fā)完后用應(yīng)答函數(shù)
unsigned char IIC_Read(void)
{
unsigned char retc,BitCnt;
retc=0;
IICOUT |= SDA; //SDA=1; //置數(shù)據(jù)線為輸入方式
IICDIR &= ~SDA; //SDA置為輸入
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_NOP();
IICOUT &= ~SCL; //SCL=0; //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)
IIC_Wait();
IICOUT |= SCL; //SCL=1; //置時鐘線高電平,通知從器件開始接收數(shù)據(jù)位
_NOP();
_NOP();
retc=retc<<1;
if((IICIN&SDA)==SDA) //if(SDA==1)
retc=retc+1; //接收的數(shù)據(jù)位放入retc中
_NOP();
_NOP();
}
IICOUT &= ~SCL; //SCL=0; //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)
_NOP();
_NOP();
IICDIR |= SDA; //SDA置為輸出
return(retc);
}
//向從器件寫1字節(jié)數(shù)據(jù)
//啟動總線-發(fā)送地址-數(shù)據(jù)-結(jié)束總線
//從器件地址為sla。返回1表示操作成功,否則為失敗
unsigned char IIC_WriteByte(unsigned char sla,unsigned char c)
{
IIC_Start(); //啟動總線
IIC_Write(sla); //發(fā)送器件地址
if(ack==0)
return(0);//無應(yīng)答,返回0
IIC_Write(C); //發(fā)送數(shù)據(jù)
if(ack==0)
return(0);//無應(yīng)答,返回0
IIC_Stop(); //結(jié)束總線
return(1);
}
//向從器件寫n字節(jié)數(shù)據(jù)
//啟動總線-發(fā)送地址-子地址-數(shù)據(jù)-結(jié)束總線
//從器件地址為sla,子地址為suba,發(fā)送內(nèi)容為指針s指向的內(nèi)容,發(fā)送n個字節(jié)。
//返回1表示操作成功,否則為失敗
unsigned char IIC_WriteNBytes(unsigned char sla,unsigned int suba,unsigned char *s,unsigned char n)
{
unsigned char i;
unsigned char suba_h,suba_l;
//P5OUT |= BIT4; //給IIC供電
P1OUT &= ~BIT7; //取消寫保護
suba_h=(unsigned char) (suba>>8);
suba_l=(unsigned char) (suba&0x00ff);
IIC_Start(); //啟動總線
IIC_Write(sla); //發(fā)送器件地址
if(ack==0)
return(0);//無應(yīng)答,返回0
IIC_Write(suba_h); //發(fā)送器件子地址高位
if(ack==0)
return(0);//無應(yīng)答,返回0
IIC_Write(suba_l); //發(fā)送器件子地址低位
if(ack==0)
return(0);//無應(yīng)答,返回0
for(i=0;i<n;i++)
{
IIC_Write(*s); //發(fā)送數(shù)據(jù)
if(ack==0)
return(0);//無應(yīng)答,返回0
s++;
}
IIC_Stop(); //結(jié)束總線
// P5OUT &= ~BIT4;
P1OUT |= BIT7; //打開寫保護
return(1);
}
//向從器件讀1字節(jié)數(shù)據(jù)
//啟動總線-發(fā)送地址-數(shù)據(jù)-結(jié)束總線
//從器件地址為sla,返回值保存在c。
//返回1表示操作成功,否則為失敗
unsigned char IIC_ReadByte(unsigned char sla,unsigned char *c)
{
IIC_Start(); //啟動總線
IIC_Write(sla+1); //發(fā)送器件地址
if(ack==0)
return(0);//無應(yīng)答,返回0
*c=IIC_Read(); //讀取數(shù)據(jù)
Send_Ack(1); //發(fā)送非應(yīng)答位
IIC_Stop(); //結(jié)束總線
return(1);
}
//向從器件讀n字節(jié)數(shù)據(jù)
//啟動總線-發(fā)送地址-子地址-數(shù)據(jù)-結(jié)束總線
//從器件地址為sla,子地址為suba,讀內(nèi)容放到指針s,讀n個字節(jié)。
//返回1表示操作成功,否則為失敗
unsigned char IIC_ReadNBytes(unsigned char sla,unsigned int suba,unsigned char *s,unsigned char n)
{
unsigned char i;
unsigned char suba_h,suba_l;
//P5OUT |= BIT4; //給IIC供電
suba_h=(unsigned char) (suba>>8);
suba_l=(unsigned char) (suba&0x00ff);
IIC_Start(); //啟動總線
IIC_Write(sla); //發(fā)送器件地址
if(ack==0)
return(0);//無應(yīng)答,返回0
IIC_Write(suba_h); //發(fā)送器件子地址高位
if(ack==0)
return(0);//無應(yīng)答,返回0
IIC_Write(suba_l); //發(fā)送器件子地址低位
if(ack==0)
return(0);//無應(yīng)答,返回0
IIC_Start();
IIC_Write(sla+1); //發(fā)送器件地址
if(ack==0)
return(0);//無應(yīng)答,返回0
for(i=0;i<n-1;i++)
{
*s=IIC_Read();
Send_Ack(0); //發(fā)送應(yīng)答位
s++;
}
*s=IIC_Read();
Send_Ack(1); //發(fā)送非應(yīng)答位
IIC_Stop();
// P5OUT &= ~BIT4;
return(1);
}
void port_init(void)//端口初始化
{
P5DIR |= BIT4;//5.4接電源a0~a2;
P5OUT |= BIT4;
P1DIR |= BIT7;//wp寫保護
P1OUT |= BIT7;
IICDIR |= SDA+SCL;
IICOUT |= SDA+SCL;
}
// 100. 讀取 TMP100 溫度程序//
void read_TMP100(void)
{
unsigned char SlvAdr;
unsigned char tmp100_[2];
unsigned int temperature;
SlvAdr = TMP100;
IIC_Start(); //設(shè)置 TMP100
IIC_Write(SlvAdr);
if(ack==0)
return;//無應(yīng)答,返回0 //NAck ();
IIC_Write(0x01); //P1 P0 =01 ,設(shè)置指針寄存器
if(ack==0)
return;//無應(yīng)答,返回0 //NAck ();
IIC_Write(0xE1); //設(shè)置轉(zhuǎn)換結(jié)果為12位; shutdown 模式; 置OS=1,開始溫度單次轉(zhuǎn)換
if(ack==0)
return;//無應(yīng)答,返回0 //NAck ();
IIC_Stop ();
// while (i--); //延時,大于600ms, 保證溫度充分轉(zhuǎn)換
IIC_Start (); //設(shè)置 TMP100
IIC_Write(SlvAdr);
if(ack==0)
return;//無應(yīng)答,返回0 //NAck ();
IIC_Write(0x00); //P1 P0 =00 ,選取溫度寄存器
if(ack==0)
return;//無應(yīng)答,返回0 //NAck ();
IIC_Start ();
IIC_Write(SlvAdr | 1); //讀溫度寄存器
if(ack==0)
return;//無應(yīng)答,返回0 //NAck ();
tmp100_[0] = IIC_Read();
Send_Ack(0); //Ack();
tmp100_[1] = IIC_Read();
Send_Ack(0); //Ack ();
IIC_Stop ();
temperature = tmp100_[0];
temperature = (temperature << 8);
temperature += tmp100_[1];
temperature = (temperature >> 4);
if ((temperature & 0x0800) == 0x0800) //溫度值小于0
{
temperature = 0x1000 - temperature; //取溫度值的絕對值
Temperature_Sensor = temperature * (-0.0625);
}
else //溫度值大于0
{
Temperature_Sensor = temperature * 0.0625;
}
}
void main (void)
{
unsigned char i,a;
WDTCTL=WDTPW+WDTHOLD;//關(guān)狗
_DINT();
port_init();//系統(tǒng)初始化
a=0;
while(1)
{
for(i=0;i<36;i++)
IIC_DATA_W[i]=a+i;
IIC_WriteNBytes(CAT24C256,0x0000,IIC_DATA_W,35);
for(i=0;i<36;i++)
IIC_DATA_R[i]=0;
IIC_ReadNBytes(CAT24C256,0x0000,IIC_DATA_R,36);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -