本應用筆記介紹如何使用DS3900 PC串口轉3線接口與DS1267、DS1867和DS1868三個數字電位器通信,DS3900、DS3223和DS232使用該移位寄存器接口進行編程。DS3是一個模塊,具有MAX3900 RS-<>收發器和一個微處理器,微處理器充當PC串行端口與被控制的<>線器件之間的接口。收發器允許模塊的微處理器與PC通信,微處理器通過其并行端口實現命令結構,以允許PC讀取或寫入三個數字電位計。應用筆記描述了DS<>以及如何將其連接到被測器件。本文中描述的源代碼可在達拉斯半導體的FTP站點上找到。
介紹
DS1267、DS1867和DS1868均為數字電位器,采用獨特的3線協議,很難與PC接口。本應用筆記提供了一個簡單的硬件/軟件解決方案,用于生成用于調整電位器設置的PC接口,以及用于讀取和寫入這些器件的示例C++算法。圖1所示軟件及其源代碼可在ADI網站上找到。
硬件
為該應用生成的硬件利用DS3900與IC通信。DS3900是具有MAX3223 RS232收發器和微處理器的模塊。收發器允許模塊的微處理器與PC通信,微處理器實現命令結構,允許PC讀取或寫入模塊上的任何I / O引腳。除DS3900和3線IC外,還應使用去耦電容來降低V上的噪聲。抄送由DS3900和電位器的數字接口引起。圖2所示為使用DS3和DS3900Wire應用與3線器件通信所需的連接。
圖2.DS3Wire應用原理圖
軟件
圖 1 所示的軟件有三個主要例程;初始化DS3900和對話框(OnInitDialog),讀取17位寄存器(OnRead),寫入17位寄存器(OnWrite)。這些例程是使用名為“CdsPic”的C++類實現的。CdsPic包含子程序,允許使用預先編寫和測試的RS232/DS3900代碼來創建3線算法。DS3Wire應用中CdsPic類的實例稱為“DS3900”。CdsPic類和RS232功能可在ADI網站上找到,任何感興趣的人都可以使用。對于那些對DS3900實現的細節不感興趣的人,函數名稱足夠通用,可以被視為偽代碼。表 1 中列出了一些示例函數名稱及其說明,以供參考。
例 | 描述 |
DS3900.主板禮物() |
如果在CdsPic類初始化代碼期間檢測到DS3900,則返回TRUE;如果未檢測到DS3900,則返回FALSE。 |
DS3900.寫入 1(真) |
引腳P1設置為輸出并強制其高電平。如果在通信過程中未檢測到錯誤,則返回 TRUE。 |
DS3900.寫1(假) |
引腳P1設置為輸出并強制其低電平。如果在通信過程中未檢測到錯誤,則返回 TRUE。 |
DS3900.讀取 1(狀態) |
引腳 P1 設置為輸入、讀取,P1 的輸入電平返回到布爾變量“狀態”。如果在通信過程中未檢測到錯誤,則返回 TRUE。 |
DS3900讀取4(狀態) | 引腳 P4 設置為輸入、讀取,P4 的輸入電平返回到布爾變量“狀態”。如果在通信過程中未檢測到錯誤,則返回 TRUE。 |
3線基礎知識
如果將這個特定版本的3線接口視為具有兩個控制信號時鐘(CLK)和移位使能(“/RST”)以及兩個數據信號(數據輸入(DQ)和數據輸出(C外).當“/RST”為高電平時,接口未復位;因此,移位寄存器已啟用。當“/RST”為高電平時,CLK上收到的任何正邊沿都將導致移位寄存器將所有數據移位一個位置,將DQ的現值移動到第一個位置。這種轉變也會改變C的值外,始終顯示寄存器中第 17 位的當前值。一旦所有17位數據移入器件,復位信號就會調低,這將把新設置傳輸到控制電位計位置并禁用3線接口的寄存器。
該 C外PIN旨在提供在同一條3線總線上將多個3線器件級聯在一起的能力,但它確實提供了對移位寄存器的讀取訪問。通過使能接口(將“/RST”設置為高電平)并將移位寄存器中的17位時鐘設置為C來執行讀取外一次可以讀取一位。當“/RST”被停用時,移位寄存器中的值將是DQ在讀取周期內寫入器件的值,因為數據在移出時被移入器件。這需要將 DQ 重寫為 C 的當前值外在每個時鐘脈沖啟動之前,否則讀取操作將是破壞性的。破壞性讀取操作將導致電位計在停用“/RST”時改變位置。
此接口有兩個主要問題需要避免:
部分寫入(移位小于 17 位)將產生移位寄存器垃圾,這是先前數據和新數據的產物。因此,如果不寫入所有17位,就不可能改變一個電阻的值。
讀取功能具有破壞性,除非移出移位寄存器的數據輪換回移位寄存器。
第一個問題很容易解決,不要執行部分寫入。第二個問題可以解決兩個 不同的方式。數據手冊顯示了使用反饋電阻(10kΩ)自動寫入C值外到 DQ,除非 DQ 在寫入周期內由輸出驅動。雖然這可以用DS3900實現,但設計是用C語言實現的。外驅動單獨的輸入引腳。這演示了在無法使用反饋電阻時如何實現接口。微處理器(在本例中為DS3900)必須在固件/軟件中執行反饋電阻的功能。在 C 上讀取值時外,它將在3線器件時鐘之前寫入DQ。
無法使用反饋電阻的最常見情況是將3線器件連接至集電極開路I/O端口。集電極開路I/O引腳將具有一個上拉電阻,以輸出高電壓電平。該電阻將與反饋電阻爭用。如果反饋電阻小于上拉電阻,則C外將始終寫入 DQ,包括在寫入周期期間,當目的是將新值寫入設備時。如果反饋電阻大于上拉電阻,則在讀取期間DQ將始終為高電平。
OnInitDialog
OnInitDialog是Windows調用的用于初始化對話框的函數。如果使用 Microsoft Developer Studio 生成對話框,則其中一個對話框構造選項會在代碼中為程序員留下注釋。這將在此函數的末尾留下一個“TODO”注釋,說明在此處放置額外的初始化代碼。
本例中添加了以下代碼,以確保DS3900正確上電,將CLK和“/RST”設置為低電平,并使用電位器的當前位置初始化編輯框。如果未檢測到DS3900,則會顯示一條錯誤消息通知用戶。
// TODO: Add extra initialization here <-Developer Studio Comments if(DS3900.BoardPresent()) // <- BoardPresent() checks for DS3900 { // <-If found path m_sEDIT_Status= "DS3900 Found!"; // new status message, all systems go DS3900.Write1(false); // initialize clock DS3900.Write2(false); // initialize reset OnRead(); // read pots and update edit boxes } else { // <-If not found path m_sEDIT_Status = "DS3900 not found!@#$"; // new status message, error detect UpdateData(FALSE); // Update Dialog Values MessageBox("DS3900 Not Found Check Power and Serial Cable Restart Applicaion","DS3900 Error"); }
圖3.向 OnInitDialog 函數添加了額外的初始化代碼
讀取時
OnRead 函數讀取 17 位移位寄存器。它在按下讀取按鈕時和 OnInitDialog 期間執行。該算法假設 C外引腳連接到單獨的DS3900輸入,如圖2所示。這需要軟件寫入在 C 上讀取的值外在3線器件時鐘之前到DQ,或者在讀取操作期間無意中調整電位計。圖 4 顯示了應用程序使用的算法。除了讀取 17 位之外,它還將數據重建為表示 Pot0、Pot1 和堆棧選擇位的變量,并使用 UpdateData(FALSE) 函數更新對話框。每次從PC到DS3900的傳輸都會被監控錯誤,任何對通信的干擾都將導致交易終止并顯示錯誤信息。如果未發生錯誤,則會向狀態框寫入“讀取成功”消息。此功能大約需要 95 毫秒才能執行,但結果可能會因所用 PC 的速度而異。
void OnRead() { //Variables used by subroutine int success; bool bit; unsigned char mask=0x80; unsigned char pot0=0; unsigned char pot1=0; if(DS3900.BoardPresent()) // Only Read if DS3900 found { success = DS3900.Write2(true); // Pull reset high if(success) // Abort Read if comm fail. { success += DS3900.Read5(bit); // Read Cout (stack bit first) success += DS3900.Write4(bit); // Copy Read Contents to DQ success += DS3900.Write1(true); // Clock bit success += DS3900.Write1(false); // Clock bit m_RADIO_Stack = bit; // <-Update Dialog Box Variable if(success == 5) // Abort Read if comm fail. { for(int x = 0; x <8 ; x++) // Pot 1 Read Loop { success += DS3900.Read5(bit); // Read Cout (stack bit first) success += DS3900.Write4(bit); // Copy Read Contents to DQ success += DS3900.Write1(true); // Clock bit success += DS3900.Write1(false); // Clock bit if(bit) // If bit set, set bit in Pot variable pot1 |= mask; mask = mask >> 1; // Adjust Mask for next pass } m_ucEDIT_Pot1 = pot1; // <-Update Dialog Box Variable mask=0x80; // Reset Mask for(int y = 0; y <8 ; y++) // Pot 0 Read Loop { success += DS3900.Read5(bit); // Read Cout (stack bit first) success += DS3900.Write4(bit); // Copy Read Contents to DQ success += DS3900.Write1(true); // Clock bit success += DS3900.Write1(false); // Clock bit if(bit) // If bit set, set bit in Pot variable pot0 |= mask; mask = mask >> 1; // Adjust Mask for next pass } m_ucEDIT_Pot0 = pot0; // <-Update Dialog Box Variable } } success += DS3900.Write2(false); // Pull reset low if(success == 70) // Determine if comm has failed m_sEDIT_Status = "Successful Read"; // Success Message else m_sEDIT_Status = "Read Failed"; // Fail Message } UpdateData(FALSE); // <-Triggers Dialog Box Update }
圖4.讀取功能
請注意,讀取算法的最后一個 if 語句更新對話框的狀態消息。如果DS3900初始化成功,則在顯示對話框之前,將用“成功讀取”覆蓋初始化的“找到DS3900!”消息。
寫入時
OnWrite 函數讀取用戶在對話框中鍵入的值,并將其寫入 3 線器件。若要讀取對話框值,將調用 UpdateData(TRUE) 函數。除了讀取數據外,UpdateData(TRUE) 還將 ASCII 字符串轉換為電位計寄存器的無符號字符,以及堆棧選擇位單選按鈕的整數值。這些值自動存儲在m_ucEDIT_Pot0、m_ucEDIT_Pot1和m_RADIO_Stack變量中。讀取新的所需設置后,寫入算法指示DS3900一次發送一位17位數據。
在寫入過程中,與DS3900的通信被監測錯誤,“成功”變量保持成功數據傳輸次數的運行總數。如果DS3900的每次讀/寫操作都成功,程序將更新狀態框,使其顯示為“寫入成功”;否則,它將中止命令并返回錯誤消息。該函數執行大約需要 70 毫秒,如圖 5 所示。
void OnWrite() { UpdateData(TRUE); //Read values of Dialog Box //variables used by subroutine int success; unsigned char mask = 0x80; unsigned char pot0 = m_ucEDIT_Pot0; unsigned char pot1 = m_ucEDIT_Pot1; bool bit = false; if(m_RADIO_Stack) // place stack select bit into "bit" variable. bit = true; if(DS3900.BoardPresent()) // Only Write if DS3900 Found { success = DS3900.Write2(true); // Pull reset high if(success) // Write abortion if comm. fail { success += DS3900.Write4(bit); // write stack select bit success += DS3900.Write1(true); // Clock bit success += DS3900.Write1(false); // Clock bit if(success == 4) // Write abortion if comm. fail { for(int x = 0; x <8 ; x++) // Loop for 8 bits of pot 1 { if(pot1 & mask) // Read next DQ value with mask success += DS3900.Write4(true); else success += DS3900.Write4(false); success += DS3900.Write1(true); // Clock bit success += DS3900.Write1(false); // Clock bit mask = mask >> 1; // Adjust mask to next position } mask = 0x80; // Reset mask for(int y = 0; y <8 ; y++) // Loop for 8 bits of pot 0 { if(pot0 & mask) // Read next DQ value with mask success += DS3900.Write4(true); else success += DS3900.Write4(false); success += DS3900.Write1(true); // Clock bit success += DS3900.Write1(false); // Clock bit mask = mask >> 1; // Adjust mask to next position. } } } success += DS3900.Write2(false); // Pull reset low } if(success == 53) // Comm. Pass/Fail notification. m_sEDIT_Status = "Successful Write"; // Pass Message else m_sEDIT_Status = "Write Failed"; // Fail Message UpdateData(FALSE); // <-Trigger Dialog Update }
圖5.寫入函數
結論
本應用筆記提供了一種簡單的C++算法,用于使用DS3對包含17位移位寄存器的3900線器件進行讀寫。寫入操作大約需要 70ms,不使用反饋電阻的讀取操作大約需要 95ms 才能執行。雖然相對于3線接口的最大數據速率而言,這并不快,但足以評估電位計。
審核編輯:郭婷
-
收發器
+關注
關注
10文章
3424瀏覽量
105961 -
寄存器
+關注
關注
31文章
5336瀏覽量
120232 -
電位器
+關注
關注
14文章
1012瀏覽量
66767
發布評論請先 登錄
相關推薦
評論