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

📄 iic.c

📁 8025 的430程序,采用I2C总线.的C语言程序
💻 C
字号:
/******************************************************************************************************
文件名:iic.c
编写者:WANGYUBO
描述:iic总线的子程序。
版本:2006年4月6日   1.0

*****************************************************************************************************/
#include  <msp430x44x.h>
//#include "24c02.h"
#include "iic.h"
//#include "general.h"


void     Init8025()                                              //初始化8025时钟芯片
{ unsigned char j,*clkdata,i,jjj[16];
  unsigned long tmp;
//P1DIR |= 0x80;
//P1OUT |= 0X80;
//P2DIR |= 0X01;
//P2OUT |= 0X01;
//P1OUT &= ~0X80;
//P2OUT &= ~0X01;
InitIIC();
i=0;
  jjj[0] = 0x50;
  jjj[1] = 0x59;
  jjj[2] = 0x23;
  jjj[3] = 0x01;
  jjj[4] = 0x31;
  jjj[5] = 0x12;
  jjj[6] = 0x06;
  jjj[7] = 0x00;
  jjj[8] = 0x00;
  jjj[9] = 0x00;
  jjj[10] = 0x00;
  jjj[11] = 0x00;
  jjj[12] = 0x00;
  jjj[13] = 0x00;
  jjj[14] = 0x20;
  jjj[15] = 0x00;
  
  
  Write8025(jjj,0,16);
  return;
while(1)
 {
 
 if(i != jjj[0])
   {
    i = jjj[0];
    LedOn();
    for(tmp=0;tmp<8000;tmp++);
    LedOff();
    }
//j = Read8025_3(jjj);
   j = Read8025(jjj,0,16);
 }
}

















/***************************************************************************
初始化IIC
***************************************************************************/
void InitIIC()
{
	//IIC_DIR |= IIC_SCL;  //SCL管脚为输出
	//IIC_DIR &= ~IIC_SDA; //SDA管脚为输入
	SDA_DIR;
	SCL_DIR;
	C_SCL;
	Stop();
}

/***************************************************************************
进行短暂的延时,原因是MSP430的速度比较快。使用者可以根据时钟频率自行调节延时长短
***************************************************************************/
void delay()
{
	unsigned int q0;
	for(q0=0;q0<200;q0++)
	{
		_NOP();
	}
}
/**************************************************************************/
void DelayMs(unsigned char DMS)
{unsigned int temp;
 while(DMS>0)
    {
    for(temp=0;temp<800;temp++);
    DMS--;
    }
}

/***************************************************************************
启动IIC总线
***************************************************************************/
void Start()
{
        S_SCL;            //scl high
	delay();
	SDA_OUT;          //SDA HIGN
	S_SDA;
	delay();
	C_SDA;           //SDA LOW
	delay();
	C_SCL;
	delay();         //SCL LOW
}

/***************************************************************************
停止操作,释放IIC总线
***************************************************************************/
void Stop()
{
	S_SCL;                //SCL HIGH
	delay();
	SDA_OUT;              //
	C_SDA;                //C_SCL;
	delay();
	S_SDA;
	delay();
	
	                       //delay();
	
}

/***************************************************************************
IIC总线应答
***************************************************************************/
void Ack()
{
	SDA_OUT;
	C_SDA;
	delay();
	S_SCL;
	delay();
	C_SCL;
	delay();
	S_SDA;
}

/***************************************************************************
IIC总线无应答
***************************************************************************/
void NoAck()
{
	SDA_OUT;
	S_SDA;
	delay();
	S_SCL;
	delay();
	C_SCL;
	delay();
}

/***************************************************************************
IIC总线检验应答
返回值:IIC应答位的值0:应答   1:无应答
***************************************************************************/
unsigned char TestAck()
{
	unsigned char ack;

	S_SCL;
	delay();
	SDA_IN;
	delay();
	ack=READ_SDA;
	delay();
	C_SCL;
	delay();
	return(ack);
}

/***************************************************************************
IIC总线写8位数据
input:要写的8位数据
***************************************************************************/
void Write8Bit(unsigned char input)
{
	unsigned char temp,q0;
	SDA_OUT;
	for(temp=8;temp!=0;temp--)
	{
		q0=input&0x80;
		if(q0==0x80)
			S_SDA;
		else
			C_SDA;
      delay();
		S_SCL;
		delay();
		C_SCL;
		delay();
		input=input<<1;
	}
}

/***************************************************************************
IIC总线读8位数据
返回值:读出的8位数据
***************************************************************************/
unsigned char Read8Bit()
{
	unsigned char temp,q0,rbyte=0;
	SDA_IN;
	for(temp=8;temp!=0;temp--)
	{
		S_SCL;
		delay();
		rbyte=rbyte<<1;
		SDA_IN;
		q0=READ_SDA;
		if(q0==IIC_SDA)
			rbyte=rbyte|0x1;
		delay();
		C_SCL;
		delay();
	}
	return(rbyte);
}



