最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

IIC通訊時(shí)序詳解(下)

2022-04-13 10:18 作者:e小白官方  | 我要投稿

本文作者:陽(yáng)光,e小白網(wǎng)址:www.e-xiaobai.com

四、IIC數(shù)據(jù)有效性規(guī)定和傳輸格式

??? IIC信號(hào)在數(shù)據(jù)傳輸過(guò)程中,當(dāng)SCL=1高電平時(shí),數(shù)據(jù)線SDA必須保持穩(wěn)定狀態(tài),不允許有電平跳變,只有在時(shí)鐘線上的信號(hào)為低電平期間(SCL=0),數(shù)據(jù)線上的高電平或低電平狀態(tài)才允許變化。簡(jiǎn)而言之,SCL=1時(shí), 數(shù)據(jù)線SDA的任何電平變換會(huì)看做是總線的起始信號(hào)或者停止信號(hào),只有SCL=0時(shí),才允許SDA數(shù)據(jù)進(jìn)行電平轉(zhuǎn)換。如下圖所示

在IIC數(shù)據(jù)傳輸過(guò)程中,輸出到SDA線上的每個(gè)字節(jié)必須是8位,數(shù)據(jù)傳送時(shí),高位(MSB)在前,低位(LSB)在后,每次發(fā)送的字節(jié)數(shù)量不受限制,但是每一個(gè)被傳送的字節(jié)后面都必須跟隨一位應(yīng)答位(即一幀共有9位)。當(dāng)一個(gè)字節(jié)按數(shù)據(jù)位從高位到低位的順序傳輸完后,緊接著從設(shè)備將拉低SDA=0,回傳給主設(shè)備一個(gè)應(yīng)答位ACK, 此時(shí)才認(rèn)為一個(gè)字節(jié)真正的被傳輸完成 ;如果一段時(shí)間內(nèi)沒有收到從機(jī)的應(yīng)答信號(hào)(SDA=1),則認(rèn)為該數(shù)據(jù)接收不成功。如下圖


主機(jī)寫數(shù)據(jù)過(guò)程如下:
1.主機(jī)首先產(chǎn)生START信號(hào);
2.然后緊跟著發(fā)送一個(gè)從機(jī)地址,這個(gè)地址共有7位,緊接著的第8位是數(shù)據(jù)方向位(R/W),? 0表示主機(jī)發(fā)送數(shù)據(jù)(寫),1表示主機(jī)接收數(shù)據(jù)(讀);
3.主機(jī)發(fā)送地址時(shí),總線上的每個(gè)從機(jī)都將這7位地址碼與自己的地址進(jìn)行比較,若相同,則認(rèn)為自己正在被主機(jī)尋址,將自己確定為發(fā)送器和接收器;
4.這時(shí)候主機(jī)等待從機(jī)的應(yīng)答信號(hào)(A)
4.1當(dāng)主機(jī)收到應(yīng)答信號(hào)時(shí),發(fā)送要訪問(wèn)從機(jī)的那個(gè)地址, 繼續(xù)等待從機(jī)的應(yīng)答信號(hào);
4.2當(dāng)主機(jī)收到應(yīng)答信號(hào)時(shí),發(fā)送N個(gè)字節(jié)的數(shù)據(jù),繼續(xù)等待從機(jī)的N次應(yīng)答信號(hào);
4.3主機(jī)產(chǎn)生停止信號(hào),結(jié)束傳送過(guò)程。


