|
#ifndef __TWI_H__
#define __TWI_H__
#define TWI_SLA_RW 0XA0
#define TWI_CHECK 1
#ifdef __TWI_C__
void twi_init(void);
#ifdef TWI_SLA_RW
uint8 TWI_WriteNByte(uint16 addr,uint8 *pdata, uint8 size);
uint8 TWI_WriteByte(uint16 addr ,uint8 data);
#else
uint8 TWI_WriteNByte(uint8 TWI_SLA_RW, uint16 addr ,uint8 *pdata, uint8 size);
uint8 TWI_WriteByte(uint8 TWI_SLA_RW, uint16 addr ,uint8 data);
#endif
#ifdef TWI_SLA_RW
uint8 TWI_ReadNByte(uint16 addr,uint8 *pdata, uint8 size) ;
uint8 TWI_ReadByte(uint16 addr, uint8 *pdata) ;
#else
uint8 TWI_ReadNByte(uint8 TWI_SLA_RW, uint16 addr, uint8 *pdata, uint8 size) ;
uint8 TWI_ReadByte(uint8 TWI_SLA_RW, uint16 addr, uint8 *pdata) ;
#endif
#endif //__TWI_C__
#ifndef __TWI_C__
extern void twi_init(void);
#ifdef TWI_SLA_RW
extern uint8 TWI_WriteNByte(uint16 addr,uint8 *pdata, uint8 size);
extern uint8 TWI_WriteByte(uint16 addr ,uint8 data);
#else
extern uint8 TWI_WriteNByte(uint8 TWI_SLA_RW, uint16 addr ,uint8 *pdata, uint8 size);
extern uint8 TWI_WriteByte(uint8 TWI_SLA_RW, uint16 addr ,uint8 data);
#endif
#ifdef TWI_SLA_RW
extern uint8 TWI_ReadNByte(uint16 addr,uint8 *pdata, uint8 size) ;
extern uint8 TWI_ReadByte(uint16 addr, uint8 *pdata) ;
#else
extern uint8 TWI_ReadNByte(uint8 TWI_SLA_RW, uint16 addr, uint8 *pdata, uint8 size) ;
extern uint8 TWI_ReadByte(uint8 TWI_SLA_RW, uint16 addr, uint8 *pdata) ;
#endif
#endif //__TWI_C__
#endif // __TWI_H__
#define __TWI_C__
#include "config.h"
#define F_SCL 100000
#if F_SCL*36>F_CPU
#define TWBR_INIT 10
#warning "比特率达不到F_SCL"
#else
#define TWBR_INIT ((F_CPU/F_SCL-16)/2)
#endif
#define TWI_START() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define TWI_RESTART() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define TWI_STATUS() (TWSR&0xf8)
#define TWI_LOADDATA(x) do{TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}while(0)
#define TWI_STOP() TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO)
#define TWI_WAIT() do{while(!(TWCR&(1<<TWINT)));}while(0)
void twi_init(void)
{
TWCR= 0X00;
TWBR= TWBR_INIT;
TWSR= 0;
TWCR= _BV(TWEN);
}
#define TWI_ReStart() TWI_Start()
uint8 TWI_Start(void)
{
TWI_START();
TWI_WAIT();
return TWI_STATUS();
}
void TWI_Stop()
{
TWI_STOP();
}
uint8 TWI_SendData(uint8 data)
{
TWI_LOADDATA(data);
TWI_WAIT();
return TWI_STATUS();
}
uint8 TWI_ReceiveData(uint8 *pdata,uint8 ack)
{
uint8 temp=_BV(TWINT)|_BV(TWEN);
if(ack)
{
temp|=_BV(TWEA);
}
TWCR=temp;
TWI_WAIT();
pdata[0]=TWDR;
return TWI_STATUS();
}
#if TWI_CHECK==1 //校验读写是否成功
/******************************************
TWI总线写1个字节
返回1:写成功
返回0:写失败
*******************************************/
#ifdef TWI_SLA_RW
uint8 TWI_WriteByte(uint16 addr ,uint8 data)
#else
uint8 TWI_WriteByte(uint8 TWI_SLA_RW, uint16 addr ,uint8 data)
#endif
{
if(TWI_Start()!=TW_START) return 0;
if(TWI_SendData(TWI_SLA_RW&0XFE)!=TW_MT_SLA_ACK) return 0;
if(TWI_SendData(addr>>8)!=TW_MT_DATA_ACK) return 0;
if(TWI_SendData(addr)!=TW_MT_DATA_ACK) return 0;
if(TWI_SendData(data)!=TW_MT_DATA_ACK) return 0;
TWI_Stop();
return 1;
}
/******************************************
TWI总线写N(N>=1)个字节
返回1:写成功
返回0:写失败
*******************************************/
#ifdef TWI_SLA_RW
uint8 TWI_WriteNByte(uint16 addr,uint8 *pdata, uint8 size)
#else
uint8 TWI_WriteNByte(uint8 TWI_SLAW, uint16 addr ,uint8 *pdata, uint8 size)
#endif
{ uint8 i;
if(TWI_Start()!=TW_START) return 0;
if(TWI_SendData(TWI_SLA_RW&0xFE)!=TW_MT_SLA_ACK) return 0;
if(TWI_SendData(addr>>8)!=TW_MT_DATA_ACK) return 0;
if(TWI_SendData(addr)!=TW_MT_DATA_ACK) return 0;
for(i=0;i<size;i++)
{
if(TWI_SendData(pdata)!=TW_MT_DATA_ACK) return 0;
}
TWI_Stop();
return 1;
}
/******************************************
TWI总线读1个字节
返回1:读成功
返回0:读失败
*******************************************/
#ifdef TWI_SLA_RW
uint8 TWI_ReadByte(uint16 addr, uint8 *pdata)
#else
uint8 TWI_ReadByte(uint8 TWI_SLAR, uint16 addr, uint8 *pdata)
#endif
{
if(TWI_Start()!=TW_START) return 0;
if(TWI_SendData(TWI_SLA_RW&0xFE)!=TW_MT_SLA_ACK) return 0;
if(TWI_SendData(addr>>8)!=TW_MT_DATA_ACK) return 0;
if(TWI_SendData(addr)!=TW_MT_DATA_ACK) return 0;
if(TWI_ReStart()!=TW_REP_START)return 0;
if(TWI_SendData(TWI_SLA_RW|0X01)!=TW_MR_SLA_ACK) return 0;
if(TWI_ReceiveData(&pdata[0],0)!=TW_MR_DATA_NACK) return 0;
TWI_Stop();
return 1;
}
/******************************************
TWI总线读N(N>=1)个字节
返回1:读成功
返回0:读失败
*******************************************/
#ifdef TWI_SLA_RW
uint8 TWI_ReadNByte(uint16 addr,uint8 *pdata, uint8 size)
#else
uint8 TWI_ReadNByte(uint8 TWI_SLAR, uint16 addr, uint8 *pdata, uint8 size)
#endif
{
uint8 i;
if(TWI_Start()!=TW_START) return 0;
if(TWI_SendData(TWI_SLA_RW&0XFE)!=TW_MT_SLA_ACK) return 0;
if(TWI_SendData(addr>>8)!=TW_MT_DATA_ACK) return 0;
if(TWI_SendData(addr)!=TW_MT_DATA_ACK) return 0;
if(TWI_ReStart()!=TW_REP_START)return 0;
if(TWI_SendData(TWI_SLA_RW|0X01)!=TW_MR_SLA_ACK) return 0;
for(i=0;i<size-1;i++)
{
if(TWI_ReceiveData(&pdata,1)!=TW_MR_DATA_ACK) return 0;
}
if(TWI_ReceiveData(&pdata,0)!=TW_MR_DATA_NACK) return 0;
TWI_Stop();
return 1;
}
#else //TWI_CHECK==0 不校验读写是否成功
/******************************************
TWI总线写1个字节
不校验读写是否成功
*******************************************/
#ifdef TWI_SLA_RW
uint8 TWI_WriteByte(uint16 addr ,uint8 data)
#else
uint8 TWI_WriteByte(uint8 TWI_SLA_RW, uint16 addr ,uint8 data)
#endif
{
TWI_Start();
TWI_SendData(TWI_SLA_RW&0XFE);
TWI_SendData(addr>>8);
TWI_SendData(addr);
TWI_SendData(data);
TWI_Stop();
return 1;
}
/******************************************
TWI总线写N(N>=1)个字节
不校验读写是否成功
*******************************************/
#ifdef TWI_SLA_RW
uint8 TWI_WriteNByte(uint16 addr,uint8 *pdata, uint8 size)
#else
uint8 TWI_WriteNByte(uint8 TWI_SLAW, uint16 addr ,uint8 *pdata, uint8 size)
#endif
{ uint8 i;
TWI_Start();
TWI_SendData(TWI_SLA_RW&0xFE);
TWI_SendData(addr>>8);
TWI_SendData(addr);
for(i=0;i<size;i++)
{
TWI_SendData(pdata);
}
TWI_Stop();
return 1;
}
/******************************************
TWI总线读1个字节
不校验读写是否成功
*******************************************/
#ifdef TWI_SLA_RW
uint8 TWI_ReadByte(uint16 addr, uint8 *pdata)
#else
uint8 TWI_ReadByte(uint8 TWI_SLAR, uint16 addr, uint8 *pdata)
#endif
{
TWI_Start();
TWI_SendData(TWI_SLA_RW&0xFE);
TWI_SendData(addr>>8);
TWI_SendData(addr);
TWI_ReStart();
TWI_SendData(TWI_SLA_RW|0X01);
TWI_ReceiveData(&pdata[0],0);
TWI_Stop();
return 1;
}
/******************************************
TWI总线读N(N>=1)个字节
不校验读写是否成功
*******************************************/
#ifdef TWI_SLA_RW
uint8 TWI_ReadNByte(uint16 addr,uint8 *pdata, uint8 size)
#else
uint8 TWI_ReadNByte(uint8 TWI_SLAR, uint16 addr, uint8 *pdata, uint8 size)
#endif
{
uint8 i;
TWI_Start();
TWI_SendData(TWI_SLA_RW&0XFE);
TWI_SendData(addr>>8);
TWI_SendData(addr);
TWI_ReStart();
TWI_SendData(TWI_SLA_RW|0X01);
for(i=0;i<size-1;i++)
{
TWI_ReceiveData(&pdata,1);
}
TWI_ReceiveData(&pdata,0);
TWI_Stop();
return 1;
}
#endif //TWI_CHECK==0 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|