/***************************************************************************
向8025中写多个字节
psrc_data:指向要写入数据数组的指针
adr:8025中要写入数据的首地址
nbyte:写入的字节数
返回值:  0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char Write8025(unsigned char* psrc_data,unsigned char adr,unsigned char nbyte)
{

                Start();			//启动IIC总线
		Write8Bit(W_DEVICE_ADR);	//写8025芯片地址以及确定下面执行写操作
		if(TestAck()==1)		//检验应答
			return 1;		//若应答错误,则退出函数,返回错误
			
		Write8Bit(adr*0x10);			//写对8025操作的地址
		if(TestAck()==1)
			return 1;

    	      while(nbyte != 0)
	          {
		   Write8Bit(*psrc_data);		//向8025中写数据
		   if(TestAck()==1)
			return 1;
		   psrc_data++;			//指向待写数据的指针加1
		   nbyte--;
 		   }
	      Stop();				//停止IIC总线
	      DelayMs(10);			//写入延时	
	      return 0;
}

/***************************************************************************
从8025中读一个字节
pdin_data:指向要保存读出数据的变量的指针
adr:8025中要读出数据的地址
返回值:  0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char Read8025Byte(unsigned char *pdin_data,unsigned char adr)
{
	Start();			//启动IIC总线
	Write8Bit(W_DEVICE_ADR);	//写8025的芯片地址以及确定下面执行写操作
	if(TestAck()==1)
		return 1;
	Write8Bit(adr*0x10 + 4);			//写对8025操作的地址
	if(TestAck()==1)
		return 1;

//	Start();			//再次启动IIC总线
//	Write8Bit(R_DEVICE_ADR);	//写8025的芯片地址以及确定下面执行读操作
//	if(TestAck()==1)
//		return 1;
	*pdin_data=Read8Bit();		//从8025中读数据,存入pdin_data所指的存储器中
	NoAck();			//IIC无应答操作
	Stop();				//停止IIC总线
        DelayMs(1);
	return 0;
}

/***************************************************************************
从8025读多个字节
pdin_data:指向要保存读出数据的数组的指针
adr:8025中要读出数据的首地址
nbyte:读出的字节数
返回值:  0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char Read8025(unsigned char *pdin_data,unsigned char adr,unsigned char nbyte)
{
	Start();			//启动IIC总线
	Write8Bit(W_DEVICE_ADR);	//写8025的芯片地址以及确定下面执行写操作
	if(TestAck()==1)
		return 1;
	
	Write8Bit(adr*0x10+4);		//写8025操作的地址
	if(TestAck()==1)
		return 1;

//	Start();			//再次启动IIC总线
//	Write8Bit(R_DEVICE_ADR);	//写8025的芯片地址以及确定下面执行读操作
//	if(TestAck()==1)
//		return 1;
	while(nbyte!=1)
	{
		*pdin_data=Read8Bit();	//循环从8025中读数据,存入pdin_data所指的存储器中
		Ack();			//IIC应答
		pdin_data++;		//指向存储读入数据的存储器指针加1
		nbyte--;		//剩余要读入的字节减1
	};

	*pdin_data=Read8Bit();		//读入最后一个字节
	NoAck();			//IIC无应答操作
	Stop();
	DelayMs(1);
	return 0;
}
/*****************************************************************************
从8025读多个字节
pdin_data:指向要保存读出数据的数组的指针
adr:8025中要读出数据的首地址
nbyte:读出的字节数
返回值:  0:执行完毕;1:执行出现错误
***************************************************************************/
unsigned char Read8025_3(unsigned char *pdin_data)
{unsigned char nbyte,*addr;
       nbyte = 15;
//	Start();			//启动IIC总线
//	Write8Bit(W_DEVICE_ADR);	//写8025的芯片地址以及确定下面执行写操作
//	if(TestAck()==1)
//		return 1;
	
//	Write8Bit(adr);		//写8025操作的地址
//	if(TestAck()==1)
//		return 1;

	Start();			//再次启动IIC总线
	Write8Bit(R_DEVICE_ADR);	//写8025的芯片地址以及确定下面执行读操作
	if(TestAck()==1)
		return 1;
	*(pdin_data+15) = Read8Bit();	//循环从8025中读数据,存入pdin_data所指的存储器中
		Ack();			//IIC应答
		
	while(nbyte!=1)
	{
		*pdin_data=Read8Bit();	//循环从8025中读数据,存入pdin_data所指的存储器中
		Ack();			//IIC应答
		pdin_data++;		//指向存储读入数据的存储器指针加1
		nbyte--;		//剩余要读入的字节减1
	};

	*pdin_data = Read8Bit();		//读入最后一个字节
	NoAck();			//IIC无应答操作
	Stop();
	DelayMs(1);
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -