2015-12-11 44 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