i2c總線最早是由philips公司提出的串行通信接口規(guī)范,標準i2c總線只使用兩條線通信,能將多個具有i2c接口的設備連接,進行可靠的通信,連接到同一總線的i2c器件數(shù)量,只受總線最大電容400pf的限制,而且最高通信速率可以達到3.4mb/s,由于i2c接口簡單,使用方便,被很多芯片采用,成為一種廣泛應用的接口[1]。
dsp即數(shù)字信號處理器,是一種廣泛應用的嵌入式處理器,主要應用是實時快速地實現(xiàn)各種數(shù)字信號處理算法,目前,國際主要的dsp供應商是ti公司,其tms32系列產品占據(jù)了dsp市場近一半的份額,為了用戶能方便快捷的進行系統(tǒng)的開發(fā)與集成,ti公司在一些型號的dsp中集成了i2c通信模塊,本文以tms320c6713為例,使用ti公司dsp開發(fā)工具ccs2.2提供的csl(chip support lib,片級支持庫)配置i2c模塊。
圖像采集和處理是dsp應用的一個重要領域,本文結合作者開發(fā)的基于dsp的圖像采集、處理系統(tǒng)、以cmos圖像采集芯片ov7620為例,介紹dsp芯片通過i2c模塊對i2c設備進行配置的過程。
1 ti公司帶i2c接口的dsp
在嵌入式系統(tǒng)開發(fā)過程中,如果處理器沒有i2c接口而系統(tǒng)中又存在i2c器件時,通用的辦法是利用處理器的兩根引腳分別模擬sda和scl信號,并利用程序模擬接口,這種方法的通用性好,靈活可靠,但是移植性差,不同型號的處理器需要不同的程序,盡管在網上能夠下載到這類程序的源代碼,但是進行程序移植仍會浪費開發(fā)人員大量的時間,而且使得程序變得龐大,不易維護。
為了用戶能方便快捷地進行系統(tǒng)的開發(fā)與集成,ti公司在一些型號的dsp中集成了i2c通信模塊,例如tms320c6713、tms320c6416、tms320c5509等。
tms320c6713是一款高性能浮點dsp,內部集成2個i2c接口:i2c0和i2c1。其中,i2c1的引腳與mcbsp1(multichannel buffered serial port 1,多通道緩存串口1)的引腳復用,默認情況下是激活mcbsp1,使用i2c1必須將寄存器devcfg的最低位置1[2,3]。i2c模塊的結構如圖1所示。
i2cdxr是發(fā)送緩存,i2cxsr是發(fā)送移位寄存器??偩€上的數(shù)據(jù)送到i2cdxr之后,被拷貝到i2cxsr,按位移出,送到sda,先移出的位是最高位。i2cdrr與i2crsr分別是接收緩存和接收移位寄存器,負責將sda上的數(shù)據(jù)移入,合并成字節(jié)后,放到接收緩存,并將數(shù)據(jù)發(fā)送到數(shù)據(jù)總線。
i2c模塊有5種狀態(tài)會產生中斷信號,作為中斷源提供給dsp中斷系統(tǒng)調用,這5種狀態(tài)是:準確好發(fā)送數(shù)據(jù)、準確好接收數(shù)據(jù)、可以訪問寄存器、主機沒收到響應信號和總線仲裁失敗。因為i2c模塊能夠提供中斷信號,可以編制中斷處理函數(shù),中斷中相應i2c事件,確保了響應的實時性。
i2c模擬還可以與edma(enhanced direct memory access,增強型內存直接訪問)配合工作。當數(shù)據(jù)由i2cdxr拷貝到i2cxsr或由i2crsr拷貝到i2cdrr時,都會觸發(fā)edma操作,edma會發(fā)送下一個數(shù)據(jù)或讀取收到的數(shù)據(jù)。由于edma操作不占用dsp處理時間,可以大大提高dsp的運算速度,避免流水線被不停的打斷,因此,如果使用i2c模塊與外設進行數(shù)據(jù)量比較大的數(shù)據(jù)交換,比如,將緩存中的大量數(shù)據(jù)保存到i2c接口的flash中,可以使用edma操作,如果交換的數(shù)據(jù)量比較小,而對實時性比較高,比如,接收i2c接口傳感器的采集數(shù)據(jù),可以采用dsp中斷的方式;如果交換的數(shù)據(jù)量比較小,對實時性要求又不高,比如,對i2c設備進行設置,則可以使用dsp查詢狀態(tài)位的方式,本文例程使用i2c模塊配置ov7620,采用查詢方式。
為使i2c模塊正常工作,必須為其提供驅動時鐘,在tms320c6713中,i2c模塊的時鐘由系統(tǒng)時鐘經分頻得到,如圖2所示。
外接時鐘為dsp系統(tǒng)的外接時鐘,本文設計的系統(tǒng)時鐘頻率為25mhz,pll為系統(tǒng)的鎖相環(huán),先對外接時鐘分頻,再倍頻,鎖定時鐘,然后按照不同的分頻系數(shù),分出三個時鐘,供tms320c6713使用,其中的一個輸出到i2c模塊,i2c模塊先根據(jù)ipsc的值將時鐘預分頻,分頻后的時鐘供i2c模塊使用,同時,根據(jù)iccl與icch的值再將時鐘分頻,分別控制scl的低電平與高電平周期,scl的頻率為
在配置i2c模塊之前,必須配置pll。tms320c6713的i2c不支持高速模式,一般配置在標準模式下。
2 使用csl配置i2c模塊
對i2c模塊的控制是通過操作控制/狀態(tài)寄存器組實現(xiàn)的。tms320c6713的寄存器映射到地址空間,可以通過地址操作直接讀寫寄存器,如
#define i2cmdr0 0x01b40024
*(volatile