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

📄 iic_rw.c

📁 一个用于驱动TFT屏的驱动程序,使用IC:1828,program (无EEPROM 无IR,完整说明)IIC只写一个
💻 C
字号:
//*********************************************************************
//               IIC_RW.c     1828 的通讯程序文件
//               by hibernate  2005.9.29   
//       ShenZhen Challenge Technology Co.,Ltd
//remarks:本文件根据vxis原参考程序中func_shi文件改写
//	   修改:IIC改了死循环
//*********************************************************************
#include <reg51.h>
#include <intrins.h>
#include <stdio.h>

#include "vxis1828.h"
#include "config.h"

//IIC_RW.c文件中的分开的读写函数定义
char read1828(char address);
void write1828(char address,char buf_data);

//函数定义
void delay_nop();
void stop_IIC();
void start_IIC();
void nack_IIC();
//void ack_IIC();
bit send_IIC(char bytedata);
char receive_IIC();

//读写口定义
sbit sda     = SDA_PORT;						//to 1828 serial data/address
sbit scl     = SCL_PORT;						//to 1828 serial clock

//****************************************
// 函数:char read1828(char address)
// 作用:从1828的寄存器中读取一个8位数据
// 参数:address  => 8 bits , Reg address
// remarks: 程序的写法可以参考SPEC,
//***************************************
char read1828(char address)
{
	char buffer;
	unsigned char i = 0;
	bit  ack = 0;			   					// 1 => Acknowledge,0 => No Acknowledge 

	char device = VX1828;
	
	for(i = 0;i < 10 && !ack;i++) 				// 读成功可以返回,最多的重试次数为10次
	{
	  	stop_IIC();	
		delay_nop();
		start_IIC();							// Master send command Stop =>Start
		
		if ((ack = send_IIC(device++)) == 1)	// Send the device number and Set the R/W bit
		 	ack = send_IIC(address);
			   
		if(!ack)
			continue; 							// 没有响应时进入下次重试
		
		// Ready for receive data 	
		buffer = 0x00;
		stop_IIC();
		delay_nop();
		start_IIC();							// Master send command Stop =>Start

		if((ack = send_IIC(device++)) == 1)		// Send the device number and Set the R/W bit					
		{					
			buffer = receive_IIC();				// Save received data to buf_data				
			nack_IIC();				
		}		
	}											//设备没有响应时重新尝试读数据

	delay_nop();
	stop_IIC();
	delay_nop();

	return buffer;
}

//****************************************
// 函数:void write1828(char address,unsigned char count,char *buf_data)
// 作用:向1828写count个数据
// 参数:address  => 8 bits , Reg address
// remarks:程序的写法可以参考SPEC,
//***************************************
void write1828(char address,char buf_data)
{
	//unsigned char i = 0;

	//for(i = 0;i < ;i++) 				// 写成功可以返回,最多的重试次数为10次
	//{
		stop_IIC();	
		delay_nop();
		start_IIC();							// Master send command Stop =>Start
		
		send_IIC(VX1828);					// Send the device number and Set the R/W bit	
		send_IIC(address);			// Send the address of reg
		send_IIC(buf_data);		// Send the data pointed the buf_data index					
	//}
}

//********************************************
// 函数:void send_IIC(char data)
// 作用:IIC 向 1828 发送数据
// 参数:bytedata  =>8位,要发送的数据
// remarks:	    1、发送数据通过移位一位一位的发送,当位是1时sda写1,位是0时sda写0
//              2、发送成功返回1,否则返回0
//********************************************
bit send_IIC(char bytedata)
{
	char i = 0;
	bit  ack;			  						 // 0 => Acknowledge,1 => No Acknowledge  
						
	scl = 0; 
	delay_nop();	

	for (i = 8;i > 0;i--)
	{
		//sda = 0;								// sda low
		if (bytedata & 0x80)
			sda = 1;							// sda high
		else
			sda = 0;
		delay_nop();
		bytedata <<= 1;							// bytedata left shift
			
		// Generate SCLK
		scl = 1; 
		delay_nop();							// scl high	
		scl = 0;  
		delay_nop();							// scl low		
	}
	delay_nop();

	sda = 1; 
	delay_nop();      							// sda high	
	scl = 1;
	delay_nop();								// scl high	
    ack = sda;
	delay_nop();   								// Read ack  0:Acknowledge;  1:No Acknowledge
	scl = 0; 
	delay_nop();								// scl low
	
	return !ack;
}

//********************************************
//函数:char receive_IIC()
//作用:从IIC(1828||EEPROM)接收数据
//参数:
//remarks:
//********************************************
char receive_IIC()
{
	unsigned char i = 0;
    char receive = 0;		   					 // 8 bits buffer for receive
	
	for (i = 0x08;i > 0;i--)					 // 8位
	{
		receive <<= 1;
		scl = 1;							     // scl high
		delay_nop();
		if (sda)
		  receive |= 0x01;
	
		scl = 0;								 // scl low
		delay_nop();
	}
	return receive;
}

//********************************************
//函数:void ack_IIC()
//作用:IIC响应时的设置(Acknowledge Function)
//rekmarks:进行多个字节的读取时要使用本函数
//*********************************************
/*
void ack_IIC()
{
	sda = 0;
	delay_nop();								// sda low	
	scl = 1;
	delay_nop();								// scl high	
	scl = 0;
	delay_nop();								// scl low	
	sda = 1;
	delay_nop();								// sda high	
}
*/
//********************************************
//函数:void nack_IIC()
//作用:IIC没有响应时的设置( Not Acknowledge Function)
//*********************************************
void nack_IIC()
{
	// Acknowledge active
	sda = 0;  
	delay_nop();								// sda low
	scl = 1;
	delay_nop();								// scl high	
	//Stop active
	sda = 1;
	delay_nop();								// sda high	
	scl = 0;
	delay_nop();								// scl low
}


//********************************************
//函数:void start_IIC()
//作用:命令IIC开始时的设置(Start Function)
//*********************************************
void start_IIC()
{
	sda = 1;	   								// sda high	
	delay_nop();	
	scl = 1;	  								// scl high	
	delay_nop();	
	sda = 0;									// sda low	
	delay_nop();	
	scl = 0;	 								// scl low
	delay_nop();	
}

//********************************************
//函数:void start_IIC()
//作用:命令IIC开始时的设置(Start Function)
//*********************************************
void stop_IIC()
{
 	scl = 0;
	delay_nop();								// scl low		
	sda = 0;
	delay_nop();								// sda low		
	scl = 1;
	delay_nop();								// scl high		
	sda = 1;
	delay_nop();								// sda high	
}

//********************************************
// 函数:void delay_nop()
// 作用:延时
// remarks:
// Machine cycle = 24x2 + 12x3 = 84
// Crystal Frequency = 20 MHz
// Delay Time: 4.2us
//********************************************
void delay_nop()
{
  //_nop_ ();
  //_nop_ ();
  //_nop_ ();
}



⌨️ 快捷键说明

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