主機(jī)發(fā)送數(shù)據(jù)程序表示如下:
//寫入一個(gè)字節(jié)
void Send_Byte(u8 dat)
{
?u8 i;
??? SCL=0;?????????????????? //拉低時(shí)鐘,開始傳輸數(shù)據(jù)
?for(i=0;i<8;i++)
?{
??if(dat&0x80)????????????? //將dat的8位從最高位依次寫入
??{
???SDA=1;?????????????? ?? //傳送1
??? }
??else
??{
???SDA=0;??????????????? ?//傳送0


? }
??delay_us(5);??????????? //這里延時(shí)可選2-10us,根據(jù)實(shí)際情況確定,不要省略
??SCL=1;????????????????? //SCL=1,保持SDA不變
??delay_us(5);???????????
??SCL=0;????????????????? //SCL=0,允許SDA跳變
??????? delay_us(5);????? //表示一個(gè)SCL時(shí)鐘周期傳送1位數(shù)據(jù)
??dat<<=1;??????????????? //下一位數(shù)據(jù)
? }
}
IIC主機(jī)發(fā)送一個(gè)字節(jié)程順序如下(以AT24C02為例)
void IIC_ WR_Byte(u8 dat,u8 mode)
{
?IIC_Start();??????????????? //啟動(dòng)信號(hào)
?Send_Byte(0xA0);?????????? //RW=0表示主機(jī)寫入,發(fā)送從機(jī)地址要根據(jù)實(shí)際器件確定
?IIC_WaitAck();????????????? //等待應(yīng)答
?Send_Byte(address);???????? //發(fā)送要寫入的字節(jié)地址(此處與0XA0不同)
?Send_Byte(dat);???????????? //發(fā)送數(shù)據(jù)
?delay_us(2);
??? IIC_WaitAck();??????????? //等待應(yīng)答,若是非應(yīng)答則結(jié)束發(fā)送數(shù)據(jù)
?IIC_Stop();???????????????? //完成發(fā)送
}

--------------------------------------------------------------------------------------------------------------

主機(jī)讀(接收)數(shù)據(jù)過(guò)程如下:
1.主機(jī)首先產(chǎn)生START信號(hào);
2.然后緊跟著發(fā)送一個(gè)從機(jī)地址,注意此時(shí)該地址的第8位為RW=0,表明是向從機(jī)寫命令;
3.這時(shí)候主機(jī)等待從機(jī)的應(yīng)答信號(hào)(ACK);
4.當(dāng)主機(jī)收到應(yīng)答信號(hào)后,發(fā)送要訪問(wèn)的從機(jī)地址,繼續(xù)等待從機(jī)的應(yīng)答信號(hào);
5.當(dāng)主機(jī)收到應(yīng)答信號(hào)后,主機(jī)要改變通信模式(主機(jī)由發(fā)送變?yōu)榻邮?,從機(jī)由接收變?yōu)榘l(fā)送);
5.1主機(jī)重新發(fā)送一個(gè)開始start信號(hào);
5.2然后緊跟著發(fā)送一個(gè)從機(jī)地址,注意此時(shí)該地址的第8位為RW=1,表明將主機(jī)設(shè)置成接收模式開始讀取數(shù)據(jù);
5.3主機(jī)等待從機(jī)的應(yīng)答信號(hào),當(dāng)主機(jī)收到應(yīng)答信號(hào)時(shí),就可以接收1個(gè)字節(jié)的數(shù)據(jù),當(dāng)接收完成后,主機(jī)發(fā)送非應(yīng)答信號(hào),表示不在接收數(shù)據(jù);
6.主機(jī)進(jìn)而產(chǎn)生停止信號(hào),結(jié)束傳送過(guò)程。程序表示如下:


//IIC主機(jī)接收一個(gè)字節(jié)
void IIC_Read_Byte(u8 ack)
{
?u8 i=0,receive=0;
??? IIC_SDA_IN();????????????????? //SDA設(shè)為輸入
?? ?for(i=0;i<8;i++)
?{
?????? SCL=0; delay_us(2);????????? //允許數(shù)據(jù)轉(zhuǎn)換
?????? SCL=1; delay_us(2);????????? //讀數(shù)據(jù)
?????? receive<<=1;???????????????? //讀下一位
?????? if(Read_Sda==1) receive++;



? delay_us(2);
}
if(!ack)? IIC_NAck();???????????????????????????? //發(fā)送非應(yīng)答
else??? IIC_Ack();????????????????????????????? //發(fā)送應(yīng)答
return? receive;
}
? }


