?? i2c.c
字號:
#include "my_89x51.h"
extern void d1ms(unsigned int);
#define READMODE 0xa1
#define WRITEMODE 0xa0
/**--------------------------------------------------------------------------------
調用方式:void I2CStart(void) ﹫200 /07/0 4
函數說明:I2C啟始位
---------------------------------------------------------------------------------*/
void I2CStart()
{
EA = 0;
SCL = 0;
SDA = 1;
SCL = 1;
_nop_();
SDA = 0;
_nop_();
SCL = 0;
}
/**--------------------------------------------------------------------------------
調用方式:void I2CStop(void) ﹫200 /07/0 4
函數說明:I2C結束位
---------------------------------------------------------------------------------*/
void I2CStop()
{
SDA = 0;
SCL = 1;
_nop_();
SDA = 1;
EA = 1;
}
/**--------------------------------------------------------------------------------
調用方式:bit I2CAck(void) ﹫200 /07/0 4
函數說明:I2C用,等待從器件接收方的應答
返回1--正確
返回0--錯誤
---------------------------------------------------------------------------------*/
unsigned char WaitAck()
{
unsigned char data errtime = 255;//因故障接收方無ACK 超時值為255
while (SDA){
errtime--;
if (!errtime){
SCL = 0;
I2CStop();
return (0);
}
}
SCL = 0;
return (1);
}
/**--------------------------------------------------------------------------------
調用方式:void SendAck(void) ﹫200 /07/0 4
函數說明:I2C用,主器件為接收方,從器件為發送方時,應答信號。
---------------------------------------------------------------------------------*/
void SendAck()
{
SDA = 0;
SCL = 1;
SCL = 0;
SDA = 1;
}
/**--------------------------------------------------------------------------------
調用方式:void SendAck(void) ﹫200 /07/0 4
函數說明:I2C用,主器件為接收方,從器件為發送方時,非應答信號。
--------------------------------------------------------------------------------*/
void SendNotAck()
{
SDA = 1;
SCL = 1;
SCL = 0;
}
/**--------------------------------------------------------------------------------
調用方式:void I2CSend(unsigned char ch) ﹫200 /07/0 5
函數說明:I2C用,發送BYTE
---------------------------------------------------------------------------------*/
void I2CSendByte(unsigned char ch)
{
unsigned char data i;
for (i = 0; i < 8; i++){
ch <<= 1;
SDA = CY;
SCL=1;
somenop;
SCL = 0;
somenop;
}
SDA = 1;
SCL = 1;
}
/**--------------------------------------------------------------------------------
調用方式:unsigned char I2CReceive(void) ﹫200 /07/0 5
函數說明:I2C用,接收BYTE
---------------------------------------------------------------------------------*/
unsigned char I2CReceiveByte()
{
unsigned char data i = 8;
unsigned char data ddata = 0;
SDA = 1;
while (i--){
SCL = 1;
ddata <<= 1;
if (SDA)
ddata++;
SCL = 0;
}
return (ddata);
}
/******************
函數說明:讀取E2ROM
******************/
void i2c_read(unsigned char nadd, unsigned char nlen, unsigned char data *pdt)
{
I2CStart();
I2CSendByte(WRITEMODE);
_nop_();
WaitAck();
_nop_();
I2CSendByte(nadd);
WaitAck();
_nop_();
I2CStart();
I2CSendByte(READMODE);
WaitAck();
_nop_();
while(nlen > 0){
*pdt = I2CReceiveByte();
somenop;
if (nlen != 1)
SendAck();
nlen--;
pdt++;
}
SendNotAck();
I2CStop();
}
/******************
函數說明:寫E2ROM
******************/
void i2c_write(unsigned char nadd, unsigned char nlen, unsigned char data *pdt)
{
I2CStart();
I2CSendByte(WRITEMODE);
WaitAck();
I2CSendByte(nadd);
WaitAck();
while(nlen > 0){
I2CSendByte(*pdt);
WaitAck();
pdt++;
nlen--;
d1ms(50);
}
I2CStop();
d1ms(200);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -