本應(yīng)用筆記討論了為有興趣為應(yīng)用筆記AN2中所述的并行端口硬件開發(fā)3230-Wire軟件的客戶提供的C源代碼。源代碼可在達(dá)拉斯半導(dǎo)體的FTP站點上免費獲得,并且可以在任何使用Windows 95或Windows 98操作系統(tǒng)的PC上運行。此外,F(xiàn)TP站點上還提供了一個簡單的Windows程序,該程序提供了基本的2-Wire通信軟件,可用于簡單評估和調(diào)試并行端口硬件。有關(guān)硬件的詳細(xì)信息,請參閱 AN3230。?
本應(yīng)用說明中介紹的軟件是免費的,并“按原樣”提供給我們的客戶使用。達(dá)拉斯半導(dǎo)體對軟件可能造成的任何損害不承擔(dān)任何責(zé)任。使用該軟件的風(fēng)險由您自行承擔(dān)。
軟件要求
如介紹中所述,該程序必須在裝有Windows 95或Windows 98操作系統(tǒng)的PC上運行。此軟件直接訪問并行端口,基于 Windows NT 的操作系統(tǒng)需要驅(qū)動程序才能完成此任務(wù)。
此外,還有多種并行端口操作模式,其中一些與軟件不兼容。已成功使用的兩種模式是 EPP 和 ECP。大多數(shù)PC的并行端口模式都可以在BIOS設(shè)置中更改。
源代碼描述/用途
源代碼(見附錄A)是用ANSI C編寫的,因此它應(yīng)該與任何C編譯器兼容。為了使它的使用盡可能簡單,所有代碼和聲明都在一個文件(2wire.c)中,因此沒有一個頭文件也必須包含在項目中才能使用資源。
要使用2-Wire源代碼:
將“2wire.c”文件放入項目目錄中。
在將訪問并行端口的程序頂部添加一個#include“2wire.c”聲明。
調(diào)用 ParPortSelect(1) 來選擇并行端口。該參數(shù)確定將使用的端口號(例如,如圖所示的 LPT1)。有效端口號為 1、2 和 3。大多數(shù)PC將使用LPT1。
使用表2所示的ChangeDelayCount(int i)命令校準(zhǔn)3-Wire接口時序。
調(diào)用基本2-Wire函數(shù)或多字節(jié)2-Wire函數(shù),如表1和表2所述。
并行端口時序在很大程度上取決于執(zhí)行軟件的PC的速度,因此計算機(jī)之間的差異會使建立可靠的通信變得困難。為了解決此問題,在 SDA 和 SCL 信號之間插入可變長度延遲,以確保速度較快的計算機(jī)上的計時不超過最大額定接口速度(快速模式設(shè)備為 400kbits/秒)。延遲時間通過調(diào)用 ChangeDelayCount(int i) 函數(shù)來控制。此函數(shù)更改 PC 執(zhí)行短延遲的次數(shù)(10 NOP + a for( ; ; ) 循環(huán)的執(zhí)行時間)。i 的默認(rèn)值為 1000,在 P3 600MHz 計算機(jī)上提供中等到慢速通信。這將導(dǎo)致大多數(shù)PC上的中等性能,但它應(yīng)該可靠地工作。較低的i值將加快接口速度,但編程人員必須確保通信速度在2-Wire器件的規(guī)格范圍內(nèi)。在速度較快的機(jī)器上,可能需要更大的值 i 才能建立通信,因此如果需要調(diào)試,則需要檢查這一點。
基本的2-Wire功能可用于大多數(shù)應(yīng)用訪問2-Wire器件。發(fā)送啟動條件、寫入和讀取字節(jié)以及發(fā)送停止條件的機(jī)制已在這些例程中處理,僅將例程的調(diào)用時間和順序作為與設(shè)備通信的最后剩余障礙。要使用這些例程,請如上所述調(diào)整時序,并閱讀器件的數(shù)據(jù)手冊,以確定對訪問寄存器的調(diào)用順序。
多字節(jié)2-Wire功能可用于通過一個命令從器件讀取和寫入多達(dá)256字節(jié)的信息,但并非所有器件在通信期間都使用相同的數(shù)據(jù)序列。如果考慮使用這些函數(shù),請檢查提供的源代碼,以確保它們與正在訪問的設(shè)備兼容。多字節(jié)寫入/讀取的主要優(yōu)點是它限制了應(yīng)用程序所需的調(diào)用次數(shù),因為它使用單個命令傳輸多個字節(jié),而不是發(fā)送多個命令來寫入/讀取單個字節(jié)。多字節(jié)寫入和讀取例程使用 SetSlaveAddress() 命令設(shè)置的設(shè)備地址,因此在使用多字節(jié)寫入和讀取命令之前必須調(diào)用 SetSlaveAddress()。
LED 使能和禁用功能允許將 AN3230 中顯示的 LED 用作狀態(tài)指示燈。頻閃設(shè)置和清除功能允許使用 LED 引腳觸發(fā)示波器。這些函數(shù)對于調(diào)試硬件和軟件問題非常有用。
功能原型 | 功能說明 | 返回值 |
int 開始() | 產(chǎn)生 2 線啟動條件。也可以調(diào)用以生成重新啟動條件。 | 1 |
int Stop() | 產(chǎn)生 2 線停止條件 | 1 |
int WriteData(unsigned char ucData); | 將參數(shù)寫入從屬服務(wù)器 |
如果從站確認(rèn),則為 1,如果從屬服務(wù)器不確認(rèn),則為 0 |
int ReadDataAck(unsigned char *ucData); | 從從站讀取數(shù)據(jù)字節(jié)到 ucData 并確認(rèn) | 1 |
int ReadDataNack(unsigned char *ucData); | 從從屬服務(wù)器讀取數(shù)據(jù)字節(jié)到 ucData 并且不確認(rèn) | 1 |
int ResetBus() | 時鐘 SCL 9 次,然后生成停止條件 | 1 |
功能原型 | 功能說明 | 返回值 |
int SetSlaveAddress(unsigned char ucADDR) | 設(shè)置多字節(jié)讀寫訪問的從地址 | 1 |
int WriteBytes(int iCount, unsigned char ucMemAddr, unsigned char ucData[256]) | 將 iCount 字節(jié)寫入 SetSlaveAddress() 設(shè)置的設(shè)備地址,從 ucMemAddr 設(shè)置的內(nèi)存地址開始。 |
如果從站確認(rèn),則為 1,如果從站不確認(rèn)任何字節(jié),則為 0。 |
Int ReadBytes(int iCount, unsigned char ucMemAddr, unsigned char ucData[256]) | 從 ucMemAddr 設(shè)置的內(nèi)存地址開始,在 SetSlaveAddress() 設(shè)置的設(shè)備地址處讀取 iCount 字節(jié)。 |
如果從屬在命令寫入期間確認(rèn),則為 1,如果從屬在命令寫入期間不確認(rèn),則為 0。 |
功能原型 | 功能說明 | 返回值 |
int ParPortSelect(int iLPT) | 將并行端口訪問變量設(shè)置為指定的端口號。對于 LPT1,iLPT = 1。 |
1 表示成功更改 0 表示失敗 |
int ChangeDelayCount(int iCount) | 這決定了在 SDA 和 SCL 通信期間與 DelayASMx10() 命令一起使用的“i”值。使用較高的 i 值調(diào)用此函數(shù)以使通信速度變慢。默認(rèn)值為 1000,應(yīng)提供中等到較慢的通信速度。這是 i 的安全值。大多數(shù)PC將能夠使用較低的i值來加快通信速度。 | 1 |
無效延遲ASMx10(int i) | 每個 i 延遲 10 個時鐘周期。這稱為確定 SDA 和 SCL 計時的延遲。它不需要由軟件開發(fā)人員調(diào)用,它已經(jīng)嵌入到啟動/停止/讀/寫命令中。 | 零 |
int EnableLED() | 使能 AN3230 電路中的 LED | 1 |
int 禁用指示燈() | 禁用 AN3230 電路中的 LED | 1 |
int SetStrobe() | 將 AN3230 電路中的 LED 引腳設(shè)置為高電平,以便示波器觸發(fā) | 1 |
int ClearStrobe() | 將 AN3230 電路中的 LED 引腳設(shè)置為低電平,以便示波器觸發(fā) | 1 |
基本2線功能示例
本節(jié)介紹如何將兩個字節(jié)寫入DS1086 DAC寄存器,然后使用基本的2-Wire功能讀回。DS1086的從地址為B0h,DAC寄存器為2字節(jié),從存儲器地址08h開始。
要將 0180h 寫入地址 08h 和 09h,可以使用以下過程。
unsigned char fail = 0; Start(); // Generates Start Condition fail |= !WriteData(0xB0); // Writes the slave address fail |= !WriteData(0x08); // Writes the memory address of the DAC register fail |= !WriteData(0x01); // Writes the MSB of the DAC register fail |= !WriteData(0x80); // Writes the LSB of the DAC register Stop(); // Generates Stop Condition if(fail == 1) Error("Device failed to acknowledge during write attempt");
若要讀取剛剛寫入 DAC 寄存器的字節(jié),可以使用以下代碼。
unsigned char ucDataMSB=0; // define variable for MSB data to be stored after the read unsigned char ucDataLSB=0; // define variable for LSB data to be stored after the read unsigned char fail = 0; Start(); // Generate Start Condition fail |= !WriteData(0xB0); // Write the slave address, LSbit=0 to signify write byte fail |= !WriteData(0x08); // Write the memory address of the DAC register Start(); // Generates a re-start condition WriteData(0xB1); // Writes the slave address, LSbit=1 to signify read byte ReadDataAck(&ucDataMSB); // Reads the MSB of DAC and sends acknowledgement to the slave ReadDataNack(&ucDataLSB); // Reads the LSB of DAC and does not acknowledge the slave Stop(); // Generates Stop Condition if(fail ==1) Error("Device failed to acknowledge during read attempt");
視窗并行端口2線軟件
圖1所示的軟件是為了演示“2wire.c”軟件的基本功能而編寫的,也可用于調(diào)試AN3230硬件。
圖1.Windows并行端口到2-Wire軟件的示例。
該軟件可以與“并行端口選擇”部分中列出的 3 個并行端口中的任何一個進(jìn)行通信。
2-Wire函數(shù)部分中的按鈕只需接受對話框中的參數(shù),然后調(diào)用相應(yīng)的“2wire.c”函數(shù)。Start 生成一個啟動條件,寫入數(shù)據(jù)將按鈕右側(cè)框中的參數(shù)寫入從站。兩個讀取按鈕都從從站讀取一個字節(jié),但一個確認(rèn)數(shù)據(jù)傳輸,另一個不確認(rèn)數(shù)據(jù)傳輸。停止按鈕生成停止條件。寫入字節(jié)按鈕在LSbit設(shè)置為零時寫入2-Wire器件地址框中的值,讀取按鈕在LSbit設(shè)置為<>時寫入相同的值。這些按鈕允許寫入數(shù)據(jù)按鈕用于數(shù)據(jù)和存儲器地址,而不必在每次訪問器件時頻繁地將其中一個值更改為從地址。
單字節(jié)寫入將單個數(shù)據(jù)字節(jié)(Data)傳輸?shù)?-Wire器件地址框中列出的從地址,位于Addr框中列出的存儲器地址處。
2字節(jié)從<>線器件地址盒中列出的從地址從“地址”從“地址”框中列出的存儲器地址讀取一個字節(jié)。對話框?qū)⒃诓淮_認(rèn)的情況下讀取,以指示它只讀取一個字節(jié)。
雙字節(jié)寫入將兩個數(shù)據(jù)字節(jié)(數(shù)據(jù)MSB和數(shù)據(jù)LSB)傳輸?shù)?-Wire器件地址框中列出的從地址,位于Addr框中列出的存儲器地址。
雙字節(jié)讀取從機(jī)讀取從機(jī)的兩個數(shù)據(jù)字節(jié),從2-Wire器件地址框中列出的從地址開始,從“地址”框中列出的存儲器地址開始。對話框?qū)⒋_認(rèn)第一個數(shù)據(jù)字節(jié)讀取,但不確認(rèn)第二個數(shù)據(jù)字節(jié)讀取。
“查找地址”按鈕寫入2-Wire總線(00h-FEh)上的每個從地址,檢查確認(rèn)地址以確定哪些地址具有從地址。響應(yīng)確認(rèn)的地址將列在狀態(tài)框中。該按鈕可用于確定AN3230硬件設(shè)置是否正確,以及能夠接收數(shù)據(jù)的從機(jī)是否連接到2-Wire總線。
Comm. Delay 按鈕調(diào)用 ChangeDelayCount() 函數(shù),并將按鈕右側(cè)的整數(shù)作為參數(shù)。這可用于調(diào)整2-Wire接口的時序。
LED 按鈕啟用和禁用 AN3230 電路中顯示的指示 LED。選通使能使軟件在單字節(jié)和雙字節(jié)寫/讀功能之前將LED引腳設(shè)置為高電平,并在通信結(jié)束后將LED引腳設(shè)置為低電平。
“測試”按鈕執(zhí)行環(huán)回測試,確保當(dāng)SDA輸出設(shè)置為低電平時,SDA輸入讀數(shù)為低電平,同樣,對于高電平條件也是如此。它還測試LED引腳是否可以設(shè)置為低電平和高電平,暫停足夠長的時間,以便用戶看到LED閃爍然后熄滅。
上面列出的所有命令都在“狀態(tài)”窗口中提供用戶反饋。
結(jié)論
本應(yīng)用筆記演示了使用AN2所示的并行端口2-Wire電路以及“3230wire.c”文件中提供的源代碼對2-Wire器件進(jìn)行編程的簡便性。“2wire.c”中的例程執(zhí)行信令功能,使程序員能夠?qū)W⒂谡{(diào)整接口時序,并按照2-Wire器件數(shù)據(jù)手冊中概述的正確通信順序調(diào)用2-Wire例程。
審核編輯:郭婷
-
WINDOWS
+關(guān)注
關(guān)注
3文章
3526瀏覽量
88452 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6747瀏覽量
123204 -
源代碼
+關(guān)注
關(guān)注
96文章
2944瀏覽量
66673
發(fā)布評論請先 登錄
相關(guān)推薦
評論