Cortex-M3 (NXP LPC1788)之IIC控制器
I2C模塊可以工作在主發(fā)送、主接收、從發(fā)送、從接收四種工作模式。開發(fā)板上LPC1788工作在主發(fā)送模式時(shí)發(fā)送數(shù)據(jù)給總線上的外設(shè)。工作在主接收模式時(shí)接收總線上的外設(shè)數(shù)據(jù)。
本文引用地址:http://cafeforensic.com/article/201611/318455.htm主發(fā)送模式的數(shù)據(jù)格式
操作流程如下:
1,發(fā)送一個(gè)S起始條件。初始化控制位寄存器,清除STA、STO、SI,然后向I2C控制置位寄存器I2CONSET中置位STA位,一旦總線空閑,I2C邏輯會(huì)馬上測(cè)試I2C總線并產(chǎn)生一起始條件。如果起始條件得到總線應(yīng)答,中斷標(biāo)志SI會(huì)置位,通讀取I2C狀態(tài)寄存器I2STAT的值,如果為0x08表示可以進(jìn)入發(fā)送數(shù)據(jù)的操作。
2,第一個(gè)發(fā)送的字節(jié)包含接收設(shè)備的從機(jī)地址和數(shù)據(jù)方向位。方向位(R/W)設(shè)置成0,表示進(jìn)行些操作,將該字節(jié)寫入I2C數(shù)據(jù)寄存器I2CDAT進(jìn)行發(fā)送。發(fā)送成功后會(huì)產(chǎn)生一個(gè)應(yīng)答,并且SI再次置位,讀取I2STAT中的狀態(tài),如果是0x18表示得到正確的應(yīng)答,可以進(jìn)行數(shù)據(jù)的傳輸。寫入從機(jī)地址后,應(yīng)該清零起始條件中置位的STA位,并且SI位必須在串行傳輸繼續(xù)之前復(fù)位。
3,最后進(jìn)行數(shù)據(jù)的發(fā)送,每個(gè)數(shù)據(jù)發(fā)送完成都會(huì)有一個(gè)應(yīng)答,且SI置位,如果發(fā)送成功讀取的STAT的值為0x28。要注意的是在下一次串行傳輸前必須復(fù)位SI。
4,數(shù)據(jù)發(fā)送完成后,發(fā)送一個(gè)P停止條件。在I2CONSET中置位STO標(biāo)志,并且清除STA和SI標(biāo)志。
至此,主發(fā)送模式結(jié)束。
主接收模式數(shù)據(jù)格式
操作流程如下:
1,發(fā)送一個(gè)起始條件S。和主發(fā)送模式相同。
2,寫第一個(gè)字節(jié)數(shù)據(jù),操作過程和主發(fā)送相同,只需將方向位改成讀,并且正確的應(yīng)答標(biāo)志為0x40。
3,數(shù)據(jù)接收時(shí)需要注意的是,接收的最后一個(gè)字節(jié)總是非應(yīng)答,這樣主機(jī)就可以告訴從機(jī)讀序列已經(jīng)完成。如果接收到的應(yīng)答A,則I2CSTAT的值為0x50。接收到非答,則I2CSTAT的值為0x58,。應(yīng)答或者非應(yīng)答,通過設(shè)置SI位進(jìn)行控制。
4,在接收到非應(yīng)答的狀態(tài)標(biāo)志0x58后,發(fā)送一個(gè)停止條件。
我們可以單獨(dú)設(shè)置主發(fā)送和主接收,也可以再主接收或主發(fā)送數(shù)據(jù)傳輸結(jié)束后,選擇不發(fā)送停止條件P,而是發(fā)送重復(fù)起始條件,進(jìn)行主發(fā)送和主接收的切換。
主發(fā)送切換到主接收的數(shù)據(jù)格式
操作流程如下:
1,在主發(fā)送模式數(shù)據(jù)傳輸完成后,不發(fā)送停止條件。即上面介紹的主發(fā)送模式流程的第4步不執(zhí)行,而是改成重新發(fā)送一個(gè)起始標(biāo)志,置位STA。重復(fù)起始發(fā)送成功后返回 的狀態(tài)標(biāo)志位0x10。
2,切換成功后即可按主接收步驟中的第二步直接開始執(zhí)行。
LPC1788的主工作模式介紹完,具體的程序在下一篇文章再結(jié)合從設(shè)備給出代碼。
評(píng)論