您好,登錄后才能下訂單哦!
這篇文章主要介紹了STM32 IIC是什么意思,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
IIC 即Inter-Integrated Circuit(集成電路總線),這種總線類型是由飛利浦半導體公司(后被NXP收購)在八十年代初設計出來的一種簡單、雙向、二線制、同步串行總線,主要是用來連接整體電路(ICS) ,IIC是一種多向控制總線,也就是說多個芯片可以連接到同一總線結構下,同時每個芯片都可以作為實時數據傳輸的控制源。多主多從的通訊協議。
下文將結合NXP官方的IIC手冊講解IIC協議。下載鏈接見文末。
I2C串行總線一般有兩根信號線,一根是雙向的數據線SDA,另一根是時鐘線SCL。所有接到I2C總線設備上的串行數據SDA都接到總線的SDA上,各設備的時鐘線SCL接到總線的SCL上。速率最高400Kbit/s。
起始條件:SCL線是高電平時,SDA線從高電平向低電平切換。
停止條件:SCL線是高電平時,SDA線從低電平向高電平切換。
代碼實現
void I2C_Start(void) { //IO輸出 SDA_OUT(); SCL_OUT(); I2C_DELAY(); //IO置高 SDA_SET(); SCL_SET(); //延時 I2C_DELAY(); //為低 SDA_CLR(); I2C_DELAY(); I2C_DELAY(); SCL_CLR(); }
結束信號時類似的方式(不是動圖)
代碼實現
void I2C_Stop(void) { //IO輸出 SDA_OUT(); SCL_OUT(); //IO置0 SDA_CLR(); SCL_CLR(); I2C_DELAY(); SCL_SET(); //延時 I2C_DELAY(); I2C_DELAY(); I2C_DELAY(); //SDA置1 SDA_SET(); I2C_DELAY(); I2C_DELAY(); }
SDA數據線上的每個字節必須是8位,每次傳輸的字節數量沒有限制。每個字節后必須跟一個響應位(ACK)。首先傳輸的數據是最高位(MSB),SDA上的數據必須在SCL高電平周期時保持穩定,數據的高低電平翻轉變化發生在SCL低電平時期。
每一個字節后面跟著一個ACK,有ACK就可以繼續寫或讀。NACK,就停止
ACK:主機釋放總線,傳輸完字節最后1位后的SCL的高電處,從機拉低電平。
NACK:主機釋放總線,傳輸完字節最后1位后的SCL的高電處,從機無響應,總線為高電平。
動畫描述寫入的過程
代碼實現
uint8_t I2C_Send_byte(uint8_t data) { uint8_t k; //發送8bit數據 for(k=0;k<8;k++){ I2C_DELAY(); if(data&0x80){ SDA_SET(); } else{ SDA_CLR(); } data=data<<1; I2C_DELAY(); SCL_SET(); I2C_DELAY(); I2C_DELAY(); SCL_CLR(); } //延時讀取ACK響應 I2C_DELAY(); SDA_SET(); //置為輸入線 SDA_IN(); I2C_DELAY(); SCL_SET(); I2C_DELAY(); //這里出現了問題,延時變的無限大 //讀數據 k=SDA_READ(); if(k){ NACK響應 return 0; } I2C_DELAY(); SCL_CLR(); I2C_DELAY(); SDA_OUT(); if(k){ NACK響應 return 0; } return 1; } uint8_t I2C_Receive_byte(uint8_t flg) { uint8_t k,data; //接收8bit數據 //置為輸入線 SDA_IN(); data=0; for(k=0;k<8;k++){ I2C_DELAY(); SCL_SET(); I2C_DELAY(); //讀數據 data=data |SDA_READ(); data=data<<1; I2C_DELAY(); SCL_CLR(); I2C_DELAY(); } data=data>>1; //往回移動1次 //返回ACK響應 //置為輸出線 SDA_OUT(); if(flg){ SDA_SET(); //輸出1-NACK }else{ SDA_CLR();//輸出0-ACK } I2C_DELAY(); SCL_SET(); I2C_DELAY(); I2C_DELAY(); SCL_CLR(); I2C_DELAY(); SDA_OUT(); //返回讀取的數據 return (uint8_t)data; }
這里只說7位地址,前7位為地址,最后一位為讀寫位,1表示讀操作,0表示寫操作
主機立即讀從機數據,從第一個字節
通信頻率由主機掌控,也就是代碼中的延時函數決定的
從上面,我們得知最高速為400Kbit/s。我們設計300Kbit/s。
速率300Kbit/s,對應周期1/300ms=10/3us≈3us,4分頻就是3/4us。
我們使用的延時是,1/120MHZ*3*30 =3/4us
也就是頻率是300Kbit/s
和SPI類似,時鐘下降沿時,數據轉換,時鐘上升沿時,采樣數據。也就是時鐘高電平數據有效。
/*120Mhz時鐘時,當ulCount為1時,函數耗時3個時鐘,延時=3*1/120us=1/40us*/ /* SystemCoreClock=120000000 us級延時,延時n微秒 SysCtlDelay(n*(SystemCoreClock/3000000)); ms級延時,延時n毫秒 SysCtlDelay(n*(SystemCoreClock/3000)); m級延時,延時n秒 SysCtlDelay(n*(SystemCoreClock/3)); */ #if defined (__CC_ARM) /*!< ARM Compiler */ __asm void SysCtlDelay(unsigned long ulCount) { subs r0, #1; bne SysCtlDelay; bx lr; } #elif defined ( __ICCARM__ ) /*!< IAR Compiler */ void SysCtlDelay(unsigned long ulCount) { __asm(" subs r0, #1\n" " bne.n SysCtlDelay\n" " bx lr"); } #elif defined (__GNUC__) /*!< GNU Compiler */ void __attribute__((naked)) SysCtlDelay(unsigned long ulCount) { __asm(" subs r0, #1\n" " bne SysCtlDelay\n" " bx lr"); } #elif defined (__TASKING__) /*!< TASKING Compiler */ /*無*/ #endif /* __CC_ARM */ /* * @brief SysCtlDelay * @param ulCount 延時值,必須大于0 * @retval None */ void SysCtlDelay_IIC(unsigned long ulCount) { SysCtlDelay(ulCount); } /定義時鐘頻率,300KHz #define I2C_DELAY() SysCtlDelay_IIC(30)
感謝你能夠認真閱讀完這篇文章,希望小編分享的“STM32 IIC是什么意思”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。