⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 Catalyst Semiconductor的cat24c256存储芯片例程
💻 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 + -