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

📄 i2c_soft.c

📁 I2C signal control by software
💻 C
字号:
#include "i2c_soft.h"
#include "global.h"
#include "lcd.h"
//unsigned temp_data[10];  // temp hide
void i2c_init_io()
{
    SDA_OUT;
    SCL_OUT;
}

void i2c_start()
{ 
  SET_SDA;  //SDA=1
  SET_SCL;  //SCL=1
  DELAY(DELAY_TIME);
  CLR_SDA;  //SDA=0
  DELAY(DELAY_TIME);
  CLR_SCL;
  DELAY(DELAY_TIME);  
}

void i2c_stop()
{   
  CLR_SDA;  //SDA=0
  SET_SCL;  //SCL=1
  DELAY(DELAY_TIME);
  SET_SDA; // SDA=1
  DELAY(DELAY_TIME);
}

void i2c_send_byte(unsigned data)
{    
  unsigned BitCounter=8; 
  do{  
       if(data&0x80)
           SET_SDA;  // SDA=1;
       else
           CLR_SDA;  // SDA=0;
       SET_SCL;      // SCL=1
       DELAY(DELAY_TIME);    
       CLR_SCL;      // SCL=0
       DELAY(DELAY_TIME);
       data<<=1; /*RLC*/
       BitCounter--;
     }while(BitCounter);
}

int i2c_check_ack()  //
{   
  unsigned  b;
  SDA_IN;  // set PB6 port is input mode
  SET_SCL;   //SCL=1
  DELAY(DELAY_TIME);
  b=READ_PORT;  
  DELAY(DELAY_TIME);
  CLR_SCL;   //SCL=0
  DELAY(DELAY_TIME);
  SDA_OUT;  // set PA5 port is output mode
  if (b&SDA) return 0;
  return 1;
}

unsigned i2c_read_byte()
{
  unsigned count=8,temp=0;
  SDA_IN;  // set PB6=SDA  port is input mode(SDA output mode)
  do {
      SET_SCL;
      temp<<=1;
      DELAY(DELAY_TIME);
      if (READ_PORT&SDA)  temp=temp|0x01;
      DELAY(DELAY_TIME);
      CLR_SCL;
      DELAY(DELAY_TIME);
      count--;
  }while (count);
  SDA_OUT;
  return temp;
}

void i2c_send_ack(){
	CLR_SDA;   //SDA=1
	CLR_SCL;   //SCL=1	
	DELAY(DELAY_TIME);
	SET_SCL;   //SCL=1						// SCL = 1
	DELAY(DELAY_TIME);
	CLR_SCL;   //SCL=1						// SCL = 0
	DELAY(DELAY_TIME);
}

void i2c_send_noack()
{	
//send a no ack bit
	SET_SDA;
	CLR_SCL;
	DELAY(DELAY_TIME);
	SET_SCL;
	DELAY(DELAY_TIME);
	CLR_SCL;
	DELAY(DELAY_TIME);
}

void i2c_send_data(unsigned chipaddr,unsigned dataaddr,unsigned datanum)
{
	unsigned i=0;
	i2c_start();
	i2c_send_byte(chipaddr);  // eprom address
	if(i2c_check_ack()){
		i2c_send_byte(dataaddr);     // data address 
		if(i2c_check_ack()){
			while (i<datanum){
//       	    	i2c_send_byte(temp_data[i++]); // temp hide
		        if (i2c_check_ack()==0) break;
          	}
		}	
	}
	i2c_stop();
	DELAY(10);
}

void i2c_read_data(unsigned chipaddr,unsigned dataaddr,unsigned datanum)
{
	unsigned i=0;
	i2c_start();
	i2c_send_byte(chipaddr);  // eprom address
	if(i2c_check_ack()){
		i2c_send_byte(dataaddr);     // data address 
		if(i2c_check_ack()){
			i2c_start();
			i2c_send_byte(chipaddr|0x01);
			if(i2c_check_ack()){
				while(i<datanum){			
//	    	    	temp_data[i++]=i2c_read_byte();   // temp hide
		        	if (i==datanum)  i2c_send_noack();
		        	else i2c_send_ack();
	    	     }
			}
		}
	}
	i2c_stop();
}

// time control part 
/*
extern unsigned long num[10];
extern unsigned min_value,hour_value;
void init_time()
{
	temp_data[0]=temp_data[1]=0;	
	i2c_send_data(PCF8563_ADDR,CON_REG0_ADD,2); // control reg equal 0
}

void write_time(){
	temp_data[0]=SEC_REG;
	temp_data[1]=min_value;
	temp_data[2]=hour_value;
	i2c_send_data(PCF8563_ADDR,SEC_REG_ADD,3);
}
void read_time(){
	int i;
	i2c_read_data(PCF8563_ADDR,SEC_REG_ADD,0x03);
	
	lcd_out_number(num[temp_data[0]&0x0f],8);
	lcd_out_number(num[(temp_data[0]&0x70)>>4],7);
	lcd_out_number(num[temp_data[1]&0x0f],6);
	lcd_out_number(num[(temp_data[1]&0x70)>>4],5);
	lcd_out_number(num[temp_data[2]&0x0f],4);
	lcd_out_number(num[(temp_data[2]&0x30)>>4],3);
	for(i=0;i<58;i++){
		DELAY(1000);
	}			
}
*/
// set TDA7313  8/13
extern unsigned TDA7313_REG[];
void SET_TDA7313()
{
    unsigned i=0,flag=0;
//    unsigned error=0;
    i2c_start();
    i2c_send_byte(TDA7313_ADDR);
	flag=i2c_check_ack();
    while ((flag==1) && (i<8))
    {  i2c_send_byte(TDA7313_REG[i]);
       flag=i2c_check_ack();
       i++;
      }
    i2c_stop();
  //  if (i<8 || flag==1)  error=1;
}

⌨️ 快捷键说明

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