?? i2c.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 + -