0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用裝有DS3900的PC與DS1267、DS1867和DS1868通信

星星科技指導(dǎo)員 ? 來源:ADI ? 作者:ADI ? 2023-02-25 11:06 ? 次閱讀

本應(yīng)用筆記介紹如何使用DS3900 PC串口轉(zhuǎn)3線接口與DS1267、DS1867和DS1868三個(gè)數(shù)字電位器通信,DS3900、DS3223和DS232使用該移位寄存器接口進(jìn)行編程。DS3是一個(gè)模塊,具有MAX3900 RS-<>收發(fā)器和一個(gè)微處理器,微處理器充當(dāng)PC串行端口與被控制的<>線器件之間的接口。收發(fā)器允許模塊的微處理器與PC通信,微處理器通過其并行端口實(shí)現(xiàn)命令結(jié)構(gòu),以允許PC讀取或?qū)懭肴齻€(gè)數(shù)字電位計(jì)。應(yīng)用筆記描述了DS<>以及如何將其連接到被測器件。本文中描述的源代碼可在達(dá)拉斯半導(dǎo)體的FTP站點(diǎn)上找到。

介紹

DS1267、DS1867和DS1868均為數(shù)字電位器,采用獨(dú)特的3線協(xié)議,很難與PC接口。本應(yīng)用筆記提供了一個(gè)簡單的硬件/軟件解決方案,用于生成用于調(diào)整電位器設(shè)置的PC接口,以及用于讀取和寫入這些器件的示例C++算法。圖1所示軟件及其源代碼可在ADI網(wǎng)站上找到。

poYBAGP5eymAKmW6AAA4QkGu8DU447.gif

圖1.ADI公司的3線評估軟件(DS3線.exe)。

硬件

為該應(yīng)用生成的硬件利用DS3900與IC通信。DS3900是具有MAX3223 RS232收發(fā)器和微處理器的模塊。收發(fā)器允許模塊的微處理器與PC通信,微處理器實(shí)現(xiàn)命令結(jié)構(gòu),允許PC讀取或?qū)懭肽K上的任何I / O引腳。除DS3900和3線IC外,還應(yīng)使用去耦電容來降低V上的噪聲。抄送由DS3900和電位器的數(shù)字接口引起。圖2所示為使用DS3和DS3900Wire應(yīng)用與3線器件通信所需的連接。

pYYBAGP5eyqAJcx5AABTlPdBzPo070.gif

圖2.DS3Wire應(yīng)用原理圖

軟件

圖 1 所示的軟件有三個(gè)主要例程;初始化DS3900和對話框(OnInitDialog),讀取17位寄存器(OnRead),寫入17位寄存器(OnWrite)。這些例程是使用名為“CdsPic”的C++類實(shí)現(xiàn)的。CdsPic包含子程序,允許使用預(yù)先編寫和測試的RS232/DS3900代碼來創(chuàng)建3線算法。DS3Wire應(yīng)用中CdsPic類的實(shí)例稱為“DS3900”。CdsPic類和RS232功能可在ADI網(wǎng)站上找到,任何感興趣的人都可以使用。對于那些對DS3900實(shí)現(xiàn)的細(xì)節(jié)不感興趣的人,函數(shù)名稱足夠通用,可以被視為偽代碼。表 1 中列出了一些示例函數(shù)名稱及其說明,以供參考。

描述
DS3900.主板禮物() 如果在CdsPic類初始化代碼期間檢測到DS3900,則返回TRUE;如果未檢測到DS3900,則返回FALSE。
DS3900.寫入 1(真) 引腳P1設(shè)置為輸出并強(qiáng)制其高電平。如果在通信過程中未檢測到錯(cuò)誤,則返回 TRUE。
DS3900.寫1(假) 引腳P1設(shè)置為輸出并強(qiáng)制其低電平。如果在通信過程中未檢測到錯(cuò)誤,則返回 TRUE。
DS3900.讀取 1(狀態(tài)) 引腳 P1 設(shè)置為輸入、讀取,P1 的輸入電平返回到布爾變量“狀態(tài)”。如果在通信過程中未檢測到錯(cuò)誤,則返回 TRUE。
DS3900讀取4(狀態(tài)) 引腳 P4 設(shè)置為輸入、讀取,P4 的輸入電平返回到布爾變量“狀態(tài)”。如果在通信過程中未檢測到錯(cuò)誤,則返回 TRUE。

3線基礎(chǔ)知識

