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

📄 i2c.txt

📁 在DSP上实现I2C的时序
💻 TXT
字号:

//EEPROM   start
void EEP_start(void)
{
    *pdddr|=0x0030;    	//SDA,SCL为输出方式
	delly(50);
	asm(nop);
    *pddr|=EEP_SDA;
	delly(50);
	asm(nop);
   	*pddr|=EEP_SCL;
	delly(50);
	asm(nop);
    *pddr&=~EEP_SDA;
	delly(50);
	asm(nop);
    *pddr&=~EEP_SCL;
	delly(50);
	asm(nop);
 
   }
//EEPROM   stop 
void EEP_stop(void)
{
	delly(50);
	asm(nop);
	*pddr&=~EEP_SDA;
	delly(50);
	asm(nop);
    *pddr|=EEP_SCL;
    delly(50);
	asm(nop);
    *pddr&=~EEP_SDA;
	delly(50);
	asm(nop);
    *pddr|=EEP_SDA;
	delly(50);
	asm(nop);
	*pddr&=~EEP_SCL;
	delly(50);
	asm(nop);
}
//EEPROM   ack 
byte EEP_ack(void)
{
byte return_val;
    delly(50);
	asm(nop);
   *pdddr&=~EEP_SDA;           //GPIOD方向寄存器 0--输入
	delly(50);
	asm(nop);
	*pddr|=EEP_SCL;
    delly(50);
	asm(nop);
return_val=*pddr&EEP_SDA;
	asm(nop);
    *pddr&=~EEP_SCL;
	asm(nop);
	delly(50);
*pdddr|=EEP_SDA;               //GPIOD方向寄存器 1--输出
   delly(50);
   asm(nop);
    return return_val;
    
}

//向EEPROM送命令、数据
//输入:data
void EEP_send_byte(byte data)
{
word i;
    for(i=0;i<8;i++){
       delly(50);
	   asm(nop);
  		if(data & 0x80) {
			*pddr|=EEP_SDA;
		}
		else{
			*pddr&=~EEP_SDA;
		}
	   delly(50);
	   asm(nop);
       *pddr|=EEP_SCL;
	   delly(50);
	   asm(nop);
       *pddr&=~EEP_SCL;
	   delly(50);
	   asm(nop);
       data<<=1;
	   asm(nop);
  	}
} 
//向EEPROM送入0,应答eeprom读出数据
void EEP_send_bit0(void)
{
       *pddr&=~EEP_SDA;
	   delly(50);
	   asm(nop);
       *pddr|=EEP_SCL;
	   delly(50);
	   asm(nop);
       *pddr&=~EEP_SCL;
	   delly(50);
	   asm(nop);
} 
//从EEPROM取1BYTE数据
//输入:data
byte EEP_rec_byte(void)
{
word i;
byte EEPdata;
	EEPdata=0;
    delly(50);
	asm(nop);
    *pdddr&=~EEP_SDA;               //GPIOD方向寄存器 0--输入
    delly(50);
	asm(nop);
    *pddr|=EEP_SDA;
    delly(50);
	asm(nop);
    for(i=0;i<8;i++){
       EEPdata<<=1;
       delly(50);
	   asm(nop);
       *pddr|=EEP_SCL;
	   delly(50);
	   asm(nop);
	   if(*pddr & EEP_SDA)EEPdata++;
	   delly(50);
	   asm(nop);
	   *pddr&=~EEP_SCL;
	   asm(nop);
	}
    *pdddr|=EEP_SDA;               //GPIOD方向寄存器 1--输出
	asm(nop);
	return EEPdata;
} 

//写串行eeprom数据串写
//输入:E_data--要写数据的指针,num--要写数据的个数,EW_point--页数
//输出:
word write_eeprom(word *E_data,word num,word EW_point)
{
word i;
word E_add;
    delay_eeprom=0;
	E_add=EW_point*32;			
   		EEP_start();
		EEP_send_byte(0xa0);
		EEP_ack();
		EEP_send_byte(E_add/256);
		EEP_ack();
		EEP_send_byte(E_add%256);
		EEP_ack();
	 for(i=0;i<num;i++){
		EEP_send_byte(E_data[i]);
		delly(50);
		asm(nop);
		EEP_ack();
	}
	EEP_stop();
	return 0;
}

//读串行eeprom数据
//输入:num--要读数据的个数,ER_point--页数
//输出:E_rd_data--读出的数据
word read_63_eeprom(word num,word ER_point)
{
word i;
word E_add;
    E_add=ER_point*32;
    for(i=0;i<32;i++){
    	E_rd_data[i]=0;
    	}
    	EEP_start();
		EEP_send_byte(0xa0);
		EEP_ack();
		EEP_send_byte(E_add/256);
	    EEP_ack();
		EEP_send_byte(E_add%256);
		EEP_ack();
		EEP_start();
		EEP_send_byte(0xa1);
		EEP_ack();
	  for(i=0;i<num-1;i++){
		E_rd_data[i]=EEP_rec_byte();
		delly(50);
		asm(nop);
		EEP_send_bit0();
		asm(nop);
		delly(50);
	  }
	    E_rd_data[num-1]=EEP_rec_byte();
		EEP_stop();
		return 0;
}

⌨️ 快捷键说明

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