📄 i2c.c
字号:
#define _I2C_C_
#include <include.h>
// 发送STOP信号
void TwiStop(void)
{
TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN));
}
//---------------------
void TwiStart(void)
{
TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN));
while((TWCR & (1 << TWINT)) == 0)
{
;
}
}
//-------------------------------
uint8 TwiWriteByte(uint8 addr, uint8 data)
{
TwiStart(); // 发送开始信号
if((TWSR & 0xf8) == 0x08) // 确认状态
{
TWDR = addr; // 发送地址
//TWCR = (1 << TWINT) | (1 << TWEN); // 启动发送
TWCR = (1 << TWINT) | (1 << TWEN);
while((TWCR & (1 << TWINT)) == 0) // 等待发送成功
{
;
}
if((TWSR & 0xf8) == 0x18) // 确认状态
{
TWDR = data; // 发送数据
//TWCR = (1 << TWINT) | (1 << TWEN); // 启动发送
TWCR = (1 << TWINT) | (1 << TWEN);
while((TWCR & (1 << TWINT)) == 0) // 等待发送成功
{
;
}
}
else
{
return 0;
}
if((TWSR & 0xf8) == 0x28) // 确认状态
{
TwiStop(); // 发送停止信号
return 1;
}
else
{
return 0;
}
}
return 0;
// else
// (
// return 0;
// )
}
//-------------------------------------------------------
uint8 TwiWriteStr(uint8 addr, uint8 *data, uint8 len) // 地址指针自动加1
{
uint8 i = 0;
if(len != 0)
{
TwiStart(); // 发送开始信号
if((TWSR & 0xf8) == 0x08) // 确认状态
{
TWDR = addr; // 发送地址
//TWCR = (1 << TWINT) | (1 << TWEN); // 启动发送
TWCR = (1 << TWINT) | (1 << TWEN);
while((TWCR & (1 << TWINT)) == 0) // 等待发送成功
{
;
}
if((TWSR & 0xf8) == 0x18) // 确认状态
{
TWDR = *data++; // 发送数据
//TWCR = (1 << TWINT) | (1 << TWEN); // 启动发送
TWCR = (1 << TWINT) | (1 << TWEN);
while((TWCR & (1 << TWINT)) == 0) // 等待发送成功
{
;
}
}
else
{
return 0;
}
for(i = len-1; i > 0; i--)
{
if((TWSR & 0xf8) == 0x28) // 确认状态
{
TWDR = *data++; // 继续发送数据
//TWCR = (1 << TWINT) | (1 << TWEN);
TWCR = (1 << TWINT) | (1 << TWEN);
while((TWCR & (1 << TWINT)) == 0)
{
;
}
}
else
{
return 0;
}
}
if((TWSR & 0xf8) == 0x28) // 确认状态
{
TwiStop(); // 发送停止信号
return 1;
}
else
{
return 0;
}
}
//else
//(
return 0;
//)
}
return 0;
}
//---------------------------------
uint8 TwiReadStr(uint8 addr, uint8 *data, uint8 len) // 地址指针自动加1
{
uint8 i = 0;
if(len != 0)
{
TwiStart(); // 发送开始信号
if((TWSR & 0xf8) == 0x08) // 确认状态
{
TWDR = addr; // 发送地址
TWCR = (1 << TWINT) | (1 << TWEN); // 启动发送
while((TWCR & (1 << TWINT)) == 0) // 等待发送成功
{
;
}
if((TWSR & 0xf8) == 0x40) // 确认状态
{
for(i = len-1; i > 0; i--)
{
TWCR = (1 << TWINT) | (1 << TWEA) | (1 << TWEN); // 启动发送 返回 ACK
while((TWCR & (1 << TWINT)) == 0) // 等待发送成功
{
;
}
if((TWSR & 0xf8) == 0x50) // 确认状态
{
*data++ = TWDR; // 继续接收数据
}
else
{
return 0;
}
}
}
else
{
return 0;
}
//TWCR = (1 << TWINT) | (1 << TWEN); // 返回 NOT ACK
TWCR = (1 << TWINT) | (1 << TWEN);
if((TWSR & 0xf8) == 0x58) // 确认状态
{
TwiStop(); // 发送停止信号
return 1;
}
else
{
return 0;
}
}
//else
//(
return 0;
//)
}
return 0;
}
/*/----------------------------------
void RtcInit()
{
TWBR=73;
}
//----------------------------------
uint8 RtcWrite(uint8 addr, uint8 *buf, uint8 len)
{
uint8 DS1307_ADDR = addr;
uint8 *data = buf;
uint8 lenn = len;
uint8 temp;
temp = TwiWriteStr(DS1307_ADDR, data, lenn);
return temp;
}
//----------------------------------
uint8 RtcRead(uint8 addr, uint8 *buf,uint8 len)
{
uint8 i;
RtcWrite(addr,0,0);
delay_ms(10);
TwiStART();
TwiWriteByte(DS1307_ADDR|RTC_READ);
for(i=0;i<len-1;i++)
{
TwiReadByte(buf+i,TWI_ACK);
}
TwiReadByte(buf+i,TWI_NACK);
TwiStop();
return 0;
}
//----------------------------------
uint8 RtcUpdate(uint8_t direction)
{
uint8 i;
if(direction)
i=RtcRead(0, TimeBuf,7);
else
i=RtcWrite(0, TimeBuf,7);
return i;
}
//----------------------------------
uint8 RtcReadRam(uint8_t addr, uint8_t *buf,uint8_t len)
{
addr+=8;
return RtcRead(addr, buf,len);
}
//----------------------------------
uint8 RtcWriteRam(uint8_t addr, uint8_t *buf,uint8_t len)
{
addr+=8;
return RtcWrite(addr, buf,len);
}
//-----------------------------------
uint8 BinToBcd(uint8_t bin)
{
uint8 i;
bin&=0x7f;
bin%=100;
i=bin/10;
i<<=4;
i|=bin%10;
return i;
}
//-----------------------------------
uint8 BcdToBin(uint8_t bcd)
{
uint8 i;
i=bcd&0x0f;
i+=(bcd>>4)*10;
return i;
}
//---------------------------
void RtcBinToBcd()
{
uint8 i;
TimeBinBuf[0]&=0X7F;
TimeBinBuf[1]&=0X7F;
TimeBinBuf[2]&=0X3F;
TimeBinBuf[3]&=0X07;
TimeBinBuf[4]&=0X3F;
TimeBinBuf[5]&=0X1F;
TimeBinBuf[6]&=0XFF;
for(i=0;i<7;i++) TimeBuf[i]=BinToBcd(TimeBinBuf[i]);
}
//----------------------------
void RtcBcdToBin()
{
uint8 i;
for(i=0;i<7;i++) TimeBinBuf[i]=BcdToBin(TimeBuf[i]);
}
//----??????
void ReadSysTime()
{
RtcUpdate(RTC_READ);
RtcBcdToBin();
SysTimeBuf[0]=TimeBinBuf[6];//?
SysTimeBuf[1]=TimeBinBuf[5];//?
SysTimeBuf[2]=TimeBinBuf[4];//?
SysTimeBuf[3]=TimeBinBuf[2];//?
SysTimeBuf[4]=TimeBinBuf[1];//?
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -