|
#include <avr/io.h>
#include <avr/twi.h>
#include <avr/signal.h>
#define fosc 7372800
#define sla 0xa0
#define slav 0xa2
#define TW_WRITE 0
#define TW_READ 1
#define max 3
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
void Twi_Init( void )
{
TWBR = 0x20;//设置波特率
TWSR &= 0xfc;//设置预分频因子,则SCL频率为92160Hz
}
/*----------------------------------------------------------------------
功 能:将读出的时间数据的无关位屏蔽掉
说 明:hym8563时钟寄存器的有些无关位的状态是不定的,所以应该将无效位屏蔽掉
----------------------------------------------------------------------*/
void Datajust(void)
{
trdata[0]=trdata[0]&0x7f;
trdata[1]=trdata[1]&0x7f;
trdata[2]=trdata[2]&0x3f;
trdata[3]=trdata[3]&0x3f;
trdata[4]=trdata[4]&0x07;
trdata[5]=trdata[5]&0x1f;
trdata[6]=trdata[6]&0xff;
}
uchar FM24C256_Write( uint address,uchar write_data )
{
uchar twst,n=0x0,rv=0x1;
restart:
if(n++>=max)
goto error;
begin:
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送开始信号
while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
switch((twst = TW_STATUS))
{
case TW_REP_START://有可能出现
case TW_START:
break;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = sla | TW_WRITE;//发送SLA+W
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_SLA_ACK:
break;
case TW_MT_SLA_NACK://器件忙,有可能处于内部写周期
goto restart;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = address>>8;//传输地址高8位
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_DATA_ACK:
break;
case TW_MT_DATA_NACK:
goto quit;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = address;//传输地址低8位
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_DATA_ACK:
break;
case TW_MT_DATA_NACK:
goto quit;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = write_data;
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_DATA_ACK:
break;
default:
goto error;
}
quit:
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);//发送停止信号
return rv;
error:
rv=0x0;
goto quit;
}
uchar FM24C256_Read( uint address )
{
uchar twst,n=0x0,rv=0x1;
restart:
if(n++>=max)
goto error;
begin:
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送开始信号
while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
switch((twst = TW_STATUS))
{
case TW_REP_START://有可能出现
case TW_START:
break;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = sla | TW_WRITE;//发送SLA+W
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_SLA_ACK:
break;
case TW_MT_SLA_NACK://器件忙,有可能处于内部写周期
goto restart;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = address>>8;//传输地址高8位
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_DATA_ACK:
break;
case TW_MT_DATA_NACK:
goto quit;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = address;//传输地址低8位
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_DATA_ACK:
break;
case TW_MT_DATA_NACK:
goto quit;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送(重新)开始信号
while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
switch((twst = TW_STATUS))
{
case TW_REP_START://正确的状态
break;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = sla | TW_READ;//发送SLA+R
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MR_SLA_ACK:
break;
case TW_MR_SLA_NACK://器件忙,有可能处于内部写周期
goto restart;
case TW_MR_ARB_LOST:
goto begin;
default:
goto error;
}
TWCR = _BV(TWINT) | _BV(TWEN) ;//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MR_DATA_NACK:
rv = TWDR;
break;
default:
goto error;
}
quit:
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);//发送停止信号
return rv;
error:
rv=0x0;
goto quit;
}
uchar SetHym8563(uchar suba,uchar *s,uchar no )
{
uchar twst,i,n=0x0,rv=0x1;
restart:
if(n++>=max)
goto error;
begin:
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送开始信号
while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
switch((twst = TW_STATUS))
{
case TW_REP_START://有可能出现
case TW_START:
break;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = slav | TW_WRITE;//发送SLAV+W
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_SLA_ACK:
break;
case TW_MT_SLA_NACK://器件忙,有可能处于内部写周期
goto restart;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = suba | TW_WRITE;//发送SUBA+W
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_DATA_ACK:
break;
case TW_MT_DATA_NACK://器件忙,有可能处于内部写周期
goto restart;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
for(i=0;i<no;i++)
{
TWDR = *s | TW_WRITE;
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_DATA_ACK:
break;
case TW_MT_DATA_NACK://器件忙,有可能处于内部写周期
goto restart;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
s++;
}
quit:
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);//发送停止信号
return rv;
error:
rv=0x0;
goto quit;
}
uchar GetHym8563(uchar suba,uchar *s,uchar no)
{
uchar twst,i,n=0x0,rv=0x1;
restart:
if(n++>=max)
goto error;
begin:
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送开始信号
while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
switch((twst = TW_STATUS))
{
case TW_REP_START://有可能出现
case TW_START:
break;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = slav | TW_WRITE;//发送SLAV+W
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_SLA_ACK:
break;
case TW_MT_SLA_NACK://器件忙,有可能处于内部写周期
goto restart;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = suba | TW_WRITE;//发送SUBA+W
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MT_DATA_ACK:
break;
case TW_MT_DATA_NACK://器件忙,有可能处于内部写周期
goto restart;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN);//发送(重新)开始信号
while((TWCR & _BV(TWINT))==0x0);//等待发送完毕
switch((twst = TW_STATUS))
{
case TW_REP_START://正确的状态
break;
case TW_MT_ARB_LOST:
goto begin;
default:
goto error;
}
TWDR = slav | TW_READ;//发送SLAV+R
TWCR = _BV(TWINT) | _BV(TWEN);//清TWINT,开始传输
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MR_SLA_ACK:
break;
case TW_MR_SLA_NACK://器件忙,有可能处于内部写周期
goto restart;
case TW_MR_ARB_LOST:
goto begin;
default:
goto error;
}
for(i=0;i<no;i++)
{
if(i==(no-1))
{
TWCR = _BV(TWINT) | _BV(TWEN) ;//清TWINT,开始传输(无应答)
}
else
{
TWCR = _BV(TWINT) | _BV(TWEN) | _BV(TWEA) ;//清TWINT,开始传输(有应答)
}
while((TWCR & _BV(TWINT))==0x0);//等待传输完毕
switch((twst = TW_STATUS))
{
case TW_MR_DATA_NACK:
case TW_MR_DATA_ACK:
*s = TWDR;
s++;
break;
default:
goto error;
}
}
quit:
TWCR = _BV(TWINT) | _BV(TWSTO) | _BV(TWEN);//发送停止信号
return rv;
error:
rv=0x0;
goto quit;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|