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