1. 程式人生 > >STM32硬體IIC操作 (轉)

STM32硬體IIC操作 (轉)

轉自:http://blog.csdn.net/dengrengong/article/details/39831577 

Stm32具有IIC介面,介面有以下主要特性

多主機功能:該模組既可做主裝置也可做從裝置

主裝置功能

C地址檢測

產生和檢測7/10位地址和廣播呼叫

支援不同的通訊速度

狀態標誌:

傳送器/接收器模式標誌

位元組傳送結束標誌

匯流排忙標誌

錯誤標誌

2箇中斷向量

可選的拉長時鐘功能

具單位元組緩衝器的DMA

雖然很多人說STM的硬體IIC不好用,但是對於這麼一個裝置去探索一下還是很有必要的,指不定哪天就用上了呢,

IIC藉口一共有九個暫存器,比較重要的幾個暫存器分別如下

1.       CR1


由這幾個位我們可以正常產生標準IICSTART條件STOP條件,ACKNOACK

CR2


控制IIC的通行頻率

這兩位檢測IIC匯流排是否收到資料


1.       對於硬體IIC的初始化流程包括

1.       配置IO,配置為GPIO_Mode_AF_OD模式

2.       選擇IIC模式

3.       選擇是否使能自動應答以及裝置地址長度

4.       設定IIC匯流排的傳輸速率

2.       硬體IIC的讀寫操作其實邏輯上和標準匯流排類似,也是傳送地址等待ack傳送資料等待ACK,但是因為有硬體的自動參與

,所以我們不需要延時了

具體程式碼如下

  1. void HmcIICInit(void)  
  2. {  
  3.     /*GPIO初始化*/
  4.     GPIO_InitTypeDef GPIO_InitStructure;  
  5.     /* 配置硬體IIC需要的變數 */
  6.     I2C_InitTypeDef I2C_InitStructure;   
  7.     /* 使能與 I2C1 有關的時鐘 */
  8.     RCC_APB2PeriphClockCmd  (RCC_APB2Periph_GPIOB,ENABLE );   
  9.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);    
  10.     /* PB6-I2C1_SCL、PB7-I2C1_SDA*/
  11.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;   
  12.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;   
  14.     GPIO_Init(GPIOB, &GPIO_InitStructure);   
  15.     /*IIC外設初始化*/
  16.     /* I2C 配置 */
  17.     I2C_InitStructure.I2C_Mode = I2C_Mode_I2C ;     //配置為普通IIC模式
  18.     //I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; 
  19.     //I2C_InitStructure.I2C_OwnAddress1 = SlaveAddress; 
  20.     I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;  //使能自動應答   
  21.     I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;   
  22.     I2C_InitStructure.I2C_ClockSpeed = 50000;   //5K的速度?
  23.     /* I2C1 初始化 */
  24.     I2C_Init(I2C1, &I2C_InitStructure);      
  25.     /* 使能 I2C1 */
  26.     I2C_Cmd  (I2C1,ENABLE);   
  27.     /*允許應答模式*/
  28.     I2C_AcknowledgeConfig(I2C1, ENABLE);     
  29. }  
  30. void HmcByteWrite(u8 addr,u8 dataValue)  
  31. {  
  32.     I2C_GenerateSTART(I2C1,ENABLE);  
  33.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  34.     I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);  
  35.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));  
  36.     I2C_SendData(I2C1,addr);  
  37.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));  
  38.     I2C_SendData(I2C1,dataValue);  
  39.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));  
  40.     I2C_GenerateSTOP(I2C1,ENABLE);  
  41. }  
  42. u8 HmcByteRead(u8 addr)  
  43. {  
  44.     u8 dataValue;  
  45.     while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY));  
  46.     I2C_GenerateSTART(I2C1,ENABLE);//起始訊號
  47.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  48.     I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Transmitter);//傳送裝置地址+寫訊號
  49.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));//
  50.     I2C_Cmd(I2C1,ENABLE);  
  51.     I2C_SendData(I2C1,addr);//傳送儲存單元地址,從0開始
  52.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED));  
  53.     I2C_GenerateSTART(I2C1,ENABLE);//起始訊號
  54.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT));  
  55.     I2C_Send7bitAddress(I2C1,HMC_ADDR,I2C_Direction_Receiver);//傳送裝置地址+讀訊號
  56.     while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));  
  57.     I2C_AcknowledgeConfig(I2C1,DISABLE);  
  58.     I2C_GenerateSTOP(I2C1,ENABLE);  
  59.     while(!(I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_RECEIVED)));  
  60.     dataValue=I2C_ReceiveData(I2C1);//讀出暫存器資料
  61.     return dataValue;  
  62. }  

相關推薦

STM32硬體IIC操作

轉自:http://blog.csdn.net/dengrengong/article/details/39831577  Stm32具有IIC介面,介面有以下主要特性 多主機功能:該模組既可做主裝置也可做從裝置 主裝置功能 C地址檢測 產生和檢測7位/10位地

Yii 2.0 數據庫簡單操作