如果將這個(gè)特定版本的3線接口視為具有兩個(gè)控制信號時(shí)鐘(CLK)和移位使能(“/RST”)以及兩個(gè)數(shù)據(jù)信號(數(shù)據(jù)輸入(DQ)和數(shù)據(jù)輸出(C外).當(dāng)“/RST”為高電平時(shí),接口未復(fù)位;因此,移位寄存器已啟用。當(dāng)“/RST”為高電平時(shí),CLK上收到的任何正邊沿都將導(dǎo)致移位寄存器將所有數(shù)據(jù)移位一個(gè)位置,將DQ的現(xiàn)值移動到第一個(gè)位置。這種轉(zhuǎn)變也會改變C的值外,始終顯示寄存器中第 17 位的當(dāng)前值。一旦所有17位數(shù)據(jù)移入器件,復(fù)位信號就會調(diào)低,這將把新設(shè)置傳輸?shù)娇刂齐娢挥?jì)位置并禁用3線接口的寄存器。

該 C外PIN旨在提供在同一條3線總線上將多個(gè)3線器件級聯(lián)在一起的能力,但它確實(shí)提供了對移位寄存器的讀取訪問。通過使能接口(將“/RST”設(shè)置為高電平)并將移位寄存器中的17位時(shí)鐘設(shè)置為C來執(zhí)行讀取外一次可以讀取一位。當(dāng)“/RST”被停用時(shí),移位寄存器中的值將是DQ在讀取周期內(nèi)寫入器件的值,因?yàn)閿?shù)據(jù)在移出時(shí)被移入器件。這需要將 DQ 重寫為 C 的當(dāng)前值外在每個(gè)時(shí)鐘脈沖啟動之前,否則讀取操作將是破壞性的。破壞性讀取操作將導(dǎo)致電位計(jì)在停用“/RST”時(shí)改變位置。

此接口有兩個(gè)主要問題需要避免:

部分寫入(移位小于 17 位)將產(chǎn)生移位寄存器垃圾,這是先前數(shù)據(jù)和新數(shù)據(jù)的產(chǎn)物。因此,如果不寫入所有17位,就不可能改變一個(gè)電阻的值。

讀取功能具有破壞性,除非移出移位寄存器的數(shù)據(jù)輪換回移位寄存器。

第一個(gè)問題很容易解決,不要執(zhí)行部分寫入。第二個(gè)問題可以解決兩個(gè) 不同的方式。數(shù)據(jù)手冊顯示了使用反饋電阻(10kΩ)自動寫入C值外到 DQ,除非 DQ 在寫入周期內(nèi)由輸出驅(qū)動。雖然這可以用DS3900實(shí)現(xiàn),但設(shè)計(jì)是用C語言實(shí)現(xiàn)的。外驅(qū)動單獨(dú)的輸入引腳。這演示了在無法使用反饋電阻時(shí)如何實(shí)現(xiàn)接口。微處理器(在本例中為DS3900)必須在固件/軟件中執(zhí)行反饋電阻的功能。在 C 上讀取值時(shí)外,它將在3線器件時(shí)鐘之前寫入DQ。

無法使用反饋電阻的最常見情況是將3線器件連接至集電極開路I/O端口。集電極開路I/O引腳將具有一個(gè)上拉電阻,以輸出高電壓電平。該電阻將與反饋電阻爭用。如果反饋電阻小于上拉電阻,則C外將始終寫入 DQ,包括在寫入周期期間,當(dāng)目的是將新值寫入設(shè)備時(shí)。如果反饋電阻大于上拉電阻,則在讀取期間DQ將始終為高電平。

OnInitDialog

OnInitDialog是Windows調(diào)用的用于初始化對話框的函數(shù)。如果使用 Microsoft Developer Studio 生成對話框,則其中一個(gè)對話框構(gòu)造選項(xiàng)會在代碼中為程序員留下注釋。這將在此函數(shù)的末尾留下一個(gè)“TODO”注釋,說明在此處放置額外的初始化代碼。

本例中添加了以下代碼,以確保DS3900正確上電,將CLK和“/RST”設(shè)置為低電平,并使用電位器的當(dāng)前位置初始化編輯框。如果未檢測到DS3900,則會顯示一條錯(cuò)誤消息通知用戶。

      // 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 函數(shù)添加了額外的初始化代碼

讀取時(shí)

