基于GAL的I2C總線時(shí)序模擬
圖2中,撥碼開關(guān)K用以設(shè)定作為計(jì)算機(jī)外設(shè)的FI1256 MK2的地址,U1用于計(jì)算機(jī)訪問(wèn)外設(shè)時(shí)地址的譯碼,U2則用于實(shí)現(xiàn)用ISA總線的兩條數(shù)據(jù)線模擬I2C總線時(shí)序。下面給出兩片GAL的邏輯方程(以FAST-MAP格式書寫),并對(duì)照方程簡(jiǎn)要說(shuō)明電路所實(shí)現(xiàn)的功能。
通過(guò)以上方程可使U1完成地址的譯碼功能。當(dāng)ISA總線上出現(xiàn)的外設(shè)地址與撥碼開關(guān)設(shè)定的地址相匹配時(shí),在其地址有效輸出端ADDR上將得到高電平。由于GAL最多只能有8個(gè)或項(xiàng),所以方程中使用了ADD1和ADD2兩個(gè)中間運(yùn)算結(jié)果,他們被當(dāng)作反饋信號(hào)在GAL內(nèi)部重新引到輸入端。使用AEN信號(hào)是為了在DMA周期內(nèi)屏蔽總線上出現(xiàn)的地址。
U2的時(shí)鐘信號(hào)是由地址ADDR和外設(shè)寫信號(hào)IOW的引入是為了消除總線上出現(xiàn)訪問(wèn)內(nèi)存的信號(hào),同時(shí)利用其上升沿鎖存數(shù)據(jù)。SCL和SDA可分別用數(shù)據(jù)線D0和D1模擬。當(dāng)一個(gè)外設(shè)寫周期過(guò)后,D0和D1的數(shù)據(jù)將鎖存在SDA和SCL上,而在下一個(gè)對(duì)相同外設(shè)地址的外設(shè)寫周期到來(lái)之前是不變的。這就使得I2C總線的時(shí)序可以在D0和D1兩根數(shù)據(jù)線上通過(guò)間隔輸出數(shù)據(jù)的方式獲得。
通過(guò)分析圖1給出的數(shù)據(jù)傳輸格式,可以把傳送的數(shù)據(jù)流劃分為三種傳送狀態(tài),即傳送起始信號(hào)、傳送終止信號(hào)和傳送一個(gè)字節(jié)(后面帶一個(gè)應(yīng)答位)。不同的數(shù)據(jù)過(guò)程只是寫入的數(shù)據(jù)字節(jié)數(shù)目不同。只要模擬軟件能實(shí)現(xiàn)上述三種傳送狀態(tài),就可以模擬出任何的主控器寫操作過(guò)程。因此可以用下列子程序分別實(shí)現(xiàn)上述三種傳送狀態(tài)。
(1)字節(jié)傳送子程序
由于SCL和SDA是用D1和D0模擬的,所以,只要往設(shè)定的I/O地址傳送相應(yīng)的數(shù)據(jù)就可以模擬傳送不同的數(shù)據(jù)字節(jié)。為了保證數(shù)據(jù)的可靠傳輸,I2C總線規(guī)范對(duì)總線上的時(shí)序作了嚴(yán)格的規(guī)定。實(shí)驗(yàn)證明,ISA總線上信號(hào)的上升沿和下降沿都在10ns以內(nèi),完全可以滿足I2C總線對(duì)上升沿與下降沿的要求,所以不需考慮信號(hào)的上升與下降時(shí)間,而只需考慮信號(hào)的建立和保持所需的時(shí)間即可。
根據(jù)對(duì)I2C的定時(shí)要求,可以在SCL低電平的中點(diǎn)將信號(hào)進(jìn)行分割,并把一個(gè)字節(jié)數(shù)據(jù)分為8個(gè)比特來(lái)分別進(jìn)行傳送(傳送0和1分別用兩個(gè)子程序?qū)崿F(xiàn)),從而使SDA線上的數(shù)據(jù)變化總是處在SCL低電平的中點(diǎn)。圖3所示是傳送一比特?cái)?shù)據(jù)的定時(shí)時(shí)序圖。
由于在對(duì)FI1256 MK2的操作過(guò)程對(duì)實(shí)時(shí)性要求不是太高,所以可以使傳送一比特?cái)?shù)據(jù)的三個(gè)狀態(tài)都持續(xù)5.0μs,這樣,就可以滿足所有的定時(shí)要求。把圖3中的兩個(gè)定時(shí)圖進(jìn)行組合即可傳送任意的數(shù)據(jù)字節(jié)。在每個(gè)數(shù)據(jù)字節(jié)的8比特?cái)?shù)據(jù)后,都會(huì)在SCL上送出一個(gè)時(shí)鐘周期而讓SDA保持高電平,以使FI1256 MK2送出應(yīng)答信號(hào)。應(yīng)答信號(hào)定時(shí)圖與圖3(a)相同。
評(píng)論