項(xiàng)目概況
我將使用泰克多域示波器3104解碼I2C數(shù)據(jù),并通過(guò)順序輪詢所有地址并尋找確認(rèn)(ACK)信號(hào)來(lái)確定設(shè)備的I2C地址。任何I2C設(shè)備都可以。我收到了英飛凌3D霍爾效應(yīng)傳感器的評(píng)估套件,并將其用作我的I2C設(shè)備。
產(chǎn)品 | 成本(和產(chǎn)品鏈接) | 其他資訊 |
infineon3D磁性傳感器2 Go套件 | $ 28 | 套件手冊(cè) | 傳感器手動(dòng) | 傳感器產(chǎn)品簡(jiǎn)介 |
4位標(biāo)題(0.100英寸) | $ 1 | 數(shù)據(jù)表 |
Arduino Uno R3 | $ 15 | 產(chǎn)品信息 |
雙向邏輯電平轉(zhuǎn)換器 | 三塊 | 數(shù)據(jù)表 |
跳線 | 三塊 |
如上所述,這里可以接受任何與I2C兼容的傳感器或顯示器。您無(wú)需使用電磁傳感器2 Go套件。
設(shè)置電路
我使用的Arduino板具有5V邏輯。3D2GO評(píng)估套件由3.3 V供電。這意味著必須在Arduino的數(shù)據(jù)線和評(píng)估套件之間插入雙向邏輯電平轉(zhuǎn)換器(BD-LLC)。
要將BD-LLC插入Arduino和I2C設(shè)備之間,請(qǐng)進(jìn)行以下連接:
從Arduino到BD-LLC上的GND
BD-LLC到3D2GO上GND的GND
從Arduino到BD-LLC上的低壓(LV)的3.3V
BD-LLC上的LV至3D2GO上的3.3V
BD-LLC上的Arduino 5V至高壓(HV)
Arduino SDA轉(zhuǎn)HV1
Arduino SCL轉(zhuǎn)Hv2
BD-LLC LV1至3D2GO SDA
BD-LLC LV2至3D2GO SCL
設(shè)置示波器
接下來(lái),您需要設(shè)置示波器。為此,請(qǐng)按照下列步驟操作:
打開(kāi)示波器,然后等待它完成自檢。
將探頭插入通道1和通道2。
將探頭的接地夾連接到電路中的接地點(diǎn)(如有必要,請(qǐng)使用跨接線)。
將探頭1連接到SDA,將探頭2連接到SCL(如有必要,請(qǐng)使用跳線)。
現(xiàn)在,您可以打開(kāi)Arduino IDE,并將以下代碼上傳到您的開(kāi)發(fā)板上。這是一個(gè)I2C掃描器,它將掃描設(shè)備的所有地址并查找ACK響應(yīng)。
//Attribution to Krodal, Nick Gammon, Anonymous
#include
void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println(" I2C Scanner");
}
void loop()
{
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address <= 127; address++)
{
// The i2c_scanner uses the return value of
// Wire.endTransmission to seeIF
// a device acknowLEDged the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println("!");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found ");
else
Serial.println("done ");
delay(5000); // wait 5 seconds for next scan
}
復(fù)制代碼
現(xiàn)在,每5秒鐘,Arduino將輪詢I2C地址1-127。如果在被查詢的地址處存在設(shè)備,則將在發(fā)送地址字節(jié)后將SDA線拉低,從而向Arduino發(fā)送確認(rèn)信號(hào)。
現(xiàn)在,我們可以繼續(xù)使用示波器對(duì)I2C總線進(jìn)行解碼。
對(duì)于Tektronix MDO3000或MDO4000系列示波器,請(qǐng)執(zhí)行以下步驟,并在括號(hào)中使用通用說(shuō)明。
按下通道1按鈕(打開(kāi)示波器通道1)
按“標(biāo)簽”(如果可以,請(qǐng)標(biāo)記您的輸入)
使用通用b向下滾動(dòng)到“數(shù)據(jù)”(標(biāo)簽通道1為“數(shù)據(jù)”)
選擇“插入預(yù)設(shè)標(biāo)簽”
使用“通道1”按鈕下方的“垂直刻度旋鈕” 設(shè)置每格2伏(減小信號(hào)的高度,使其占不到屏幕的一半)
使用Channel 1按鈕 上方的旋鈕將信號(hào)移至屏幕的中上部分
按下“向下”箭頭移至“通道2”(打開(kāi)示波器通道2)
使用通用b向下滾動(dòng)到“ CLK”(標(biāo)簽通道2為“clock”)
選擇“插入預(yù)設(shè)標(biāo)簽”
按菜單關(guān)閉按鈕
按下頻道2按鈕
使用“通道2”按鈕下方的旋鈕設(shè)置每格2伏(減小信號(hào)的高度,使其不到屏幕的一半)
使用“通道2”按鈕上方的旋鈕將信號(hào)移到屏幕的下部中間(這將時(shí)鐘信號(hào)的跡線與數(shù)據(jù)信號(hào)的跡線分開(kāi))
按下B1按鈕(示波器的總線功能可讓您解釋和顯示串行或并行數(shù)據(jù);在這種情況下,我們正在處理I2C數(shù)據(jù))
使用通用a在通道2上選擇“ SCL”(將CLK通道分配為SCL)
使用通用b在通道1上選擇“ SDA”(將DATA通道分配為SDA)
使用通用a和通用b將SDA和SCL上的“閾值”設(shè)置為“ 1 V”
將“在地址中包含R / W”設(shè)置為“是”
將“ B1標(biāo)簽”設(shè)置為“ I2C”(以保持跟蹤狀態(tài))
將“總線顯示”設(shè)置為“總線和波形”
設(shè)置“十六進(jìn)制”
按“總線B1”,然后使用通用a選擇“ I2C”(告訴示波器需要哪種數(shù)據(jù)類型)
選擇“定義輸入”
按下觸發(fā)菜單按鈕
選擇“公共汽車”
選擇“源B1-I2C”
選擇“開(kāi)始時(shí)觸發(fā)”
按菜單關(guān)閉
使用Scale旋鈕將時(shí)間刻度更改為1.00 ms
按Single捕獲單個(gè)波形
使用Wave Inspector旋鈕放大要更仔細(xì)檢查的I2C事務(wù)的任何部分。在我的情況下,在地址0x5E之后接收到一個(gè)ACK,因?yàn)槟鞘谴艂鞲衅?a target="_blank">芯片的地址。
以下視頻引導(dǎo)您完成解碼I2C總線所需的步驟。(在Youtube,需要一定的上網(wǎng)工具支持)
解碼I2C總線所需的步驟
如何將數(shù)據(jù)從示波器保存到計(jì)算機(jī)解碼后的數(shù)據(jù)存儲(chǔ)在事件表中。您可以將其保存到USB驅(qū)動(dòng)器或計(jì)算機(jī)中。
由于插入U(xiǎn)SB驅(qū)動(dòng)器是一個(gè)簡(jiǎn)單的例子,因此我們將通過(guò)遠(yuǎn)程控制示波器來(lái)做到這一點(diǎn)。以下步驟特定于microsoft Windows以及Tektronix MDO3000和MDO4000系列示波器。
附帶說(shuō)明,我們將要做的是潛在的數(shù)據(jù)安全風(fēng)險(xiǎn)。在工作之前,請(qǐng)與您的IT部門聯(lián)系。
我的計(jì)算機(jī)位于192.168.0.18,示波器位于192.168.0.40。對(duì)命令進(jìn)行適當(dāng)?shù)恼{(diào)整。
以管理員身份運(yùn)行CMD.EXE并鍵入以下內(nèi)容以創(chuàng)建共享:
mkdir C:示波器
NET SHARE Scope = C: Oscilloscope / remark:“ TEK3104 Data” / grant:domain user,F(xiàn)ULL//這將在您的主硬盤上創(chuàng)建一個(gè)名為“ Scope”的共享。您可以將其更改為所需的任何位置。確保將domain user更改為計(jì)算機(jī)連接到的域的名稱,或?qū)C的名稱更改為您用來(lái)登錄Windows的用戶名。
ipconfig//注意本地連接ipv4地址。在我的示例中,它是192.168.0.18。
接下來(lái),當(dāng)仍在CMD.EXE中時(shí),使用PuTTY或telnet連接到示波器:
TELNET -O 192.168.0.40 4000//將192.168.0.40更改為您的示波器的IP,該IP在啟動(dòng)時(shí)顯示在主屏幕上。
現(xiàn)在,您已通過(guò)默認(rèn)端口4000上的IP地址連接到示波器。鍵入以下內(nèi)容:
!d //清除設(shè)備。
files:mount:list?//這將顯示所有已安裝的驅(qū)動(dòng)器。
files:mount:drive“ H:; 192.168.0.18; Scope; user; pass;”//這會(huì)在機(jī)器上的192.168.0.18處創(chuàng)建一個(gè)持久驅(qū)動(dòng)器。
files:mount:list?//這將導(dǎo)致出現(xiàn)一個(gè)新的驅(qū)動(dòng)器。
files:mkdir“ H:/ NewArticles”//在計(jì)算機(jī)上創(chuàng)建一個(gè)名為“ New Articles”的目錄。
files:cwd“ H:/ NewArticles” //將焦點(diǎn)更改到該目錄。
save:eventtable:B1“ eventtable.csv”//(最終)將數(shù)據(jù)保存到計(jì)算機(jī)。
結(jié)論
在不到15分鐘的時(shí)間里,我們對(duì)I2C總線進(jìn)行了解碼,然后從整個(gè)房間將數(shù)據(jù)保存到計(jì)算機(jī)中進(jìn)行分析。
現(xiàn)在已經(jīng)建立了共享文件夾,以后的工作可以在幾分鐘之內(nèi)完成。這種自動(dòng)解碼過(guò)程比僅探測(cè)信號(hào)并嘗試手動(dòng)解釋邏輯電平要有效得多。
我使用了本文中顯示的范圍和過(guò)程來(lái)解碼3D磁傳感器2 Go的幾種不同模式的I2C總線數(shù)據(jù),并確定哪些命令對(duì)應(yīng)于哪些電源模式。
責(zé)任編輯:xj
原文標(biāo)題:如何在示波器上讀取I2C總線
文章出處:【微信公眾號(hào):multisim】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
-
示波器
+關(guān)注
關(guān)注
113文章
6172瀏覽量
184355 -
I2C
+關(guān)注
關(guān)注
28文章
1477瀏覽量
123098
原文標(biāo)題:如何在示波器上讀取I2C總線
文章出處:【微信號(hào):A1411464185,微信公眾號(hào):multisim】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論