# PIC24FJ128GA106_I2C [PIC24FJ128GA106 datasheet](https://ww1.microchip.com/downloads/en/DeviceDoc/PIC24FJ256GA110-Family-Data-Sheet-DS30009905F.pdf) ###### tags:`PIC24FJ128GA106` `I2C` <style> .red {color:red;} </style> ## IC封裝與腳位 ![](https://i.imgur.com/2hcaH8x.jpg) ## 寫入控制暫存器 ## ==I2CxCON== ![](https://i.imgur.com/WynZcyu.jpg) ### <span class ="red">I2CEN</span>:I^2^C 智能位 ##### ==可讀可寫== 1 =智能I^2^Cx模塊並將SDAx和SCLx引腳配置為串行端口引腳 0 =禁用I^2^Cx模塊; 所有I2C引腳均由端口功能控制 ### <span class ="red">I2SIDL</span>:在空閒模式下停止位 ##### ==可讀可寫== 1 =當設備進入空閒模式時停止模塊運行 0 =在空閒模式下繼續模塊運行 ### <span class ="red">SCLREL</span>:SCLx釋放控制位(slave用) ##### ==可讀可寫== 與STREN位一起使用 1 =釋放SCLx clock 0 =使SCLx clock保持低電平(clock延長) 如果STREN = 1:該位為R / W(即軟件可以寫"0"來延長clock,寫"1"來釋放clock); slave發送開始時硬件清除,slave接收結束時硬件清除 如果STREN = 0:該位為R / S(即,軟件只能寫入"1"來釋放clock);否則,slave傳輸開始時硬件清除 ### <span class ="red">IPMIEN</span>:智能外圍設備管理接口(IPMI)啟用位 ##### ==可讀可寫== 1 =啟用IPMI支持模式; 確認所有地址 0 =禁用IPMI模式 ### <span class ="red">A10M</span>:10位從機尋址位 ##### ==可讀可寫== 1 = I2CxADD是10位slave地址 0 = I2CxADD是7位slave地址 ### <span class ="red">DISSLW</span>:禁用slaw rate控制位 ##### ==可讀可寫== 1 =禁止slew rate控制 0 =智能slew rate控制 ### <span class ="red">SMEN</span>:SMBus輸入電平位 ##### ==可讀可寫== 1 =啟用符合SMBus規範的I / O引腳閾值 0 =禁用SMBus輸入閾值 ### <span class ="red">GCEN</span>:通用呼叫智能位(slave用) ##### ==可讀可寫== 1 =當在I2CxRSR中接收到通用呼叫地址時(智能接收模塊),智能中斷 0 =禁用通用呼叫地址 ### <span class ="red">STREN</span>:SCLx clock擴展智能位(slave用) ##### ==可讀可寫== 與SCLREL位一起使用。 1 =啟用軟件或接收clock延長 0 =禁用軟件或接收clock延長 ### <span class ="red">ACKDT</span>:確認數據位(master接收期間用) ##### ==可讀可寫== 當軟件啟動確認序列時將發送的值 1 =在確認期間發送NACK 0 =在確認期間發送ACK ### <span class ="red">ACKEN</span>:應答序列智能位(master接收期間用) ##### ==可讀可寫== 1 =在SDAx和SCLx引腳上啟動應答序列,並發送ACKDT數據位; 主設備確認序列末尾的硬件清除 0 =確認序列未在進行中 ### <span class ="red">RCEN</span>:接收智能位(master用) ##### ==可讀可寫== 1 =智能I2C的接收模式; 主設備第八位末尾的硬件清零接收數據字節 0 =接收序列未在進行中 ### <span class ="red">PEN</span>:停止條件智能位(master用) ##### ==可讀可寫== 1 =在SDAx和SCLx引腳上啟動停止條件; 在主站結束時清除硬件停止順序 0 =停止條件未在進行中 ### <span class ="red">RSEN</span>:重複啟動條件使能位(master用) ##### ==可讀可寫== 1 =在SDAx和SCLx引腳上啟動重複啟動條件;在master結束時清除硬件重複啟動序列 0 =重複啟動條件未在進行中 ### <span class ="red">SEN</span>:啟動條件使能位(master用) ##### ==可讀可寫== 1 =在SDAx和SCLx引腳上啟動啟動條件; 在master結束時清除硬件啟動順序 0 =起始條件未在進行中 ## ==I2CxSTAT== ![](https://i.imgur.com/UMlQIxe.jpg) ### <span class ="red">ACKSTAT</span>:確認狀態位 ##### ==唯讀== 1 =最後檢測到NACK 0 =最後檢測到ACK 硬體設置或在確認結束時清除。 ### <span class ="red">TRSTAT</span>::發送狀態位(master接收期間用) ##### ==唯讀== 1 =master正在進行發送(8位+ ACK) 0 =master未在進行發送 在master發送開始時設置了硬體。slave應答結束時清除 ### <span class ="red">BCL</span>:BUS衝突檢測位 ##### ==唯讀== 1 =在master操作期間檢測到bus衝突 0 =無衝突 檢測bus衝突時設置的硬件。 ### <span class ="red">GCSTAT</span>:通用呼叫狀態位 ##### ==唯讀== 1 =接收到通用呼叫地址 0 =未接收到通用呼叫地址 當地址與通用呼叫地址匹配時進行硬件設置。 停止檢測時清除硬件 ### <span class ="red">ADD10</span>:10位地址狀態位 ##### ==唯讀== 1 =匹配10位地址 0 =不匹配10位地址 硬件在匹配的10位地址的第二個字節匹配時設置。 停止檢測時清除硬件。 ### <span class ="red">IWCOL</span>:寫衝突檢測位 ##### ==唯讀== 1 =嘗試寫I2CxTRN寄存器失敗,因為I2C模塊忙 0 =無衝突 忙時對I2CxTRN進行寫操作時硬件置1(由軟件清除)。 ### <span class ="red">I2COV</span>:接收溢出標誌位 ##### ==唯讀== 1 =當I2CxRCV寄存器仍保留前一個字節時接收到一個字節 0 =無溢出 嘗試將I2CxRSR傳輸到I2CxRCV時由硬件置1(由軟件清零)。 ### <span class ="red">$D /\bar A$</span>:數據/$\bar {地址}$位(slave用) ##### ==唯讀== 1 =表示接收到的最後一個字節是數據 0 =表示接收到的最後一個字節是設備地址 硬件在設備地址匹配時清零。 傳輸完成後或通過接收從機字節來設置硬件。 ### <span class ="red">P</span>:停止位 ##### ==唯讀== 1 =指示最後一次檢測到停止位 0 =上次未檢測到停止位 當檢測到啟動,重複啟動或停止時,硬件置1或清零。 ### <span class ="red">S</span>:起始位 ##### ==唯讀== 1 =表示最後檢測到起始(或重複起始)位 0 =上次未檢測到起始位 當檢測到起始,重複起始或停止時,硬件置1或清零。 ### <span class ="red">$R /\bar W$</span>:讀/$\bar 寫$信息位(slave用) ##### ==唯讀== 1 =讀取,表示從slave輸出數據傳輸 0 =寫,指示將數據傳輸輸入到slave 硬件在接收I2C設備地址字節後置1或清零。 ### <span class ="red">RBF</span>:接收緩衝區已滿狀態位 ##### ==唯讀== 1 =接收完成,I2CxRCV已滿 0 =接收未完成,I2CxRCV為空 當用接收到的字節寫入I2CxRCV時,硬件置1。 當軟件讀取I2CxRCV時硬件清零 ### <span class ="red">TBF</span>:發送緩衝區已滿狀態位 ##### ==唯讀== 1 =正在發送,I2CxTRN已滿 0 =發送完成,I2CxTRN為空 當軟件寫入I2CxTRN時,硬件置1。 完成數據傳輸後清除硬件。 ## ==I2CxMSK== ![](https://i.imgur.com/hYi55tb.jpg) ### <span class ="red">AMSK [9:0]</span>:x的地址屏蔽位選擇位 ##### ==可讀可寫== 1 =使能傳入消息x的地址的屏蔽位; 該位置不需要位匹配 0 =禁用屏蔽; 此位置需要位匹配 ## ==IFSx== ![](https://i.imgur.com/ZzcWh6m.jpg) ### <span class ="red">MI2C1IF</span>:I2Cx master事件中斷標誌狀態位 ##### ==可讀可寫== 1 =發生中斷請求 0 =未發生中斷請求 ### <span class ="red">SI2C1IF</span>:I2Cx slave事件中斷標誌狀態位 ##### ==可讀可寫== 1 =發生中斷請求 0 =未發生中斷請求 ## ==IECx== ![](https://i.imgur.com/FSyVxEd.jpg) ### <span class ="red">MI2C1IE</span>:主 I2Cx事件中斷使能位 ##### ==可讀可寫== 1 =使能中斷請求 0 =未使能中斷請求位 ### <span class ="red">SI2C1IE</span>:從 I2Cx事件中斷使能位 ##### ==可讀可寫== 1 =使能中斷請求 0 =未使能中斷 <!-- ## 使用方式 ### 接線方式 畫張圖拉 ### 要來寫程式了喔 DATASHEET裡的波型圖 ### 程式說明 ```c= 用這個啦 ``` ## 注意~~ -->