📄 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; //应答标志
unsigned char IIC_DATA_W[36]; //存储芯片存放数据
unsigned char IIC_DATA_R[36]; //存储芯片存放数据
float Temperature_Sensor;
// 函数定义
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);//写入一字节数据
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); // 读数据
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
//当SCL为高时,SDA由高到低,开始,然后SCL到低
void IIC_Start(void)
{
IICDIR |= SDA+SCL;//设置为输出
IICOUT |= SDA; //SDA = 1;
IICOUT |= SCL; //SCL = 1;
IIC_Wait();
IICOUT &= ~SDA;//SDA = 0;
IIC_Wait();
IICOUT &= ~SCL;//SCL = 0;
}
//stop condition
//当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
//应答信号,ack=0为应答,1为非应答
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
//写入一字节数据
//功能:将数据c发出,可以是地址也可以是数据,发完后等待应答,
//并对此状态位进行操作(不应答或非应答都使ack=0),如果发送正常
//则ack=1,如果ack=0表明被控器无应答或损坏
void IIC_Write(unsigned char c)
{
unsigned char BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //传送一个8位字节
{
if((c<<BitCnt)&0x80) //判断发送位
IICOUT |= SDA; //SDA=1;
else
IICOUT &= ~SDA; //SDA=0;
_NOP();
IICOUT |= SCL; //SCL=1; //置时钟线高电平,通知从器件开始接收数据位
IIC_Wait();
IICOUT &= ~SCL; //SCL=0;
}
_NOP();
_NOP();
IICOUT |= SDA; //SDA=1; //8位数据位发送完,释放数据线,准备接受应答位
_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; //判断是否接收到应答信号
IICDIR |= SDA; //SDA置为输出
IICOUT &= ~SCL; //SCL=0;
_NOP();
_NOP();
}
//字节数据接收
//接收从器件传来的数据并判断总线错误(不发应答信号)
//发完后用应答函数
unsigned char IIC_Read(void)
{
unsigned char retc,BitCnt;
retc=0;
IICOUT |= SDA; //SDA=1; //置数据线为输入方式
IICDIR &= ~SDA; //SDA置为输入
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_NOP();
IICOUT &= ~SCL; //SCL=0; //置时钟线为低,准备接收数据
IIC_Wait();
IICOUT |= SCL; //SCL=1; //置时钟线高电平,通知从器件开始接收数据位
_NOP();
_NOP();
retc=retc<<1;
if((IICIN&SDA)==SDA) //if(SDA==1)
retc=retc+1; //接收的数据位放入retc中
_NOP();
_NOP();
}
IICOUT &= ~SCL; //SCL=0; //置时钟线为低,准备接收数据
_NOP();
_NOP();
IICDIR |= SDA; //SDA置为输出
return(retc);
}
//向从器件写1字节数据
//启动总线-发送地址-数据-结束总线
//从器件地址为sla。返回1表示操作成功,否则为失败
unsigned char IIC_WriteByte(unsigned char sla,unsigned char c)
{
IIC_Start(); //启动总线
IIC_Write(sla); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
IIC_Write(C); //发送数据
if(ack==0)
return(0);//无应答,返回0
IIC_Stop(); //结束总线
return(1);
}
//向从器件写n字节数据
//启动总线-发送地址-子地址-数据-结束总线
//从器件地址为sla,子地址为suba,发送内容为指针s指向的内容,发送n个字节。
//返回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); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
IIC_Write(suba_h); //发送器件子地址高位
if(ack==0)
return(0);//无应答,返回0
IIC_Write(suba_l); //发送器件子地址低位
if(ack==0)
return(0);//无应答,返回0
for(i=0;i<n;i++)
{
IIC_Write(*s); //发送数据
if(ack==0)
return(0);//无应答,返回0
s++;
}
IIC_Stop(); //结束总线
// P5OUT &= ~BIT4;
P1OUT |= BIT7; //打开写保护
return(1);
}
//向从器件读1字节数据
//启动总线-发送地址-数据-结束总线
//从器件地址为sla,返回值保存在c。
//返回1表示操作成功,否则为失败
unsigned char IIC_ReadByte(unsigned char sla,unsigned char *c)
{
IIC_Start(); //启动总线
IIC_Write(sla+1); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
*c=IIC_Read(); //读取数据
Send_Ack(1); //发送非应答位
IIC_Stop(); //结束总线
return(1);
}
//向从器件读n字节数据
//启动总线-发送地址-子地址-数据-结束总线
//从器件地址为sla,子地址为suba,读内容放到指针s,读n个字节。
//返回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); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
IIC_Write(suba_h); //发送器件子地址高位
if(ack==0)
return(0);//无应答,返回0
IIC_Write(suba_l); //发送器件子地址低位
if(ack==0)
return(0);//无应答,返回0
IIC_Start();
IIC_Write(sla+1); //发送器件地址
if(ack==0)
return(0);//无应答,返回0
for(i=0;i<n-1;i++)
{
*s=IIC_Read();
Send_Ack(0); //发送应答位
s++;
}
*s=IIC_Read();
Send_Ack(1); //发送非应答位
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(); //设置 TMP100
IIC_Write(SlvAdr);
if(ack==0)
return;//无应答,返回0 //NAck ();
IIC_Write(0x01); //P1 P0 =01 ,设置指针寄存器
if(ack==0)
return;//无应答,返回0 //NAck ();
IIC_Write(0xE1); //设置转换结果为12位; shutdown 模式; 置OS=1,开始温度单次转换
if(ack==0)
return;//无应答,返回0 //NAck ();
IIC_Stop ();
// while (i--); //延时,大于600ms, 保证温度充分转换
IIC_Start (); //设置 TMP100
IIC_Write(SlvAdr);
if(ack==0)
return;//无应答,返回0 //NAck ();
IIC_Write(0x00); //P1 P0 =00 ,选取温度寄存器
if(ack==0)
return;//无应答,返回0 //NAck ();
IIC_Start ();
IIC_Write(SlvAdr | 1); //读温度寄存器
if(ack==0)
return;//无应答,返回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;//关狗
_DINT();
port_init();//系统初始化
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);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -