標題:
I2C總線讀取一個數據時,24c02和PCF8591的單片機程序為什么不一樣?
[打印本頁]
作者:
Cmz@
時間:
2020-6-4 17:31
標題:
I2C總線讀取一個數據時,24c02和PCF8591的單片機程序為什么不一樣?
函數功能: 接收一字節(jié)子程序
//-------------------------------------------------------------------
uchar IICreceiveByte(void)
{
uchar idata n=8; // 從SDA線上讀取一上數據字節(jié),共八位
uchar tdata=0;
while(n--)
{
SDA = 1;//這一句的作用是什么?
SCL = 1;
tdata =tdata<<1; //左移一位
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位為1,則數據的最后一位置1
else
tdata = tdata&0xfe; // 否則數據的最后一位置0
SCL = 0;
}
return(tdata);
}
這是PCF8591在i2c上讀取一個數據的函數,在每次while循環(huán)時為什么需要使SDA值為1,而且當scl為1時,此時SDA為1,那讀出來的每一位不都是1嗎?而如果把這一句注釋掉則A/D轉換結果全為0.
/***************************************************
函數功能:從AT24Cxx讀取數據
出口參數:x
***************************************************/
unsigned char ReadData()
// 從AT24Cxx移入數據到MCU
{
unsigned char i;
unsigned char x; //儲存從AT24Cxx中讀出的數據
for(i = 0; i < 8; i++)
{
SCL = 1; //SCL置為高電平
x<<=1; //將x中的各二進位向左移一位
x|=(unsigned char)SDA; //將SDA上的數據通過按位“或“運算存入x中
SCL = 0; //在SCL的下降沿讀出數據
}
return(x); //將讀取的數據返回
}
這是24c08從i2c上讀取一個數據的函數,在每次for循環(huán)開始,并沒有SDA=1;語句,這樣也能從24c08中正確讀取數據。同樣是讀取數據函數,不知道為什么有這個區(qū)別?
作者:
溫xyz
時間:
2020-6-4 21:40
SDA = 1;//這一句的作用是什么?這是主機把數據線拉高,等待24C02輸出數據。
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位為1,則數據的最后一位置1
else
tdata = tdata&0xfe; // 否則數據的最后一位置0
這個IF和ELSE才是讀取24C02數據。
作者:
Cmz@
時間:
2020-6-4 22:44
溫xyz 發(fā)表于 2020-6-4 21:40
SDA = 1;//這一句的作用是什么?這是主機把數據線拉高,等待24C02輸出數據。
if(SDA == 1)
tdata = tda ...
不是,上面那個函數是PCF8591進行A/D轉換時,從i2c總線上讀一個數據的函數。
作者:
vscos
時間:
2022-1-11 19:30
這得看兩個程序的情況,有些程序在其它的地方已經拉高了,所以在讀取的時候就不用在拉高了
作者:
188610329
時間:
2022-1-11 19:47
讀完一個字節(jié)會發(fā)ack,發(fā)ack時會sda=0,如果管殺不管埋,那么在下次讀的時候就要sda=1,反之,發(fā)完ack,有首尾,會sda=1,自然在收下一個字節(jié)就不需要sda=1了。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1