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

📄 i2c.c

📁 本软件为tft型液晶显示器的驱动程序 可用于车载主机显示屏等
💻 C
字号:
#include <define.h>
#include <variable.h>

//TWCR
#define TWINT  7//中断标志,发送成功就会置位
#define TWEA   6
#define TWSTA  5
#define TWSTO  4
#define TWWC   3
#define TWEN   2
#define TWIE   0
//TWSR
#define TWS7   7
#define TWS6   6
#define TWS5   5
#define TWS4   4
#define TWS3   3
#define TWPS1  1
#define TWPS0  0

#define START        0x08
#define RESTART      0x10
#define MT_SLA_ACK   0x18
#define MT_SLA_NACK  0x20

#define MT_DAT_ACK   0x28
#define MT_DAT_NACK  0x30

#define MR_SLA_ACK   0x40
#define MR_SLA_NACK  0x48


#define MR_DAT_ACK   0x50
#define MR_DAT_NACK  0x58

void I2c_Init(void)
{
    TWCR=0x00;
    TWBR=80;//38;//0x12;
    TWSR=0x01;//0x02;
    TWCR=0x04;
}

void I2c_SendData(uchar device,uchar address,uchar c)//Test OK!
{
    uDelay(200);
    TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//Send Start
    while(!(TWCR&(1<<TWINT)));//waiting Start complete
    if((TWSR&0xF8)!=START)
        goto error;
      
    TWDR=device;
    TWCR=(1<<TWINT)|(1<<TWEN);//Send device
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MT_SLA_ACK)
        goto error;    
  
    TWDR=address;
    TWCR=(1<<TWINT)|(1<<TWEN);//Send slave
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MT_DAT_ACK)
        goto error;     
    
    TWDR=c;
    TWCR=(1<<TWINT)|(1<<TWEN);//Send data
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MT_DAT_ACK)
        goto error;   
error:   
    TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);//stop 
    uDelay(200);
}
/*
    noted:
          p[]包含了器件的子地址 address,
*/
void I2c_SendMData(uchar device,uchar *p,uchar n)//Test OK!
{
    uchar i;
    uDelay(200); 
    TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//Send Start
    while(!(TWCR&(1<<TWINT)));//waiting Start complete
    if((TWSR&0xF8)!=START)
        goto error;
    
    uDelay(200); 
    
    TWDR=device;
    TWCR=(1<<TWINT)|(1<<TWEN);//Send device
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MT_SLA_ACK)
        goto error;     
    
    for(i=0;i<n;i++)
       {
          TWDR=p[i];
          TWCR=(1<<TWINT)|(1<<TWEN);//Send data
          while(!(TWCR&(1<<TWINT)));//waiting complete
          if((TWSR&0xF8)!=MT_DAT_ACK)
              goto error;
          uDelay(50); 
        } 
error: 
    uDelay(200);  
    TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN);//stop 
    uDelay(200); 
}

uchar I2c_ReadData(uchar device,uchar address)//Test OK!
{
    uchar c;
    uDelay(200); 
    TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//Send Start
    while(!(TWCR&(1<<TWINT)));//waiting Start complete
    if((TWSR&0xF8)!=START)
        goto error;
    
    TWDR=device;
    TWCR=(1<<TWINT)|(1<<TWEN);//Send device
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MT_SLA_ACK)
        goto error;    
  
    TWDR=address;
    TWCR=(1<<TWINT)|(1<<TWEN);//Send slave
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MT_DAT_ACK)
        goto error;  
    
    TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);//Send repeate Start
    while(!(TWCR&(1<<TWINT)));//waiting Start complete
    if((TWSR&0xF8)!=RESTART)
        goto error;
    
    TWDR=device+1;
    TWCR=(1<<TWINT)|(1<<TWEN);//receive data
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MR_SLA_ACK)//接收到ACK
        goto error;
    
    TWSR&=0x07;    
    TWCR=(1<<TWINT)|(1<<TWEN);//receive data
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MR_DAT_NACK)//发送NACK
        goto error;
    
    c=TWDR;
error:
    
    //TWCR=(1<<TWINT)+(1<<TWSTO)+(1<<TWEN);//stop 
    TWCR=0x94;
    uDelay(200); 
    return c;
}

