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

📄 twihc2.c

📁 此程序是AVR的硬件I2C程序,也就是AVR的TWI程序,已调试完成
💻 C
字号:
    #include <iom88v.h> 
     #include <macros.h> 
	 //v2
     #define LCD_BG_OFF  PORTB |= BIT(PB5)
     typedef unsigned char         uint8; 
     typedef unsigned int          uint16; 
     /*
     typedef  union reccnt 
     { 
      uint16 rcnt; 
      uint8  rcntl[2]; 
     }LngToChar; 
     */
	 //******************************************    
   union _my_int 
   { 
      uint16  IntV; 
      uint8   i[2]; 
   };     
	 
    #define wr_24c256_add      0xA0 
    #define rd_24c256_add      0xA1 
	#define rd_372device_add   0x65 
    #define wr_372device_add   0x64 
    
    #define START 0x08   
    #define RE_START 0x10   
    #define MT_SLA_ACK 0x18   
    //#define MT_SLA_ACK 0x38   
    #define MT_SLA_NOACK 0x20   
    #define MT_DATA_ACK  0x28   
    #define MT_DATA_NOACK 0x30   
    #define MR_SLA_ACK  0x40   
    #define MR_SLA_NOACK 0x48   
    #define MR_DATA_ACK 0x50   
    #define MR_DATA_NOACK 0x58  
   
    #define Start()         (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))   
    #define Stop()          (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))   
    #define Wait()          {while(!(TWCR&(1<<TWINT)));}   
    #define TestAck()       (TWSR&0xf8)  
    #define SetAck()        (TWCR|=(1<<TWEA))   
    #define SetNoAck()      (TWCR&=~(1<<TWEA))   
    #define Twi()           (TWCR=(1<<TWINT)|(1<<TWEN))  
    #define Write8Bit(x)    {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}   
    
	void Init_TWI(void); 
	unsigned char TWI_WriteByte(uint8 Wdata,uint16 RomAddress);//O0
	unsigned char TWI_ReadByte (uint16 RomAddress); 
	extern  void  delay_nms(unsigned int time);
	extern  unsigned char B_372;
	//unsigned char B_256=0;
void Init_TWI(void) 
     {      
	 (PRR&=~(1<<PRTWI));
     TWBR=0x16;   //TWBR=0x16;TWBR=0x12;
     TWSR=00;     //设置TWI时钟50K     	 
     } 
//******************************************  
unsigned char TWI_WriteByte(uint8 Wdata,uint16 RomAddress)    
{       
 //unsigned char ACK_A=0;
     
     unsigned char *Pr; 
     union _my_int k; 
	 CLI(); //关闭所有中断
	 if(B_372==0)PORTD &= ~BIT(PD5);else PORTD |= BIT(PD5); //容许写数据}//
	 delay_nms(5);//16
     k.IntV=RomAddress; 
     Pr=&k.i[1]; //先写高位地址再写底位地址
     //PORTD &= ~BIT(PD5);//容许写数据
	 //CLI(); //关闭所有中断
     Start();//TWI启动 
     Wait(); 
     if(TestAck()!=START) return 1;//ACK 
     if(B_372==1){Write8Bit(wr_372device_add);}// 
     else        {Write8Bit(wr_24c256_add);} 
     //Write8Bit(wr_eepdevice_add);//写TWI从器件地址和写方式 
     Wait(); 
	 //ACK_A=TestAck();//HHHHH
     if(TestAck()!=MT_SLA_ACK) return 1;//ACK 
      
     //Pr--; 
	 if(B_372==0)//时钟
	 {
     Write8Bit(*Pr);//写24C256的ROM地址 h
     Wait(); 
     if(TestAck()!=MT_DATA_ACK) return 1;//ACK  0x28 
     Pr--; 
     Write8Bit(*Pr);//写24C256的ROM地址 l
	 }
	 else Write8Bit(RomAddress);	//存储器
     Wait(); 
     if(TestAck()!=MT_DATA_ACK) return 1;//ACK 
            
     Write8Bit(Wdata);//写数据到24C256的ROM 
     Wait(); 
     if(TestAck()!=MT_DATA_ACK) return 1;//ACK    
     Stop();//TWI停止 
     //delay_nms(10);//延时等EEPROM写完 
	 //delay_nms(5);//16
	 SEI();         //使能全局中断
	 PORTD |= BIT(PD5);//写保护 
     return 0; 
}  
//******************************************   
unsigned char TWI_ReadByte(uint16 RomAddress) 
{   
	  unsigned char temp; 
      unsigned char *P; 
      union _my_int k; 
	  CLI(); //关闭所有中断
	  //PORTD |= BIT(PD5);//写保护 
      k.IntV=RomAddress; 
      P=&k.i[1]; //先写高位地址再写底位地址
     
	  //CLI(); //关闭所有中断
      Start();//TWI启动 
      Wait(); 
      if (TestAck()!=START) return 0;//ACK      
	  if(B_372==1){Write8Bit(wr_372device_add);}// 
      else        {Write8Bit(wr_24c256_add);}// 
	  //if(B_372==1) {Write8Bit(rd_372device_add);}//写TWI从器件地址和写方式 
	  //else         {Write8Bit(rd_24c256_add);}//    写TWI从器件地址和写方式 
      //Write8Bit(wr_eepdevice_add);//写TWI从器件地址和写方式 
      Wait();  
      if (TestAck()!=MT_SLA_ACK) return 0;//ACK 
   
      //P--; 
	  if(B_372==0)//
	  {
      Write8Bit(*P);//写24C256的ROM地址 h
      Wait(); 
      if (TestAck()!=MT_DATA_ACK) return 0; 
      P--; 
      Write8Bit(*P);//写24C256的ROM地址 l
	  }
	  else Write8Bit(RomAddress);	//写372
      Wait(); 
      if (TestAck()!=MT_DATA_ACK) return 0; 
       
      Start();//TWI重新启动 
      Wait(); 
      if (TestAck()!=RE_START)  return 0; 
	  if(B_372==1) {Write8Bit(rd_372device_add);}//写TWI从器件地址和读方式 
	  else         {Write8Bit(rd_24c256_add);}//  写TWI从器件地址和读方式 
      //Write8Bit(rd_eepdevice_add);//写TWI从器件地址和读方式 
      Wait(); 
      if(TestAck()!=MR_SLA_ACK)  return 0;//ACK 
      Twi();//启动主TWI读方式 
      Wait(); 
      if(TestAck()!=MR_DATA_NOACK) return 0;//ACK    
       
      temp=TWDR;//读取TWI接收数据 
      Stop();//TWI停止 
	  SEI();         //使能全局中断
      return temp;  
}  
//////////////////////////////

⌨️ 快捷键说明

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