?? i2c.h
字號:
#ifndef I2C_24C16_2003_10_27
#define I2C_24C16_2003_10_27
#include "USER.H"
sbit SCL=P1^2;
sbit SDA=P1^3;
sbit WP = P1^1; //寫保護, When 1: Enable
void I2C_Start(); // 開啟總線 (內部函數)
void I2C_Stop(); // 結束總線函數 (內部函數)
void I2C_Init(); // 初始化函數 (內部函數)
bit I2C_Clock(); // 發送或接收1Bit (內部函數)
void I2C_SendByte(uchar Data); // 發送一個字節(內部函數)
uchar I2C_ReceiveByte(); // 接收從器件傳來的數據(內部函數)
void I2C_Ack(bit a); // 發送應答信號 I2C_Ack(TRUE);
// 發送非應答信號I2C_Ack(FALSE);
bit I2C_Write(uchar Control, uchar Addr, uchar *Buffer,uchar n);
// 將n個字節的數據寫入/讀出, Control為控制字符, Addr為地址
bit I2C_Read(uchar Control, uchar Addr, uchar *Buffer, uchar n);
void Write24C16(uint Addr, uchar *Buffer, uchar n);
// 對AT24C16讀寫數據, Addr為16位地址 0x0000~0x07FF
void Read24C16(uint Addr, uchar *Buffer, uchar n);
bit I2cAck; // 應答標志位
void I2C_Start() // 開啟總線
{
Delay1us();
SCL=1; // 初始化高電平
Delay5us();
SDA=0; // 發送開始信號
Delay5us();
SCL=0; // 拉低時鐘信號,以鎖定總線
Delay5us();
}
void I2C_Stop() // 結束總線函數
{
SDA=0; // 發送結束條件的數據信號
Delay1us();
SCL=1; // 發送結束條件的時鐘信號
Delay5us();
SDA=1; // 發送I2C總線結束信號
Delay5us();
SCL=0; // 關閉總線
}
void I2C_Init() // 初始化函數
{
SCL=0;
Delay5us();
I2C_Stop();
}
bit I2C_Clock() // 用于發送1Bit(調用前要將數據送到SDA)
{ // 也可用于接收(接收時鐘上升3us后的數據)
bit Sample;
Delay2us();
SCL=1; // 拉高時鐘
Delay3us();
Sample=SDA; // 讀取數據線狀態
Delay2us();
SCL=0; // 恢復時鐘低電平
Delay5us();
return Sample;
}
void I2C_SendByte(uchar Data) // 發送一個字節
{
uchar i;
for(i=0; i<8; i++)
{
SDA=(bit)(Data&0x80);
I2C_Clock();
Data=Data<<1;
}
SDA=1;
I2cAck=!I2C_Clock();
}
uchar I2C_ReceiveByte() //接收從器件傳來的數據
{
uchar Data=0, i;
SDA=1;
for(i=0; i<8; i++)
{
Data=Data<<1;
if(I2C_Clock()) Data++;
}
return Data;
}
void I2C_Ack(bit a) // 發送應答信號 I2C_Ack(TRUE);
{ // 發送非應答信號 I2C_Ack(FALSE);
if(a==FALSE) SDA=1;
else SDA=0;
Delay3us();
SCL=1;
Delay5us();
SCL=0; // 清時鐘線,鉗住I2C總線以便繼續接收
Delay2us();
}
bit I2C_Write(uchar Control, uchar Addr, uchar *Buffer,uchar n)
{
// 將n個字節的數據寫入器件中, Control為控制字符(0xA0), Addr為地址
uchar i;
I2C_Init();
I2C_Start(); // 啟動總線
I2C_SendByte(Control); // 發控制字符
if(I2cAck==0)
return(0);
I2C_SendByte(Addr); // 發送器件地址
if(I2cAck==0)
return(0);
for(i=0;i<n;i++)
{
I2C_SendByte(*Buffer); // 發送數據
if(I2cAck==0)
return(0);
Buffer++;
}
I2C_Stop(); // 結束總線
return(1);
}
bit I2C_Read(uchar Control, uchar Addr, uchar *Buffer, uchar n)
{
// 從器件中讀出n個字節的數據到Buffer中, Control為控制字符(0xA0), Addr為地址
uchar i;
I2C_Init();
I2C_Start(); // 啟動總線
I2C_SendByte(Control); // 發控制字符
if(I2cAck==0)
return(0);
I2C_SendByte(Addr); // 發送器件地址
if(I2cAck==0)
return(0);
I2C_Start(); // 重新啟動總線
I2C_SendByte(Control|0x01);
if(I2cAck==0)
return(0);
for(i=0; i<n-1; i++)
{
*Buffer=I2C_ReceiveByte();// 接收數據
I2C_Ack(TRUE); // 發送應答信號
Buffer++;
}
*Buffer=I2C_ReceiveByte();
I2C_Ack(FALSE); // 發送非應答信號
I2C_Stop(); // 結束總線
return 1;
}
/*
// 對AT24C16寫數據, Addr為16位地址 0x0000~0x07FF
void Write24C16(uint Addr, uchar *Buffer, uchar n)
{
uchar h, l;
h = (Addr>>7)&0x0E;
l = Addr&0x00FF;
I2C_Write(0xA0|h, l, Buffer, n);
}
// 讀取AT24C16數據, Addr為16位地址 0x0000~0x07FF
void Read24C16(uint Addr, uchar *Buffer, uchar n)
{
uchar h, l;
h = (Addr>>7)&0x0E;
l = Addr&0x00FF;
I2C_Read(0xA0|h, l, Buffer, n);
}
*/
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -