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

📄 i2c.c

📁 rx8025 日历时钟芯片程序
💻 C
字号:
/*	I2C器件AT24C256和RX8025A驱动程序
	制作人:张彩霞
	日期:	2003-11-12
*/

/* TMS320LF2407A与I2C接口
	PE.1-----SCL
	PE.0-----READ
	PE.7-----WRITE
	PE.2-----256WP(低电平可写入)
	PEDATDIR 初始化时PE1 2 7为输出方式  高电平0
	PE.0为输入方式
*/
#define I2C_C
#include "all_inc.h"
//#include "typedefine.h"

/*#define setscl		pedatdir |= 0x0002
#define clrscl		pedatdir &= 0xfffd
#define setsda		pedatdir |= 0x0080
#define clrsda		pedatdir &= 0xff7f
#define READ_ACK	(pedatdir & 0x0001)*/
//avr config rx8025 ioport
#define setscl		PORTC |= b6_msk
#define clrscl		PORTC &= ~b6_msk
#define setsda		PORTC |= b7_msk
#define clrsda		PORTC &= ~b7_msk
#define READ_ACK	(PINC & b7_msk)
void start(void);
void stop(void);
unsigned int read_ack(void);
void send_ack(void);
void write_byte(unsigned char data);
unsigned char read_byte(void);

unsigned char rx8025_write(unsigned int slave_addr,unsigned int addr_tran,unsigned char *data,unsigned char length);
unsigned char  rx8025_stand_read(unsigned int slave_addr,unsigned int addr_tran,unsigned char *data,unsigned char length);


/*I2C起始信号
	无参数
	无返回值
*/
void start(void)
{
	setscl;
	setsda;
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
	clrsda;
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
	clrscl;
}

/*I2C结束信号
	无参数
	无返回值
*/
void stop(void)
{
	clrsda;
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
	setscl;
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
	setsda;
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
/*	clrscl; */
}

/*写完一个字节后读应答信号*/
unsigned int read_ack(void)
{
	unsigned int ack;
	
	DDRC &= ~b7_msk;	// config bit6 input
	setsda;

	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
	setscl;
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
	ack = READ_ACK;
	clrscl;
	DDRC |= b7_msk;
	return ack;
}

/*读完一个字节后发送应答信号*/
void send_ack(void)
{
	clrsda;				/*发送0作为应答信号*/
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
	setscl;
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
	clrscl;
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
	setsda;				/*发送应答信号之后将释放sda*/
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
}
	
/*	写一个字节
	形参:data
	无返回值
*/
void write_byte(unsigned char data)
{
	unsigned int i;
	
	for(i=0;i<8;i++)
	{	__delay_cycles(50);
//		asm("	rpt #9");
//		asm("	nop");
		if(data & 0x80)
			setsda;
		else
			clrsda;
		data	<<= 1;
		__delay_cycles(50);
//		asm("	rpt #9");
//		asm("	nop");
		setscl;
		__delay_cycles(50);
//		asm("	rpt #9");
//		asm("	nop");
		clrscl;
		__delay_cycles(100);
//		asm("	rpt #9");
//		asm("	nop");
	}
}

/*读一个字节
	无形参
	返回值为读到的参数
*/
unsigned char read_byte(void)
{
	unsigned int i;
	unsigned char readbyte=0;

    DDRC &= ~b7_msk;
	__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");

	for(i=0;i<8;i++)
	{
		setscl;
		__delay_cycles(50);
//	asm("	rpt #9");
//	asm("	nop");
		readbyte <<= 1;
		if(READ_ACK)
		{
			readbyte += 1;
		}
		clrscl;
		__delay_cycles(80);
//		asm("	rpt #9");
//		asm("	nop");
	}  
	DDRC |= b7_msk;
	return readbyte;

}


/*	RX8025A写操作
	slave_addr------8025地址,第0位为R/W位
	addr_tran-------地址和转换模式,高4位为地址,低4位为转换模式
	*data-----------数据指针
	length----------数据长度
	返回值----------返回-1则操作不成功,其他成功操作
*/

unsigned char rx8025_write(unsigned int slave_addr,unsigned int addr_tran,
			   unsigned char *data,unsigned char length)
{
	unsigned int i;
	unsigned char result=1;
	
	start();
	write_byte(slave_addr);
	if(read_ack())
	{
		stop();
		result = 0;
		return result;
	}
	write_byte(addr_tran);
	if(read_ack())
	{
		stop();
		result = 0;
		return result;
	}
	for(i=0;i<length;i++)
	{
		write_byte(*(data+i));
		if(read_ack())
		{
			stop();
			result=0;
			return result;
		}
	}
	stop();
	return result;
}


/*	RX8025读操作,
	读方式----------标准读模式
	slave_addr------8025地址,第0位为R/W位
	addr_tran-------地址和转换模式,高4位为地址(0-F),低4位为转换模式
	*data-----------数据指针
	length----------数据长度
	返回值----------返回-1则操作不成功,其他成功操作
*/

unsigned char  rx8025_stand_read(unsigned int slave_addr,unsigned int addr_tran,
					unsigned char *data,unsigned char length)
{
	unsigned int i;
	unsigned int result;
	start();
	write_byte(slave_addr);
	if(read_ack())
	{
		stop();
		result=0;
		return result;
	}
	write_byte(addr_tran);
	if(read_ack())
	{
		stop();
		result=0;
		return result;
	}
	start();
	write_byte(slave_addr | 0x0001);		/*读方式*/
	if(read_ack())
	{
		stop();
		result=0;
		return result;
	}
	for(i=0;i<length;i++)
	{
		*(data+i) = read_byte();
		if(i<length-1)
			send_ack();
	}
	stop();
//	return length;
	return result;
}

/*初始化时钟芯片的工作及起始时间*/
void rx8025_init(void)
{
	unsigned char result;
    unsigned char buf[2]={0x20};
    INT8U timedata[] = {0x10,0x59,0x23,0,0x20,0x10,0x08};
	result = rx8025_write(SLAVE_ADDR_8025,0xe0,buf,1);
    if(result)
    {
        result = rx8025_write(SLAVE_ADDR_8025,0x0,timedata,7);
    }
}



⌨️ 快捷键说明

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