void I2c_ReadMData(uchar device,uchar address,uchar p[],uchar n)
{
    uchar i;
    TWCR=(1<<TWINT)+(1<<TWSTA)+(1<<TWEN);//Send Start
    while(!(TWCR&(1<<TWINT)));//waiting Start complete
    if((TWSR&0xF8)!=START)
        goto error;
    
    TWDR=device;
    TWCR=(1<<TWINT)+(1<<TWEN);//Send device
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MT_SLA_ACK)
        goto error;
  
    TWDR=address;
    TWCR=(1<<TWINT)+(1<<TWEN);//Send slave
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MT_DAT_ACK)
        goto error;
    
    TWCR=(1<<TWINT)+(1<<TWSTA)+(1<<TWEN);//Send repeate Start
    while(!(TWCR&(1<<TWINT)));//waiting Start complete
    if((TWSR&0xF8)!=RESTART)
        goto error;
    
    TWDR=device+1;
    TWCR=(1<<TWINT)+(1<<TWEN);//receive data
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MR_SLA_ACK)//接收到ACK
        goto error;
    
    for(i=0;i<n-1;i++)
     {    
       TWSR&=0x07;    
       TWCR=(1<<TWINT)+(1<<TWEN)+(1<<TWEA);//receive data
       while(!(TWCR&(1<<TWINT)));//waiting complete
       if((TWSR&0xF8)!=MR_DAT_ACK)//发送ACK
          goto error;    
       p[i]=TWDR;
      }
    TWSR&=0x07;    
    TWCR=(1<<TWINT)+(1<<TWEN);//receive data
    while(!(TWCR&(1<<TWINT)));//waiting complete
    if((TWSR&0xF8)!=MR_DAT_NACK)//发送NACK
         goto error;    
    p[i]=TWDR;
error:
    
    TWCR=(1<<TWINT)+(1<<TWSTO)+(1<<TWEN);//stop  
}

/* Read Time */
//DS1302
  /*
uchar RTC_ReadData(uchar address)
{
    uchar i,c;
    uchar add;
    add=address;
    add<<=1;
    add|=0x81;
    TDAT_Out;
    TCLK_Low;
    TRST_Low;
    TRST_High;
    for(i=0;i<8;i++)
      {
        TCLK_Low;
        NOP;NOP;        
        if(add&0x01)//Lst-->Mst
           TDAT_High;
        else 
           TDAT_Low;
        NOP;NOP;
        TCLK_High;
        NOP;NOP;       
        add>>=1;
       }
   TDAT_In;
   TDAT_High;
   c=0;
   for(i=0;i<8;i++)
     {
       c>>=1;
       TCLK_Low;//
       NOP;NOP;
       if(TDAT_Val)
          c|=0x80;
       else
          c&=0x7F;
       TCLK_High;
       NOP;NOP;
      }
   TRST_Low;
   TDAT_Out;
   TCLK_Low;
   return c;   
}

void RTC_SendData(uchar address,uchar data)
{
   uchar add;
   uchar i;
   add=address;
   add<<=1;
   add|=0x80;
  
   TCLK_Low;
   TRST_Low;
   TRST_High;//set Rst
   for(i=0;i<8;i++)
     {
       TCLK_Low;
       if(add&0x01)
          TDAT_High;
       else
          TDAT_Low;
       NOP;NOP;
       TCLK_High;
       NOP;NOP;
       add>>=1;
      }
   for(i=0;i<8;i++)
     {
       TCLK_Low;
       if(data&0x01)
          TDAT_High;
       else
          TDAT_Low;
       NOP;NOP;
       TCLK_High;
       data>>=1;
       NOP;NOP;
      }
   TRST_Low;
   TCLK_Low;
}

void RTC_Init(void)
{
   TCLK_Low;
   TRST_Low;   
}
*/
//PCF8563
uchar RTC_ReadData(uchar address)
{
   return I2c_ReadData(0xA2,address);
}


void RTC_SendData(uchar address,uchar data)
{
   I2c_SendData(0xA2,address,data);
}

void RTC_Init(void)
{
   RTC_SendData(0x00,0x00);
   RTC_SendData(0x01,0x01);
   RTC_SendData(0x0F,64);
   RTC_SendData(0x0E,0x81);
   RTC_SendData(0x03,0x00);
   RTC_SendData(0x04,0x09);
   RTC_SendData(0x05,0x21);
   RTC_SendData(0x07,0x03);
   RTC_SendData(0x08,0x07);
}

void RTC_ReadTime(uchar * Hour,uchar * Minute)//BCD
{
   
}
void RTC_ReadDat(uchar *year,uchar *month,uchar *data)
{
  
}

void RTC_SetTime(uchar hour,uchar minute)//BCD
{
   RTC_SendData(0x03,minute);
   RTC_SendData(0x04,hour);
}

void RTC_SetDat(uchar year,uchar month,uchar data)//BCD
{
   RTC_SendData(0x05,data);
   RTC_SendData(0x07,month);
   RTC_SendData(0x08,year);
}

⌨️ 快捷键说明

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