conf enables sel base attr brush 個數 對象 創建數據庫   開始使用數據庫首先需要配置數據庫連接組件,通過添加 db 組件到應用配置實現("基礎的" Web 應用是 config/web.php),DSN( Data Source Name

【Docker】容器操作

來自:https://www.cnblogs.com/zydev/p/5803461.html 列出主機上的容器 列出正在執行的容器:            docker ps 列出所有容器:               docker ps -a  列出最近使用

JS中的非同步操作

JS中非同步程式設計的方法有: 回撥函式 事件監聽 釋出/訂閱 promise generator(ES6) async/await(ES7) 回撥函式 回撥是非同步程式設計中最基礎的方法。舉例一個簡單的回撥:在f1執行完之後再執行f2 var func1

MySQL資料庫安裝和常用操作

檢查Linux系統中是否已經安裝了MySQL,輸入命令嘗試開啟MySQL服務: sudo service mysql start 如果提示是這樣的,則說明系統中沒有 MySQL,需要繼續安裝: mysql: unrecognized service 在Ubuntu上安裝MySQL,最

Groovy與Java程式碼間的互操作

 Groovy指令碼有兩種呼叫方式,一是作為普通指令碼檔案(.groovy),使用Groovy提供的命令列groovy或者通過類groovy.lang.GroovyShell來呼叫。二是作為普通的Java類檔案(.class),用傳統的方式來呼叫,這需要先使用groovyc把

java用poi實現對word讀取和修改操作

java程式設計要實現對word的操作沒有vb那種程式語言來得容易,得藉助一些開源元件,其中就包括jacob、poi等, 而poi應用得最為廣泛,對word2003和2007的讀和寫word操作都十分方便。它是Apache組織的一個專案,早在2001年就已經發布了第 一個版本,可以說是apache組織的一

STM32 硬體IIC操作

就三個函式  簡單明瞭   初始化  讀   寫  int main(void){  u8 i;  SystemInit();  Iic1_Init();  LED_GPIO_Config();  I2C1_WriteByte(0xA0,1,0x89);  //寫EEPRO

鍵鼠硬體模擬技術

模擬滑鼠鍵盤操作,含硬體模擬技術。 鍵盤是我們使用計算機的一個很重要的輸入裝置了,即使在滑鼠大行其道的今天,很多程式依然離不開鍵盤來操作。但是有時候,一些重複性的,很繁瑣的鍵盤操作總會讓人疲憊,於是就有了用程式來代替人們按鍵的方法,這樣可以把很多重複性的鍵盤操作交給程式來模擬

js訪問xml之節點操作

本文轉自:https://www.cnblogs.com/Caceolod/articles/1753117.html程式碼Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.C

JQuery和JS操作LocalStorage/SessionStorage的方法

char art target jsb 頁面 所有 操作方法 key blog 出處:http://blog.csdn.net/djzhao627/article/details/50747628 首先說一下LocalStorage和SessionStorage Loc

用WebService實現對數據庫進行操作(添加+刪除+修改)

add exe dispose eth 連接 字段 article log conn 轉自:http://blog.csdn.net/beyondqd/article/details/6703169 表為User,字段有 編號: int id,用戶名:string User

Linux中常用操作命令

備份 並不會 使用方法 nts 系統 版本 不定 vim常用 相同 1、cd命令 這是一個非常基本,也是大家經常需要使用的命令,它用於切換當前目錄,它的參數是要切換到的目錄的路徑,可以是絕對路徑,也可以是相對路徑。如: [plain] view plain

Git操作

hash -h AR har -s 多文件 lean 需要 git reset 本地修改了許多文件,其中有些是新增的,因為開發需要這些都不要了,想要丟棄掉,可以使用如下命令: git checkout . #本地所有修改的。沒有的提交的,都返回到原來的狀態 git stas

a標簽實現確認框操作

tar targe arch html cli javascrip 取消 lan 部分 一種: <a href="javascript:if(confirm(‘確實要刪除該內容嗎?‘)){location=‘http://www.google.com‘}">彈出

新唐ISP操作步驟

too 模式 usb 連線 com In 點擊 代碼下載 art 1,電腦上裝上“NuMicro_ICP_Programming_Tool_v1.18.5320.zip”;2,把目標板通過SWD口的NU-LINK連接到電腦的USB口上;3,打開桌面的“NuMicro ICP

深入玩K8S之業務彈性伸縮和滾動更新操作

nginx 副本 mil 容器 history 博客 limit 新的 ima 在實際應用場景中避免不了因為業務的壓力而增加容器數量以及業務應用版本叠代更新,那麽本篇文章我們來學習下簡單的業務彈性伸縮、滾動更新操作,滾動操作的好處在於零停機更新,也就是說每次更新一小部分副本

取自ACE中的bit操作

查看 disable amp work .cpp log get lin 影響 1 # define ACE_BIT_ENABLED(WORD, BIT) (((WORD) & (BIT)) != 0 ) 2 # define ACE_BIT_DISAB

總結Linux 、Redis 操作常用命令

tab ESS 哈希 大對象 由於 edi always wan 情況下 Redis的配置 1. Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程 daemonize no 2. 當Redis以守護進程方式運行時,Redis默認會把

C#連接OleDBConnection數據庫的操作

執行命令 數據庫名 引用 www. 支持 lose 實現 insert mman 對於不同的.net數據提供者,ADO.NET采用不同的Connection對象連接數據庫。這些Connection對我們屏蔽了具體的實現細節,並提供了一種統一的實現方法。 Connection