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

📄 msp430i2c.c

📁 这是一个在MSP430单片机上
💻 C
字号:
//参考《msp430系列单片机实用c语言程序设计》张唏王德银张晨编,人民邮电出版社

/*************************************************************
IIC模块iic.c,包括iic初始化,Start,Stop,Ak, NoAck,
TestAck,Write8Bit,Read8Bit, delay 9个函数。
*************************************************************/

#include <msp430x16x.h>
#include "MSP430I2C.h"

/*初始化iic*/
void DelayMs(unsigned char time)
{
    unsigned int i = 0;
    while( time --)
    {
        i = 500;
        while(i--);
    }
}

/*延时,可由时钟频率自行调整*/
void delay()
{
	unsigned char q0;
	for(q0=0;q0<20;q0++)
	{
		_NOP();
	}
}

/*启动总线*/
void Start()
{
	SDA_OUT;
	S_SDA;
	delay();
	S_SCL;
	delay();
	C_SDA;
	delay();
	C_SCL;
	delay();
}

/*停止总线*/
void Stop()
{
	SDA_OUT;
	C_SCL;
	delay();
	C_SDA;
	delay();
	S_SCL;
	delay();
	S_SDA;
	DelayMs(10); 
}

/*初始化iic*/
void InitIIC()
{
	IIC_DIR|=IIC_SCL;
	IIC_DIR&=~IIC_SDA;
	C_SCL;
	Stop();
}
/*iic总线应答*/
void Ak()
{
	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);
}

/*总线写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;   
		input=input<<1; 
	}
	C_SDA;
}

/*总线读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|0x01; 
		delay();
		C_SCL;   
		delay(); 
	}
	return(rbyte);
}



//    子程序: I2CReadRTC(


unsigned char I2CReadStr(unsigned char DeviceAddr, unsigned char DataAddr, unsigned char *data,unsigned char len)
{   
	Start();

	Write8Bit(DeviceAddr);    
	delay();
	if(TestAck()==1)
		return 0;

	Write8Bit(DataAddr);        //初始化指针,指向要读的地址.
	delay();
	if(TestAck()==1)
		return 0;

	Stop();
	delay();

	Start();

	Write8Bit(DeviceAddr | 1);  //rtc转从发送模式
	delay();
	if(TestAck() == 1)
		return 0;

	while(len != 1)
	{
		*data=Read8Bit();
		Ak();
		data++;
		len--;
	}    

	*data=Read8Bit();  //读入最后一个字节
	NoAck();

	Stop();
	return 1;
}


unsigned char I2CWriteStr(unsigned char DeviceAddr, unsigned char DataAddr, unsigned char *data,unsigned char len)
{
	Start();

	Write8Bit(DeviceAddr);             
	delay();                 
	if(TestAck()==1)
		return 0;

	Write8Bit(DataAddr);
	delay();
	if(TestAck()==1)
		return 0;

	for(;len > 0;len--) 
	{
		Write8Bit(*data); 
		delay();
		if(TestAck()==1)
			return 0;
		data++;
	}            

	Stop();
	return 1;
}

⌨️ 快捷键说明

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