標(biāo)題:
I2C通訊軟件模擬 老是報(bào)錯(cuò)
[打印本頁(yè)]
作者:
李博文
時(shí)間:
2018-7-22 19:51
標(biāo)題:
I2C通訊軟件模擬 老是報(bào)錯(cuò)
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define AT24C02_ADDR 0xa0;
/*I2C IO口定義*/
sbit SDA = P2^0;
sbit SCL = P2^1;
/*5us延時(shí)*/
void delay_5us()
{
_nop_();
}
/*1ms延時(shí)*/
void delay(uint z)
{
uint x,y;
for(x = z; x > 0; x-- )
for(y = 114; y > 0; y-- )
;
}
/*I2C初始化*/
void I2C_init()
{
SCL = 1;
_nop_();
SDA = 1;
_nop_();
}
/*I2C開始信號(hào)*/
void I2C_Start()
{
SCL = 1;
_nop_();
SDA = 1;
delay_5us();
SDA = 0;
delay_5us();
}
/*I2C停止信號(hào)*/
void I2C_Stop()
{
SDA = 0;
_nop_();
SCL = 1;
delay_5us();
SDA = 1;
delay_5us();
}
/*主機(jī)發(fā)送應(yīng)答*/
void Master_ACK(bit i) //bit i 控制應(yīng)答或者非應(yīng)答
{
SCL = 0;
_nop_();
if(i)
{
SDA = 0;
}
else
{
SDA = 1;
}
_nop_();
SCL = 1;
delay_5us();
SCL = 0;
_nop_();
SDA = 1;
_nop_();
}
/*檢測(cè)從機(jī)應(yīng)答*/
bit Test_ACK()
{
SCL = 1;
delay_5us();
if(SDA)
{
SCL = 0;
_nop_();
I2C_Stop();
return(0);//從機(jī)無應(yīng)答返回0
}
else
{
SCL = 0;
_nop_();
return(1);//從機(jī)應(yīng)答返回1
}
}
/*發(fā)送一個(gè)字節(jié)*/
void I2C_send_byte(uchar byte)
{
uchar i;
for(i = 0; i < 8; i++)
{
SCL = 0;
_nop_();
if(byte & 0x80)//表達(dá)式成立 說明byte最高位為1
{
SDA = 1;
_nop_();
}
else
{
SDA = 0;
_nop_();
}
SCL = 1;
_nop_();
byte <<= 1;
}
SCL = 0;//拉低時(shí)鐘總線 允許從機(jī)的應(yīng)答信號(hào)
_nop_();
SDA = 1;//主機(jī)釋放數(shù)據(jù)總線 讓從機(jī)控制
_nop_();
}
/*接收一個(gè)字節(jié)*/
uchar I2C_read_byte()
{
uchar dat,i;
SCL = 0;//拉低時(shí)鐘總線 允許從機(jī)控制SDA
_nop_();
SDA = 1;//釋放數(shù)據(jù)總線
_nop_();
for (i = 0 ; i < 8 ; i++)
{
SCL = 1;//拉高時(shí)鐘總線 允許主機(jī)讀數(shù)據(jù)
_nop_();
if(SDA)
{
dat |= 0x01;
}
else
{
dat &= 0xfe;
}
_nop_();
SCL = 0;//允許主機(jī)發(fā)送應(yīng)答
_nop_();
if(i < 7)
{
dat =dat << 1;
}
}
return(dat);
}
/*I2C發(fā)送數(shù)據(jù)*/
bit I2C_TransmitData(uchar ADDR,DAT)
{
I2C_Start();
I2C_send_byte(AT24C02_ADDR+0);
if(!Test_ACK())
{
return(0);//停止傳送
}
I2C_send_byte(ADDR);
if(!Test_ACK())
{
return(0);//停止傳送
}
I2C_send_byte(DAT);
if(!Test_ACK())
{
return(0);//停止傳送
}
I2C_Stop();
return(1);//傳送完成
}
/*I2C接收數(shù)據(jù)*/
uchar I2C_ReceiveData(uchar ADDR)
{
uchar DAT;
I2C_Start();
I2C_send_byte(AT24C02_ADDR+0);
if(!Test_ACK())
{
return(0);//停止傳送
}
I2C_send_byte(ADDR);
if(!Test_ACK())
{
return(0);//停止傳送
}
Master_ACK(0); //主機(jī)非應(yīng)答
I2C_Start();
I2C_send_byte(AT24C02_ADDR+1);
if(!Test_ACK())
{
return(0);//停止傳送
}
DAT = I2C_read_byte();
Master_ACK(0);
I2C_Stop();
return(DAT);
}
void main()
{
I2C_init();
if(!I2c_TransmitDATA(255,0xfe))
{
P1 = 0;//數(shù)據(jù)傳送失敗
}
delay(5);
P1 = I2C_ReceiveData(255);
while(1);
}
復(fù)制代碼
作者:
wulin
時(shí)間:
2018-7-23 06:29
1. #define AT24C02_ADDR 0xa0; 多了一個(gè)分號(hào)。
2. bit I2C_TransmitData(uchar ADDR,DAT) 與 if(!I2c_TransmitDATA(255,0xfe)) 的函數(shù)名大小寫不一致。
作者:
李博文
時(shí)間:
2018-7-23 07:53
大佬 是怎么發(fā)現(xiàn)的 我怎么發(fā)現(xiàn)不了
作者:
609763691
時(shí)間:
2018-7-28 10:22
你的bit I2C_TransmitData(uchar ADDR,DAT)這個(gè)函數(shù)DAT不能直接寫,加了分號(hào)之后還需要加uchar,應(yīng)該寫成bit I2C_TransmitData(uchar ADDR,uchar DAT)
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1