OnRead 函數(shù)讀取 17 位移位寄存器。它在按下讀取按鈕時(shí)和 OnInitDialog 期間執(zhí)行。該算法假設(shè) C外引腳連接到單獨(dú)的DS3900輸入,如圖2所示。這需要軟件寫入在 C 上讀取的值外在3線器件時(shí)鐘之前到DQ,或者在讀取操作期間無意中調(diào)整電位計(jì)。圖 4 顯示了應(yīng)用程序使用的算法。除了讀取 17 位之外,它還將數(shù)據(jù)重建為表示 Pot0、Pot1 和堆棧選擇位的變量,并使用 UpdateData(FALSE) 函數(shù)更新對話框。每次從PC到DS3900的傳輸都會被監(jiān)控錯(cuò)誤,任何對通信的干擾都將導(dǎo)致交易終止并顯示錯(cuò)誤信息。如果未發(fā)生錯(cuò)誤,則會向狀態(tài)框?qū)懭搿白x取成功”消息。此功能大約需要 95 毫秒才能執(zhí)行,但結(jié)果可能會因所用 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.讀取功能

請注意,讀取算法的最后一個(gè) if 語句更新對話框的狀態(tài)消息。如果DS3900初始化成功,則在顯示對話框之前,將用“成功讀取”覆蓋初始化的“找到DS3900!”消息。

寫入時(shí)

OnWrite 函數(shù)讀取用戶在對話框中鍵入的值,并將其寫入 3 線器件。若要讀取對話框值,將調(diào)用 UpdateData(TRUE) 函數(shù)。除了讀取數(shù)據(jù)外,UpdateData(TRUE) 還將 ASCII 字符串轉(zhuǎn)換為電位計(jì)寄存器的無符號字符,以及堆棧選擇位單選按鈕的整數(shù)值。這些值自動存儲在m_ucEDIT_Pot0、m_ucEDIT_Pot1和m_RADIO_Stack變量中。讀取新的所需設(shè)置后,寫入算法指示DS3900一次發(fā)送一位17位數(shù)據(jù)。

在寫入過程中,與DS3900的通信被監(jiān)測錯(cuò)誤,“成功”變量保持成功數(shù)據(jù)傳輸次數(shù)的運(yùn)行總數(shù)。如果DS3900的每次讀/寫操作都成功,程序?qū)⒏聽顟B(tài)框,使其顯示為“寫入成功”;否則,它將中止命令并返回錯(cuò)誤消息。該函數(shù)執(zhí)行大約需要 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.寫入函數(shù)

結(jié)論

本應(yīng)用筆記提供了一種簡單的C++算法,用于使用DS3對包含17位移位寄存器的3900線器件進(jìn)行讀寫。寫入操作大約需要 70ms,不使用反饋電阻的讀取操作大約需要 95ms 才能執(zhí)行。雖然相對于3線接口的最大數(shù)據(jù)速率而言,這并不快,但足以評估電位計(jì)。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 收發(fā)器
    +關(guān)注

    關(guān)注

    10

    文章

    3428

    瀏覽量

    105999
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5343

    瀏覽量

    120348
  • 電位器
    +關(guān)注

    關(guān)注

    14

    文章

    1012

    瀏覽量

    66790