?? 以讀取EEPROM AT24C02為例,讀取程序如下(僅參考):
u8 IIC_READ_AT24C02(u16 addr)
{
? u8 temp=0;
? IIC_Start();?????????????????????? //發(fā)首次啟始信號(hào)
? Send_Byte(0xA0);???????????????? //發(fā)送地址,D0=0表示寫入
? IIC_WaitAck();??????????????????? //等待應(yīng)答
? Send_Byte(data);???????????????? //發(fā)送數(shù)據(jù)(24C02數(shù)據(jù)低位地址)
? IIC_WaitAck();
? IIC_Start();?????????????????????? //再次發(fā)啟始信號(hào)
? Send_Byte(0xA1);???????????????? //發(fā)送地址,D0=1表示讀入數(shù)據(jù),與上面相反
? IIC_WaitAck();
? temp= IIC_Read_Byte(0);????????? //應(yīng)答
? IIC_Stop();????????????????????? //結(jié)束
? return temp;
}

------------------------------------------------------------------------------------------------------------
五、IIC尋址
??? 前面有說(shuō)到,啟始信號(hào)后必跟從機(jī)地址,那么從機(jī)地址如何確定?在IIC總線上,每個(gè)器件都有自己固定的地址,這地址是IC在出廠時(shí)就已經(jīng)設(shè)定好的,使用者只能按照手冊(cè)進(jìn)行配置。還是以AT24C02為例說(shuō)明。AT24C02為地址低位D3-D1,可以設(shè)為000-111共8個(gè)不同地址 ,高4位D7-D4=1010這是廠商固定地址,不能改變;D0位是讀寫控制位,0表示寫,1表示讀。如果硬件電路A0-A2這3個(gè)腳接地(000),按照前面數(shù)據(jù)格式規(guī)定,那么向AR24C02寫入時(shí),發(fā)送的地址碼為A0(10100000),如果要讀回?cái)?shù)據(jù)則發(fā)送的地址碼為A1(10100001)。
??? 還有些IC有發(fā)送命令和數(shù)據(jù)之分,因此在發(fā)送地址碼后,還要發(fā)送控制字標(biāo)識(shí)(D/C)位(通常0表示命令,1表示數(shù)據(jù)),總之從器件地址和控制字標(biāo)識(shí)要按IC手冊(cè)設(shè)定,否則會(huì)出現(xiàn)通訊錯(cuò)誤。

六、其它
??? IIC協(xié)議理論上可以接127個(gè)從機(jī)(8位地址去掉一個(gè)廣播位和0x00地址),實(shí)際上還受到總線電容的限制,IIC總線電容不能超過(guò)400pf,電容增大會(huì)導(dǎo)致數(shù)據(jù)和時(shí)鐘信號(hào)的跳變產(chǎn)生延時(shí)畸變,導(dǎo)致通訊不能正常進(jìn)行。在實(shí)際運(yùn)用中,發(fā)送數(shù)據(jù)后的延時(shí)(2-10us)要保留,有時(shí)會(huì)出現(xiàn)程序都沒變,換個(gè)場(chǎng)合就異常的情況,這時(shí)要重點(diǎn)注意延時(shí)是否合適。上拉電阻一定要加上,雖然有時(shí)候沒有加也能正常運(yùn)行,但是你不知道什么時(shí)候就不正常了。示例是用模擬IIC時(shí)序,STM32F103X支持硬件IIC,應(yīng)用起來(lái)比較簡(jiǎn)單,速度也比模擬的要快,只是IO口就沒有模擬的那么靈活,看情況而定。




IIC通訊時(shí)序詳解(下)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
岚皋县| 齐河县| 关岭| 绥芬河市| 施甸县| 黄陵县| 云龙县| 城口县| 汝南县| 怀化市| 全州县| 娄烦县| 莲花县| 驻马店市| 永顺县| 石棉县| 连云港市| 曲沃县| 临邑县| 中江县| 蓬莱市| 彰化县| 玉屏| 荥阳市| 邹城市| 平陆县| 寿宁县| 满洲里市| 南昌市| 本溪| 叶城县| 轮台县| 平湖市| 定安县| 株洲市| 兰西县| 大城县| 临洮县| 于田县| 来宾市| 双流县|