2015-12-11 76 views
0

因此,我正在嘗試將一些用於從Arduino操作LCD的代碼轉換爲MSP430F5529的C代碼。液晶顯示器使用SPI進行通信,我很困惑這些代碼是如何導致Arduino與它正確通信的,並且希望有一些體面的Arduino經驗的人能夠解釋一些事情(我從未使用過)。我已經聯繫到整個程序上引擎收錄底,但是這是我關注的是,現在部分:幫助理解Arduino Mega上的串行通信(SPI)

void comm_out(char c) 
{ 
    int i; 
    digitalWrite(CS, LOW); 
    digitalWrite(AO, LOW); 
    for(i=0;i<8;i++) 
    { 
    if((c&0x80) == 0x80) 
    { 
     PORTA |= 0x80; 
     PORTA &= ~0x40; 
     PORTA |= 0x40; 
    } 
    else 
    { 
     PORTA &= ~0x80; 
     PORTA &= ~0x40; 
     PORTA |= 0x40; 
    } 
    c = c<<1; 
    } 
    digitalWrite(CS, HIGH); 
    digitalWrite(AO, HIGH); 
} 

所以我明白任何與設定一些數字引腳做的代碼在Arduino上(看起來他們只是輸出,因爲程序從未爲它們設置方向)高到低,因爲這是非常直接的,但我並不完全知道for循環在SPI方面做了什麼。

我得到該函數直接做什麼。它得到一個8位輸入,它被認爲是一個字符(儘管這實際上並不重要),並檢查第一位是1還是0.如果它是1,它將PORTA設置爲3個步驟:

1:1XXX XXXX 2:10XX XXXX 3:11XX XXXX

並且如果它是一個0,則它設置PORTA以下3個步驟:

1:0XXX XXXX 2:00XX XXXX 3:01xx xxxx

然後它將輸入移位,以便下一位最高並再次執行檢查,直到檢查全部8位。但我不知道這是怎麼做到的Arduino,使它正確地溝通液晶通過串行。從我檢查過的所有文檔中,我甚至無法確定PORTA是什麼。我曾假設它可能映射到某種模塊進行串行通信,但它看起來並不像它。

其他的事情,我感到困惑是在頂部

聲明
int SCLK = 28; // SCL signal connected to digital pin 28 of Arduino Mega  
int SI = 29; // SI signal connected to digital pin 29 of Arduino Mega  
int CS = 30; // CS signal connected to digital pin 30 of Arduino Mega  
int RES = 31; // RES signal connected to digital pin 31 of Arduino Mega  
int AO = 32; // A0 signal connected to digital pin 32 of Arduino Mega 

A0,RES和CS都很好,因爲這些是被設置爲僅下降了靜態的引腳,但SI應該作爲串行輸入,SCLK應該是SPI的時鐘信號,但據我所知,端口28和29中沒有任何特殊的和通用的I/O端口。

這裏是端口映射我指的是:http://pighixxx.com/atmega2560v3_0.pdf

這裏是鏈接到代碼的全部:http://pastebin.com/DxMGJZDu

任何意見或者說,什麼什麼?我正在努力弄清楚這一點。

+0

輕微:'igitalWrite(CS,LOW); digitalWrite(AO,LOW);' - >對我來說,這樣做是有道理的。在啓用芯片選擇之前建立端口A0。在芯片選擇之前和最終的CS取消選擇之後,還有'PORTA = 0'。 – chux

+0

我想你錯過了這個問題到底是什麼。我粘貼的代碼是由LCD製造商提供給我的,我正在將其轉換爲常規C,以用於MSP430。我需要幫助瞭解代碼的部分內容,除了我看過的文檔以外,我對Arduino的工作方式沒有任何意義, – oblivioncth

+0

我想你錯過了評論的內容。這本來就是對你遇到的問題的一個小小的思考,並幫助找出其他人可能會導致解決方案的潛在問題。如果這是一個解決方案,它將作爲答案發布。所以我認爲這是「任何事情?」的要求意味着不要對事情發表評論,但要給我答案。 – chux

回答

1

此代碼實現SPI與bit banging,其

是用於使用軟件而不是專用硬件串行通信的技術。軟件直接設置和樣品在微控制器引腳的狀態,並且是負責信號的所有參數:定時,水平同步等

SPI,接收裝置讀取數據線的狀態當時鍾線上出現某個邊沿時(上升或下降;任一種都可能,取決於器件)。

對於每一位,此代碼設置數據線的值,然後將時鐘線循環爲低電平和高電平。

+0

我意識到它是某種僞SPI,因爲它直接操縱CLK和數據信號,沒有像你說的硬件。感謝您的詳細解釋。 – oblivioncth

+0

這個SPI沒有什麼「僞」。硬件和軟件實現同樣正確。 –

+0

啊,我不知道這是足夠標準的做法,它被認爲是真正的SPI。儘管如此,由於數據仍然與時鐘信號同步地依次通過數據線,因此時鐘信號只能通過軟件進行操作,因此這種方法具有總體意義。得到它了。 – oblivioncth