1. 程式人生 > >嵌入式I2C協議詳解

嵌入式I2C協議詳解

  1. static int mpc_read(struct mpc_i2c *i2c, int target,
  2. u8 * data, int length, int restart)
  3. {
  4. unsigned timeout = i2c->adap.timeout;
  5. int i;
  6. u32 flags = restart ? CCR_RSTA : 0;
  7. //以防萬一,保證I2C模組使能
  8. if (!restart)
  9. writeccr(i2c, CCR_MEN);
  10. //注意這裡,再次把CCR_MSTA置1,再觸發 START 
  11. writeccr(i2c, CCR_MIEN | CCR_MEN
     | CCR_MSTA | CCR_MTX | flags);
  12. //CPU傳送slave I2C addr和讀操作1
  13. writeb((target <</FONT><</FONT> 1) | 1, i2c->base + MPC_I2C_DR);
//等待Slave發ACK
  1. if (i2c_wait(i2c, timeout, 1) <</FONT> 0)
  2. return -1;
  3. if (length) {
  4. if (length == 1)
  5. writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA |
     CCR_TXAK);
  6. else //為什麼不置 TXAK
  7. writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_MSTA);
  8. readb(i2c->base + MPC_I2C_DR);
  9. }
  10. for (i = 0; i <</FONT> length; i++) {
  11. if (i2c_wait(i2c, timeout, 0) <</FONT> 0)
  12. return -1;
  13. //注意這裡TXAK置1,表示CPU每收到1byte資料後,會發送ACK
  14. if (i == length - 2) 
  15. writeccr(i2c, CCR_MIEN
     | CCR_MEN | CCR_MSTA | CCR_TXAK);
  16. //注意這裡CCR_MSTA [1->0] CPU會觸發STOP
  17. if (i == length - 1) 
  18. writeccr(i2c, CCR_MIEN | CCR_MEN | CCR_TXAK);
  19. data[i] = readb(i2c->base + MPC_I2C_DR);
  20. }
  21. return length;
  22. }

引言

I2S(InterIC Sound Bus)是飛利浦公司針對數字音訊裝置之間的音訊資料傳輸而制定的一種匯流排標準,採用沿獨立的導線傳輸時鐘與資料訊號的設計,通過分離資料和時鐘訊號,避免了時差誘發的失真。I2S匯流排簡單有效,可以有效提升輸出資料的質量,在各種嵌入式音訊系統中有廣泛應用。但是在嵌入式音訊系統設計中,並不是所有的MCU都支援I2S匯流排格式,再加上I2S還沒有統一的介面標準,不同的廠家生產的裝置介面也是五花八門,採用軟體模擬實現I2S匯流排可有效解決在不支援其的MCU和裝置之間通過I2S匯流排實現資料傳輸時出現的問題。

本文通過在乙太網數字語音廣播系統中軟體模擬I2S匯流排實現語音資料傳輸,給出了軟體模擬實現I2S匯流排的方法。

1 I2S匯流排規範

I2S為三線匯流排,3個訊號分別為:

① 序列時鐘SCK,也叫位時鐘(BCK)。即每傳送1位數字音訊資料,SCK上都有1個脈衝。SCK的頻率=2×取樣頻率×取樣位數。在資料傳輸過程中,I2S匯流排的傳送器接收器都可以作為系統的主機來提供系統的時鐘頻率。

<