收藏 人收藏

    評論

    相關(guān)推薦

    DS1267 pdf datasheet (Dual Dig

    The DS1267 has two 256-position potentiometers, with wiper positions each set by stored 8-bit
    發(fā)表于 10-04 20:20 ?24次下載

    DS1868 雙路、數(shù)字電位器芯片

    DS1868 雙路、數(shù)字電位器芯片 The DS1868 has two 256-position potentiometers, with wiper positions each set
    發(fā)表于 10-04 20:11 ?2165次閱讀
    <b class='flag-5'>DS1868</b> 雙路、數(shù)字電位器芯片

    DS1267 雙路、±5V、數(shù)字電位器芯片

    DS1267 雙路、±5V、數(shù)字電位器芯片 The DS1267 has two 256-position potentiometers, with wiper positions each
    發(fā)表于 10-04 20:24 ?1335次閱讀
    <b class='flag-5'>DS1267</b> 雙路、±5V、數(shù)字電位器芯片

    運(yùn)用LabView控制DS3900串口通信模塊

    運(yùn)用LabView控制DS3900串口通信模塊 本篇應(yīng)用筆記討論了DS3900串口通信模塊和LabView的使用問題,LabView是適用于嵌入式應(yīng)用的圖形化界面開發(fā)平臺。本文可作為
    發(fā)表于 01-06 13:52 ?1166次閱讀
    運(yùn)用LabView控制<b class='flag-5'>DS3900</b>串口<b class='flag-5'>通信</b>模塊

    運(yùn)用LabView控制DS3900串口通信模塊

    摘要:本篇應(yīng)用筆記討論了DS3900串口通信模塊和LabView的使用問題,LabView是適用于嵌入式應(yīng)用的圖形化界面開發(fā)平臺。本文可作為面向DS3900的LabView界面用戶指南。
    發(fā)表于 04-28 11:38 ?784次閱讀
    運(yùn)用LabView控制<b class='flag-5'>DS3900</b>串口<b class='flag-5'>通信</b>模塊

    Using a PC with a DS3900 to Co

    to communicate with the three digital pots, the DS1267, DS1867, and DS1868, which use this shift register interfa
    發(fā)表于 04-28 11:50 ?890次閱讀
    Using a <b class='flag-5'>PC</b> with a <b class='flag-5'>DS3900</b> to Co

    Interfacing a DS1868 3-Wire De

    Abstract: The DS1868 uses a dual digital potentiometer with a 3-wire (shift register) interface.
    發(fā)表于 04-28 11:57 ?795次閱讀
    Interfacing a <b class='flag-5'>DS1868</b> 3-Wire De

    DS1867 Power Supply Conditioni

    DS1867 Pow
    發(fā)表于 04-28 12:03 ?836次閱讀
    <b class='flag-5'>DS1867</b> Power Supply Conditioni

    運(yùn)用LabView控制DS3900串口通信模塊

    摘要:本篇應(yīng)用筆記討論了DS3900串口通信模塊和LabView的使用問題,LabView是適用于嵌入式應(yīng)用的圖形化界面開發(fā)平臺。本文可作為面向DS3900的LabView界面用戶指南。
    發(fā)表于 05-07 11:30 ?558次閱讀
    運(yùn)用LabView控制<b class='flag-5'>DS3900</b>串口<b class='flag-5'>通信</b>模塊

    Using a PC with a DS3900 to Co

    to communicate with the three digital pots, the DS1267, DS1867, and DS1868, which use this shift register interfa
    發(fā)表于 05-08 09:09 ?797次閱讀
    Using a <b class='flag-5'>PC</b> with a <b class='flag-5'>DS3900</b> to Co

    數(shù)字電位器DS126的結(jié)構(gòu)和工作原理及DS1267在電橋自動平衡的應(yīng)用說明

    DS1267是DALLAS公司生產(chǎn)的256 結(jié)點(diǎn)雙數(shù)字電位器,它具有三種串行接口且功耗很低,很容易與單片機(jī)接口,文中介紹了數(shù)字電位器DS1267的結(jié)構(gòu)和工作原理,同時(shí)給出了DS1267在瞬態(tài)應(yīng)變波形存貯器中的應(yīng)用線路和軟件流程圖
    發(fā)表于 11-20 17:48 ?13次下載
    數(shù)字電位器<b class='flag-5'>DS</b>126的結(jié)構(gòu)和工作原理及<b class='flag-5'>DS1267</b>在電橋自動平衡的應(yīng)用說明

    數(shù)字電位器DS1267中文資料及應(yīng)用

    DS1267是DALLAS公司生產(chǎn)的256結(jié)點(diǎn)雙數(shù)字電位器,它具有三種串行接口且功耗很低,很容易與單片機(jī)接口,文中介紹了數(shù)字電位器DS1267的結(jié)構(gòu)和工作原理,同時(shí)給出了DS1267在瞬態(tài)應(yīng)變波形存貯器中的應(yīng)用線路和軟件流程圖。
    發(fā)表于 04-14 10:40 ?13次下載

    使用帶 DS3900PCDS1267、DS1867DS1868 通信

    發(fā)表于 11-18 23:45 ?0次下載
    使用帶 <b class='flag-5'>DS3900</b> 的 <b class='flag-5'>PC</b> 與 <b class='flag-5'>DS1267</b>、<b class='flag-5'>DS1867</b> 和 <b class='flag-5'>DS1868</b> <b class='flag-5'>通信</b>

    使用DS3900評估I2C兼容器件是否成功實(shí)現(xiàn)雙向通信

    DS3900用于評估I2C兼容元件,利用PC的串行端口與2線器件進(jìn)行快速的雙向通信。圖1所示為在DS3900和I2C兼容器件之間建立通信的推
    的頭像 發(fā)表于 01-10 10:43 ?780次閱讀
    使用<b class='flag-5'>DS3900</b>評估I2C兼容器件是否成功實(shí)現(xiàn)雙向<b class='flag-5'>通信</b>

    使用多個(gè)DS1267數(shù)字電位器和8051微處理器產(chǎn)生3線信號

    本應(yīng)用筆記概述了通過公共總線與多個(gè)DS1267通信的不同配置。它還提供與兩個(gè)以菊花鏈形式串聯(lián)在一起的DS1267通信所需的硬件和軟件。
    的頭像 發(fā)表于 02-20 10:23 ?1206次閱讀
    使用多個(gè)<b class='flag-5'>DS1267</b>數(shù)字電位器和8051微處理器產(chǎn)生3線信號